2011-12-15 13 views
7

Tôi khá mới để phát triển trò chơi và đã mô hình thành công một địa hình 3D, và có một máy ảnh có thể tự do di chuyển trong thế giới trò chơi, nhưng tôi đã chạy vào một snag rằng tôi không thể tìm ra.Xử lý strafing/side bước trong một trò chơi 3D

Hiện nay, để tiến về phía trước/ngược tôi có phương pháp như sau:

void Player::moveForward(const float speed) 
{ 
    Vector3 pos = getPosition(); 

    float cosYaw = cosf(degreesToRadians(m_yaw)); 
    float sinYaw = sinf(degreesToRadians(m_yaw)); 
    pos.x += float(cosYaw)*speed; 
    pos.z += float(sinYaw)*speed; 

    setPosition(pos); 
} 

đâu Vector3 là một X đơn giản, Y, Z struct, và độ sang radian là:

inline float degreesToRadians(const float degrees) { 
    const float PIOver180 = 3.14159f/180.0f; 
    return degrees * PIOver180; 
} 

Để xử lý di chuyển về phía trước Tôi chỉ đơn giản là đặt một phao dương vào đối số, và để di chuyển ngược một phao âm.

này cho phép tôi dĩ nhiên di chuyển về phía trước và ngược - Tôi cũng có thể di chuyển lên trên bằng cách thay đổi pos.y của vị trí tuy nhiên tôi không thể tìm ra cách để bước bên/Strafe trái và phải.

Lật các số xz dẫn đến việc có thể thực hiện bước tiếp theo với điều kiện là 360/0, 270, 180 hoặc 90, tuy nhiên, bất kỳ vị trí nào giữa các góc này cũng khiến máy ảnh chuyển tiếp/lùi hoặc di chuyển về phía trước/ngược.

Dù sao, điều này đã làm phiền tôi vì vậy tôi đã cố gắng để tìm một giải pháp trên giấy - điều này làm việc:

inline float degreesToStrafe(const float degrees) 
{ 
    const float PIOver90 = 3.14159f/90.0f; 
    return degrees * PIOver90; 
} 

Tuy nhiên, trong trò chơi này là chính xác giống như trao đổi các xz kết quả.

Mọi trợ giúp sẽ được đánh giá cao; Tôi đấu tranh để tìm thấy bất cứ điều gì trên web liên quan đến điều này tuy nhiên nó có thể tôi đã chỉ tìm kiếm không chính xác!

Trả lời

6

Tôi không nghĩ bạn chỉ có thể trao đổi kết quả x và z. Hãy xem xét trường hợp cosyaw == sinYaw: lật chúng sẽ dẫn đến cùng một hướng như không được lật, đó rõ ràng là hành vi không mong muốn bởi vì bạn đang cố di chuyển vectơ 90 độ, không đi cùng một hướng.

Thay vào đó, bạn muốn làm điều tương tự mà bạn đang làm cho MoveForward, chỉ cần xoay yaw 90 độ trước. Về cơ bản, bạn đang phá vỡ vận tốc kết quả đã biết thành các thành phần x và z của nó, và bạn có thể làm điều này bởi vì bạn biết góc. Nếu bạn xem xét sự khác biệt về góc giữa di chuyển về phía trước và strafing, nó là 90 độ, vì vậy chỉ cần trừ hoặc thêm 90 độ vào hàm của bạn và sau đó sử dụng cùng một phép toán.

void Player::strafe(const float speed) 
{ 
    Vector3 pos = getPosition(); 

    float cosYaw = cosf(degreesToRadians(m_yaw - 90.f)); 
    float sinYaw = sinf(degreesToRadians(m_yaw - 90.f)); 
    pos.x += float(cosYaw)*speed; 
    pos.z += float(sinYaw)*speed; 

    setPosition(pos); 
} 
+0

Cảm ơn bạn rất nhiều! – krslynx

+0

Hoàn hảo. Thanks =] – Hobbes