2011-12-15 15 views
7

Soy bastante nuevo en el desarrollo de juegos y he modelado con éxito un terreno en 3D, y tengo una cámara que puede moverse libremente en el mundo del juego, sin embargo me he encontrado con un problema que no puedo descifrarManejo de ametrallamiento/paso lateral en un juego 3D

Actualmente, para mover hacia delante/hacia atrás tengo métodos como sigue:

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

Dónde Vector3 es un simple X, Y, Z struct, y grados a radianes es:

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

Para manejar hacia adelante simplemente coloco un flotador positivo en el argumento, y hacia atrás un flotante negativo.

Esto me permite, por supuesto, avanzar y retroceder - También puedo mover hacia arriba cambiando el pos.y de la posición, sin embargo, no puedo entender cómo dar un paso lateral/atacar a la izquierda y a la derecha.

voltear los resultados x y z en mí ser capaz de paso lateral proporcionado la guiñada es 360/0, 270, 180 o 90 sin embargo en cualquier lugar entre ellos ángulos hace que la cámara con visión de paso lateral/hacia atrás-sidestep o mover hacia delante/hacia atrás.

De todos modos, esto me había estado molestando así que trató de encontrar una solución en el papel - esto funcionó:

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

Sin embargo, en este juego es exactamente el mismo que el intercambio de los resultados x y z.

Cualquier ayuda sería muy apreciada; ¡Luché para encontrar algo en la web con respecto a esto, sin embargo, es posible que solo estuviera buscando incorrectamente!

Respuesta

6

No creo que pueda cambiar los resultados xyz. Considere el caso donde cosYaw == sinYaw: voltearlos dará como resultado la misma dirección que la que no se desenrolló, que obviamente es un comportamiento no deseado porque está tratando de mover el vector 90 grados, no en la misma dirección.

En su lugar, desea hacer lo mismo que está haciendo para MoveForward, simplemente gire la orientación 90 grados antes. Básicamente estás descomponiendo la velocidad resultante conocida en sus componentes x y z, y puedes hacerlo porque conoces el ángulo. Si considera la diferencia en el ángulo entre avanzar y ametrallamiento, es de 90 grados, por lo que resta o agrega 90 grados a su guiñada y luego usa la misma matemática.

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

¡Muchas gracias! – krslynx

+0

Perfecto. Gracias =] – Hobbes

Cuestiones relacionadas