我试图让汽车以半现实的方式在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()
,Transform
和glm::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
向量来做这件事,但它有一些奇怪的结果。汽车确实转了,但是经过太多转弯后,汽车不再像轮胎指向那样移动。
我知道这很多。如果我需要澄清任何内容,请告诉我。
答案 0 :(得分:3)
汽车的轮胎应该对齐,使得它们的轴在公共枢轴处相遇,如下所示:
如您所见,两个前轮胎必须具有不同的角度。因此,处理转弯的最简单方法是考虑一个虚拟中心轮,其角度由转向变量控制。
然后,此转向可让您计算汽车必须移动的转弯半径。这取决于汽车的长度。给定此半径,您可以计算轴心点。然后,在更新汽车的位置和旋转时,您需要做的就是围绕枢轴旋转整个汽车。应该选择旋转角度,使得得到的圆弧段等于汽车在给定帧时间内的行进方式(即弧度为angle * r = velocity * t
,angle
)。
当没有或很少转向时,必须小心。在这种情况下,转弯半径变为无限,您无法进行合理的旋转。在这种情况下切换到简单的翻译可以解决这个问题。