我在天空盒内编码相机,相机应该围绕模型旋转(模型位于天空盒的中间向下(0; 0; -1),尽管将来可能会改变)< / p>
我有2个角度+ 1个距离:
float theta = m_ry; //m_ry & m_rz are variables incrementing themselves when user
float phi = m_rz; //click a button to rotate the camera
float dist = m_tra //m_tra is the distance from camera to the model
3个载体:
glm::vec3 eye, center, up;
up = glm::vec3(0.0f, 1.0f, 0.0f);
center = glm::vec3(0.0f, 0.0f, -1.0f);
这是我设置相机坐标的方式:
eye.x = dist * cosf(theta) * cosf(phi);
eye.y = dist * cosf(theta) * sinf(phi);
eye.z = dist * sinf(theta) - 1; // -1 so the camera is in front of my model
然后我就做了一个:
modelviewMatrix = glm::lookAt(eye, center, up);
glLoadMatrixf(glm::value_ptr(modelviewMatrix);
旋转在开始时效果很好,但当我来到m_rz角度时> PI / 2,x变为负数,视图完全相反:
|======| |======|
| | | |
|--* | becomes => | *--|
| | "--*" is my model | |
|______| |______|
任何想法都可以让360°旋转效果良好而不会反转?
答案 0 :(得分:0)
通过这些公式,您将Z轴定义为倾斜参考,方位角定义为xy平面中的角度。这真的是你想要的吗?在GL中,“默认”向上矢量是+ y轴,并且您还将其定义为lookAt函数的向上矢量,因此您可能需要考虑切换眼睛的y和z坐标的方程式。
这样,phy将成为围绕物体旋转的角度,通过改变θ,您可以将眼睛移动到物体下方或上方。想想改变这样的。你在美国以上的太空。通过将theta增加到pi / 2,你可以改变你对北极的位置。如果你超过pi / 2或更多,你会发现自己在俄罗斯以上的某个地方。当你在美国之上时,欧洲就在你的右边。现在就在你的左边。这只是物理定律:)
这就是你的对象“逆转”的原因。这是正常的,只是当你在它周围移动时,但是当你穿过两极时。所以,试试这些方程式。 (我不确定你的是不是很糟糕,虽然他们看起来有点逆,也许他们没问题,只是转换轴)。
eye.x = dist * sin(theta) * cosf(phi);
eye.y = dist * cosf(theta) - 1;
eye.z = dist * sinf(theta) * cosf(phi);