2010-05-03 50 views
8

我试图显示其中可以自然通过拖动光标/触摸屏被旋转的视图中的对象。目前,我有X和Y对象的旋转这样在OpenGL相对旋转到视

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

我明白为什么这并不做我想做的事情(例如,如果你旋转它的权利180度,上下纺纱被扭转)。我无法弄清楚两个方向相对于观看者左右上下的方式。

我可以假设摄像机被固定,并且沿Z轴看。有任何想法吗?

+0

尼克 - 我有兴趣看到你为这个问题提出的课程 - 看起来你的Pastebin已经过期。谢谢 – Seidr 2010-09-09 08:34:51

+0

奇怪的是,我以为我会让我的贴子永远生活。当我今天晚些时候接近我的代码时,我会将它放在Github的要点中,并将其链接到此处。 – Nick 2010-09-09 10:44:51

+0

非常感谢Nick! :) – Seidr 2010-09-09 14:37:03

回答

7

最好的办法是实现一个基于Quaternion旋转。在四元数世界中,每次旋转时,它都将与您指定的轴对齐,而不受之前旋转的影响。这也是它不受Gimbal Lock影响的原因。

我发现这些网页实现四元数有所帮助:

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

+0

谢谢 - 我怀疑四元数的恐怖世界可能会涉及到这一点。我会报告结果。 – Nick 2010-05-04 15:37:13

+2

我会等待你的胜利。 – 2010-05-04 22:10:05

+0

成功!经过几次不同的操作四元数的尝试后,我发现它可以很好地创建一个表示当前鼠标/手指拖动的向量,然后计算出它作为旋转轴的直角。然后使用矢量的大小作为旋转角度,可以创建一个四元数。 如果有人对一些凌乱的Android代码很感兴趣,请告诉我。 谢谢Xavier。 – Nick 2010-05-06 22:51:10

1

我决定把我的DragControl类了下载,与四元数支持类一起。一旦你在某个对象上看到沿着Z轴的OpenGL画布,应该不费吹灰之力就行了。这只是当前普通的.java文件,没有构建的库。

DragControl完成几乎一切,包括手指甩,这样你就可以把你的对象与甩尾打转。

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

在活动设置:

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

当在一个循环中更新对象的旋转:

Quaternion rotation = dragControl.currentRotation(); 

如果你做任何修改凉爽我想看看他们。

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