我正在尝试在视图中显示一个可以通过拖动光标/触摸屏自然旋转的对象。目前我已经有像这样的对象的X和Y旋转
glRotatef(rotateX, 0f, 1f, 0f); // Dragging along X, so spin around Y axis
glRotatef(rotateY, 1f, 0f, 0f);
我理解为什么这不能做我想做的事情(例如,如果你将它旋转180度,上下旋转反转)。我无法弄清楚两个方向相对于观众保持左右和上下的方式。
我可以假设相机是固定的并且沿着Z轴看。有任何想法吗?
答案 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();
如果你做了任何很酷的修改,我希望看到它们。