Vectores de velocidad GLM – Matemáticas básicas para simular la dirección

ACTUALIZACIÓN – Código actualizado a continuación, pero aún necesito ayuda para ajustar mis cálculos.

Tengo un cubo renderizado en la pantalla que representa un automobile (o similar).

cubo

Usando matrices de Proyección / Modelo y Glm, puedo moverlo hacia atrás y cuarto a lo largo de los ejes y rotarlo hacia la izquierda o hacia la derecha.

Estoy teniendo problemas con el vector matemático para hacer que el cubo se mueva hacia adelante sin importar en qué dirección esté su orientación actual. (es decir, si quisiera, si se gira 30 grados hacia la derecha, cuando se mueve hacia delante, viaja a lo largo del ángulo de 30 grados en un nuevo eje).

Espero haber explicado eso correctamente

Esto es lo que he logrado hacer hasta ahora en términos de usar glm para mover el cubo:

glm::vec3 vel; //velocity vector void renderMovingCube(){ glUseProgram(movingCubeShader.handle()); GLuint matrixLoc4MovingCube = glGetUniformLocation(movingCubeShader.handle(), "ProjectionMatrix"); glUniformMatrix4fv(matrixLoc4MovingCube, 1, GL_FALSE, &ProjectionMatrix[0][0]); glm::mat4 viewMatrixMovingCube; viewMatrixMovingCube = glm::lookAt(camOrigin, camLookingAt, camNormalXYZ); vel.x = cos(rotX); vel.y=sin(rotX); vel*=moveCube; //move cube ModelViewMatrix = glm::translate(viewMatrixMovingCube,globalPos*vel); //bring ground and cube to bottom of screen ModelViewMatrix = glm::translate(ModelViewMatrix, glm::vec3(0,-48,0)); ModelViewMatrix = glm::rotate(ModelViewMatrix, rotX, glm::vec3(0,1,0)); //manually turn glUniformMatrix4fv(glGetUniformLocation(movingCubeShader.handle(), "ModelViewMatrix"), 1, GL_FALSE, &ModelViewMatrix[0][0]); //pass matrix to shader movingCube.render(); //draw glUseProgram(0); } 

input de keyboard:

 void keyboard() { char BACKWARD = keys['S']; char FORWARD = keys['W']; char ROT_LEFT = keys['A']; char ROT_RIGHT = keys['D']; if (FORWARD) //W - move forwards { globalPos += vel; //globalPos.z -= moveCube; BACKWARD = false; } if (BACKWARD)//S - move backwards { globalPos.z += moveCube; FORWARD = false; } if (ROT_LEFT)//A - turn left { rotX +=0.01f; ROT_LEFT = false; } if (ROT_RIGHT)//D - turn right { rotX -=0.01f; ROT_RIGHT = false; } 

¿Dónde me estoy equivocando con mis vectores? Me gustaría cambiar la dirección del cubo (que sí lo hace), pero luego avanzar en esa dirección.

Para hacer que el cubo avance, necesitas encontrar el vector de velocidad de los cubos. La dirección del vector de velocidad es simplemente el ángulo de rotation. Entonces simplemente agrégalo a la position;

 //pseudocode vector velocity(cos(rotX),sin(rotX); //assume rotX converted to radians velocity*=SPEED_PER_FRAME;//SPEED_PER_FRAME is a scalar (might be moveCube) if (FORWARD) //W - move cube along zAxis positive { globalPos += velocity; BACKWARD = false; } if (BACKWARD) //S- move cube along zAxis negative { globalPos.z -= velocity; FORWARD = false; } 

Necesitas aplicar algún nivel de física. Por lo less, debe familiarizarse con el movimiento newtoniano básico y las integraciones de Euler de las ecuaciones base 'p2 = p1 + v * t' y 'v2 = v1 + a * t'. A continuación, puede aplicar algunas aproximaciones de fuerzas utilizando algorithms como los que se encuentran en el sitio de networking3d (que no se trata de la dirección del vehículo, pero se aplica con algo de reflexión). El objective es que no mueva el automobile hacia la izquierda, sino que aplica una fuerza (o simplemente cambie la aceleración si no le importa la masa u otras fuerzas como la fricción superficial) que hace que el automobile se quede con el time, lo que da como resultado curva natural al movimiento.

Tenga en count que terminará teniendo que retocar y experimentar mucho con los valores para get algo que se sienta bien. Tener la capacidad de editar parameters a los algorithms en time de ejecución mientras experimentas con AntTweakBar será invaluable.

La física del automobile real es increíblemente complicada. Incluso con un middleware costoso como Havok, vas a necesitar mucho time y alguien con una comprensión muy profunda de la simulación física para simular ruedas, suspensión, aceleración impulsada por el motor, rotura, fricción, etc. para get un juego con la física del coche como se ve en los juegos de conducción AAA (o la mayoría de los otros juegos con vehículos como Battlefield o Halo o lo que sea). Lo básico anterior ni siquiera está cerca de ser físicamente preciso y simplemente no hay ninguna versión de "matemáticas básicas" que, desafortunadamente.