我试图在用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));