OpenGL ES Camera自身反转(使用球面坐标计算错误?)

时间:2012-10-02 09:50:55

标签: opengl-es

我在天空盒内编码相机,相机应该围绕模型旋转(模型位于天空盒的中间向下(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°旋转效果良好而不会反转?

1 个答案:

答案 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);