如何在OpenGL中将汽车朝向轮胎方向移动

时间:2016-10-19 02:19:37

标签: c++ opengl physics sdl-2 glm-math

我试图让汽车以半现实的方式在OpenGL中移动,汽车大致朝向前轮胎的方向(可以转动,就像真正的汽车轮胎一样)。

我不知道如何让汽车走向轮胎。我正在使用SDL2从键盘输入键盘(按键和键盘):

R> library(quantmod)
Loading required package: xts
Loading required package: TTR
Version 0.4-0 included new data defaults. See ?getSymbols.
R> IBM <- as.zoo(getSymbols("IBM"))  # convert from xts
R> class(IBM)
[1] "zoo"
R> tail(IBM)
           IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
2016-10-11   156.73   156.95  153.89    154.79    2901300       154.79
2016-10-12   154.97   154.97  153.08    154.29    2964000       154.29
2016-10-13   153.70   154.22  152.27    153.72    2909900       153.72
2016-10-14   154.47   155.53  154.09    154.45    4358200       154.45
2016-10-17   154.45   155.89  154.34    154.77    5890400       154.77
2016-10-18   150.02   151.00  147.79    150.72   12705700       150.72
R> as.data.frame(tail(IBM))
           IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
2016-10-11   156.73   156.95  153.89    154.79    2901300       154.79
2016-10-12   154.97   154.97  153.08    154.29    2964000       154.29
2016-10-13   153.70   154.22  152.27    153.72    2909900       153.72
2016-10-14   154.47   155.53  154.09    154.45    4358200       154.45
2016-10-17   154.45   155.89  154.34    154.77    5890400       154.77
2016-10-18   150.02   151.00  147.79    150.72   12705700       150.72
R> class(as.data.frame(tail(IBM)))
[1] "data.frame"
R> 

同样对于密钥发布:

R> IBM <- getSymbols("IBM")  # keep as xts
R> tail(data.frame(index(IBM), as.data.frame(IBM)))
           index.IBM. IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
2016-10-11 2016-10-11   156.73   156.95  153.89    154.79    2901300       154.79
2016-10-12 2016-10-12   154.97   154.97  153.08    154.29    2964000       154.29
2016-10-13 2016-10-13   153.70   154.22  152.27    153.72    2909900       153.72
2016-10-14 2016-10-14   154.47   155.53  154.09    154.45    4358200       154.45
2016-10-17 2016-10-17   154.45   155.89  154.34    154.77    5890400       154.77
2016-10-18 2016-10-18   150.02   151.00  147.79    150.72   12705700       150.72
R> 

这将在case SDLK_LEFT: car.setTireRotationSpeed(-TIRE_ROTATION_SPEED); break; case SDLK_RIGHT: car.setTireRotationSpeed(TIRE_ROTATION_SPEED); break; case SDLK_UP: car.setCarForwardSpeed(CAR_MOVEMENT_SPEED); break; case SDLK_DOWN: car.setCarForwardSpeed(-CAR_MOVEMENT_SPEED); break; 中设置变量,用于每一帧移动汽车/旋转汽车上的轮胎(因为chasis和轮胎是单独渲染的),以便顺利地进行。

我正在使用glm-math(即case SDLK_LEFT: if (car.getTireRotationSpeed() == -TIRE_ROTATION_SPEED) car.setTireRotationSpeed(0); break; case SDLK_RIGHT: if (car.getTireRotationSpeed() == TIRE_ROTATION_SPEED) car.setTireRotationSpeed(0); break; case SDLK_UP: if (car.getCarForwardSpeed() == CAR_MOVEMENT_SPEED) car.setCarForwardSpeed(0); break; case SDLK_DOWN: if (car.getCarForwardSpeed() == -CAR_MOVEMENT_SPEED) car.setCarForwardSpeed(0); break; car等)来完成转换,我使用着色器绘制和纹理。

每次渲染整辆汽车时,都会经过以下步骤:

glm:vec3

每个glm::mat4调用都会使用自定义void Car::Render(Shader & shader, Camera & camera) { incrementFrontTireRotation(getTireRotationSpeed()); move(); chasisTexture.Bind(0); shader.Update(getChasisTransform(), camera); chasisMesh.Draw(); tireTexture.Bind(0); shader.Update(getTireTransform(Car::FRONT_RIGHT), camera); tireMesh.Draw(); //Repeated for the other tires } 类,它只是shader.Update()Transformglm::translate的包装,并返回glm::rotate表示模型的矩阵变换,基于我指定的变换。

我遇到了glm::scale方法和glm::mat4方法。

incrementFrontTireRotation

move是一个void Car::incrementFrontTireRotation(float amount) { if (amount > 0) { if (frontTireRotation.y + amount <= MAX_FRONT_TIRE_TURNED) frontTireRotation.y += amount; else frontTireRotation.y = MAX_FRONT_TIRE_TURNED; } else if (amount < 0) { if (frontTireRotation.y + amount >= -MAX_FRONT_TIRE_TURNED) frontTireRotation.y += amount; else frontTireRotation.y = -MAX_FRONT_TIRE_TURNED; } if (carForwardSpeed != 0) carRotation += glm::vec3(0, -amount, 0); } ,用于计算前轮胎的旋转,因为它们可以左右转动。 frontTireRotation旨在成为汽车的轮换。

glm::vec3

我的目的是试着让汽车朝前轮胎面向的方向移动。我试图用carRotation向量来做这件事,但它有一些奇怪的结果。汽车确实转了,但是经过太多转弯后,汽车不再像轮胎指向那样移动。

我知道这很多。如果我需要澄清任何内容,请告诉我。

1 个答案:

答案 0 :(得分:3)

汽车的轮胎应该对齐,使得它们的轴在公共枢轴处相遇,如下所示:

Car tires

如您所见,两个前轮胎必须具有不同的角度。因此,处理转弯的最简单方法是考虑一个虚拟中心轮,其角度由转向变量控制。

然后,此转向可让您计算汽车必须移动的转弯半径。这取决于汽车的长度。给定此半径,您可以计算轴心点。然后,在更新汽车的位置和旋转时,您需要做的就是围绕枢轴旋转整个汽车。应该选择旋转角度,使得得到的圆弧段等于汽车在给定帧时间内的行进方式(即弧度为angle * r = velocity * tangle)。

当没有或很少转向时,必须小心。在这种情况下,转弯半径变为无限,您无法进行合理的旋转。在这种情况下切换到简单的翻译可以解决这个问题。