1

我在天空盒内编码相机,相机应该围绕模型旋转(模型在天空盒的中间向下(0;0;-1),尽管它可能会在未来发生变化)

我有 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° 旋转没有反向效果很好吗?

4

1 回答 1

0

通过这些公式,您将 Z 轴定义为倾斜参考,并将方位角定义为 xy 平面中的角度。这真的是你想要的吗。在 GL 中,“默认”向上向量是 +y 轴,并且您还将其定义为 lookAt 函数的向上向量,因此您可能需要考虑切换眼睛的 y 和 z 坐标的方程。

这样,phy 将是围绕对象旋转的角度,通过改变 theta,您可以将您的眼睛移动到对象下方或上方。想想像这样改变theta。你在美国上空。通过将 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);
于 2012-10-02T12:41:15.350 回答