【问题标题】:Rotating in OpenGL relative to the viewport在 OpenGL 中相对于视口旋转
【发布时间】:2010-05-03 13:51:54
【问题描述】:

我正在尝试在视图中显示一个可以通过拖动光标/触摸屏自然旋转的对象。目前我有一个像这样的对象的 X 和 Y 旋转

glRotatef(rotateX, 0f, 1f, 0f); // Dragging along X, so spin around Y axis
glRotatef(rotateY, 1f, 0f, 0f);

我明白为什么这不能达到我想要的效果(例如,如果您将其旋转 180 度,则上下旋转会反转)。我只是想不出一种方法让两个方向相对于观察者保持左右和上下。

我可以假设相机是固定的并且沿着 Z 轴看。有任何想法吗?

【问题讨论】:

  • Nick - 我很想看看你为这个问题想出的结果类 - 你的 Pastebin 似乎已经过期了。谢谢
  • 奇怪,我以为我会将我的粘贴设置为永远存在。今天晚些时候,当我接近我的代码时,我会将它放在 Github gist 中并在此处链接。
  • 我们开始吧。那里也有一个 Vector3 类。 gist.github.com/572585
  • 天哪,谢谢!刚刚设法解决了我使用这些课程一天左右的问题。如果我能再次“提出”这个问题,我会的!
  • 没问题 - 请参阅下面的附加答案,了解包含我的拖动处理类的项目。

标签: opengl rotation


【解决方案1】:

最好的办法是实现基于Quaternion 的轮换。在四元数世界中,每次旋转时,它都会与您指定的轴对齐,不受之前旋转的影响。这也是它不受云台锁影响的原因。

我发现这些页面有助于实现四元数:

祝你好运。我敢肯定还有其他解决方案,但这是您可以拥有的最干净的解决方案之一。

【讨论】:

  • 谢谢 - 我怀疑可怕的四元数世界可能与此有关。我会报告结果。
  • 成功!在操作四元数的几次不同尝试之后,我发现创建一个表示当前鼠标/手指拖动的矢量效果很好,然后计算它的直角作为旋转轴。然后使用向量的大小作为旋转角度,您可以创建一个四元数。如果有人对执行此操作的一些凌乱的 Android 代码非常感兴趣,请告诉我。谢谢泽维尔。
  • 啊,是的,聪明的主意。您如何计算“直角”?您是否将 x、y、z 旋转到 y、z、x 并将第一个值设置为否定? =]。我很高兴你有一些工作。我得花点时间研究一下 Android 应用程序的制作。我仍在研究 OpenGL 的野兽。
  • 我只是利用拖拽的 x 和 y 来创建一个向量 (-y,-x,0) - 然后在将其归一化以放入四元数之前获取它的大小。我在一些网站上发现了 Quaternion 的 Java 实现,因为 Android 运行时库不包含诸如 Quat4f 之类的 Java3D 类。
  • 对,您只需要使用 x 和 y,因为屏幕位于 xy 平面上。不错。
【解决方案2】:

解决了!将 xAngle 和 yAngle 添加到当前矩阵。

Matrix.rotateM(matrix, 0, xAngleADD, matrix[1], matrix[5], matrix[9]);
Matrix.rotateM(matrix, 0, yAngleADD, matrix[0], matrix[4], matrix[8]);
gl.glMultMatrixf(matrix, 0);

【讨论】:

    【解决方案3】:

    我决定将我的 DragControl 类连同四元数支持类一起下载。一旦你有一个 OpenGL 画布沿 Z 轴查看某个对象,就应该不费吹灰之力。它目前只是普通的 .java 文件,没有构建库。

    DragControl 几乎可以处理所有事情,包括手指挥动,因此您可以通过轻弹发送对象旋转。

    http://github.com/halfninja/android-dragcontrol3d

    在活动设置中:

    dragControl = new DragControl();
    glView.setOnTouchListener(dragControl);
    

    循环更新对象旋转时:

    Quaternion rotation = dragControl.currentRotation();
    

    如果你做了任何很酷的修改,我希望看到它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 2016-07-22
      相关资源
      最近更新 更多