在3D环境中旋转对象(使用C ++和OpenGL)

时间:2017-02-26 14:12:39

标签: c++ opengl rotation trigonometry

我试图在用OpenGL编写的程序中旋转对象。

此对象在3D空间中传播。

Y轴上的旋转角度(偏航)计算如下:

facingAngle = -atan2(heading.y, heading.x);

...我将它添加到模型中:

glm::mat4 model;
model = glm::translate(model, position);
model = glm::rotate(model, facingAngle, glm::vec3(0.0f, 1.0f, 0.0f));

然后我希望这个物体朝着它前进的方向倾斜,就像一个循环或飞机一样(滚动)。

我已经尝试了无数的选项来计算这个值,但没有任何运气来找到我真正想要的东西。

如果我这样做,我到目前为止最好:

leaningAngle = glm::sqrt(squaredLength(steeringForce)) / gravity;

(函数squaredLength执行以下操作:return ( vector.x * vector.x + vector.y * vector.y );

这个问题的主要问题在于它始终将对象倾斜到一个给定的方向(因此,在一半的情况下,它向外倾斜而不是向内倾斜)。但是,当我想根据对象的前进位置使用*1*-1修改此值时,我会得到一个奇怪的行为,我认为这是Gimbal锁定。

我想要的是一个简单的等式,它会给我一个角度来在实际值(90-90度)之间滚动对象,并且应该计算角度的权重根据当前的转向力(转弯越尖锐,倾斜角越大)。

最终代码应如下所示:

glm::mat4 model;
model = glm::translate(model, position);
model = glm::rotate(model, facingAngle, glm::vec3(0.0f, 1.0f, 0.0f));
model = glm::rotate(model, leaningAngle, glm::vec3(1.0f, 0.0f, 0.0f));

0 个答案:

没有答案