2011-12-15 8 views
7

Я довольно новичок в разработке игр и успешно смоделировал трехмерный ландшафт и имею камеру, способную свободно перемещаться в игровом мире, однако я столкнулся с проблемой что я не могу понять.Обращение с траффиком/боковым шагом в 3D-игре

В настоящее время, чтобы двигаться вперед/назад у меня есть методы следующим образом:

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); 
} 

Где Vector3 простой X, Y, Z-структура и степени в радианы:

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

К обрабатывая движение вперед, я просто помещаю положительный поплавок в аргумент и перемещаю назад отрицательный поплавок.

Это позволяет мне, конечно, двигаться вперед и назад - я также могу перемещаться вверх, изменяя положение pos.y позиции, однако я не могу понять, как двигаться влево/вправо.

листать x и z результаты у меня в состоянии шаг в сторону при условии, рыскания 360/0, 270, 180 или 90, однако в любом месте между ними углов приводит камеру вперед-SideStep/назад-SideStep или двигаться вперед/в обратном направлении.

Во всяком случае, это было беспокоит меня, так что я пытался найти решение на бумаге - это сработало:

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

Однако, в игре это точно так же, как и поменять местами x и z результаты.

Любая помощь будет принята с благодарностью; Я изо всех сил пытался найти что-нибудь в Интернете относительно этого, но, возможно, я просто искал неправильно!

ответ

6

Я не думаю, что вы можете просто поменять результаты x и z. Рассмотрим случай, когда cosYaw == sinYaw: их переворот приведет к тому же направлению, что и unflipped, что явно нежелательное поведение, потому что вы пытаетесь переместить вектор на 90 градусов, а не идти в одном направлении.

Вместо этого вы хотите сделать то же самое, что и вы, для MoveForward, сначала поверните свое рыскание на 90 градусов. Вы в основном разбиваете известную результирующую скорость на ее компоненты x и z, и вы можете это сделать, потому что знаете угол. Если вы считаете разницу в углу между движением вперед и обстрелом, это 90 градусов, поэтому просто вычтите или добавьте 90 градусов к вашему рывку, а затем используйте ту же математику.

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

Большое вам спасибо! – krslynx

+0

Отлично. Спасибо =] – Hobbes

 Смежные вопросы

  • Нет связанных вопросов^_^