GLM速度向量 – 模拟转向的基础math

更新 – 代码更新如下,但仍然需要帮助调整我的math。

我在屏幕上呈现一个代表汽车(或类似)的立方体。

立方体

使用投影/模型matrix和Glm我可以沿着轴向后移动它,然后向左或向右旋转它。

我在vectormath方面遇到了麻烦,无论目前的方向是哪个方向,立方体都向前移动。 (也就是说,如果我愿意的话,如果它向右旋转30度,当它向前移动时,它沿着一个新的轴向30度的角度行进)。

我希望我解释正确。

这就是我用glm来移动立方体的方法:

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:

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

我在哪里我的向量错了? 我想改变立方体(它所做的)的方向,然后向那个方向前进。

要使立方体向前移动,您需要find立方体的速度vector。 速度vector的方向就是旋转的角度。 然后简单地把它添加到位置;

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

你需要应用一定程度的物理。 至less你需要熟悉牛顿基本运动和欧拉积分的基础'p2 = p1 + v * t'和'v2 = v1 + a * t'方程。 然后,您可以使用像red3d的网站 (这不是车辆转向,但适用于一些想法)的algorithm逼近一些逼近。 目标是,不要将汽车左移,而是使用一个力(或者只是在不关心质量或表面摩擦力等其他力量的情况下改变加速度)运动的自然曲线。

请注意,你最终将不得不调整和尝试很多值来获得感觉良好的东西。 在AntTweakBar中进行实验时,有能力在运行时编辑参数,这是非常宝贵的。

实际的汽车物理是非常复杂的。 即使使用像Havok这样昂贵的中间件,你也需要很多时间,并且需要对物理仿真有很深的理解的人来模拟车轮,悬架,发动机驱动的加速,断裂,摩擦等等。游戏与汽车物理学,就像你在AAA级驾驶游戏(或大多数其他与战地或光晕或什么的车辆游戏)看到的。 上面的基础知识甚至没有接近于身体的准确性,不幸的是没有任何“基础math”的版本。