【问题标题】:OpenGL ES Camera reverse itself (bad calculation with spherical coordinates ?)OpenGL ES Camera 反转自身(使用球坐标进行错误计算?)
【发布时间】:2012-10-02 09:50:54
【问题描述】:

我正在天空盒内编写相机,相机应该围绕模型旋转(模型位于天空盒的中间向下 (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° 旋转没有反向效果吗?

【问题讨论】:

    标签: opengl-es


    【解决方案1】:

    通过这些公式,您将 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);
    

    【讨论】:

    • 它不适用于您的坐标:s 我找到了解决我的问题的方法,将向上向量设置为 (0;0;1) 而不是 (0;1;0)
    • 嗯,应该和切换那些方程一样。很高兴你找到了解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多