在OpenGL中相对于视口旋转

时间:2010-05-03 13:51:55

标签: opengl rotation

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

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

我理解为什么这不能做我想做的事情(例如,如果你将它旋转180度,上下旋转反转)。我无法弄清楚两个方向相对于观众保持左右和上下的方式。

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

3 个答案:

答案 0 :(得分:7)

您最好的选择是实施基于Quaternion的轮播。在四元数世界中,每次旋转时,它都将与您指定的轴轴对齐,而不受先前旋转的影响。这也是为什么它没有受到万向节锁的影响。

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

祝你好运。我确信还有其他解决方案,但这个解决方案是您可以拥有的最清洁的解决方案之一。

答案 1 :(得分: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);

答案 2 :(得分:1)

我决定将我的DragControl类与Quaternion支持类一起下载。一旦你有一个沿着Z轴看某个对象的OpenGL画布,就应该把它放进去。这只是普通的.java文件,没有内置的库。

DragControl可处理几乎所有内容,包括手指甩动,因此您可以通过轻弹将对象旋转。

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

在活动设置中:

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

在循环中更新对象旋转时:

Quaternion rotation = dragControl.currentRotation();

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