2012-03-01 207 views
1

我使用OpenGL,正是Cocos3d,在iPhone/iPad项目中显示地球仪。我希望用户能够用手指旋转地球仪。我得到的是2D(x/y)值,但是我得到了2D(x/y)的值,但是我不知道如何解决3轴的所有问题。但是我不知道如何解决3轴的所有问题。我如何在3D旋转中转换它们?二维手势/运动的3D旋转(OpenGL/Cocos3D)

回答

2

想象一下,在窗口的中心是接触窗口边缘的3d球体(而不是椭圆)。它位于屏幕空间中,而不是在世界空间中。 “屏幕空间”意味着如果您的窗口是640x480,则无论您的模型视图/投影矩阵如何,球体都位于x = 320,y = 240且半径为240(min(width,height)/2)。

当用户单击按下鼠标按钮时,他/她选择球体上的点。如果点击在该球体之外,则初始点移动到球体边界。我们称之为pointA。当用户拖动鼠标时,鼠标位置标记用户想要的初始点位置。我们称之为pointB

现在的球还是比较容易计算坐标3月1日给出二,因为R^2 = X^2+y^2+z^2所以,你可以计算出第三个坐标的原点(pointA)和第三坐标当前点(pointB)。现在使用两个点,可以计算从球面中心(O)到点(vectorOA = pointA - O; vectorOB = pointB - O)的两个向量。现在,由于您有两个向量,因此可以使用它们来计算旋转轴(使用交叉乘积= rotationAxis = normalize(vecOA x vecOB);)和旋转角度(使用归一化向量的点乘积上的acos = acos(dot(normalize(vecOA), normalize(vecOB)))。使用轴和角度,您可以在屏幕空间中创建旋转矩阵,然后将其转换为您想要的空间并应用于对象。

该技术通常被称为“轨迹球”。它已在Microsoft DirectX SDK的一些示例中使用,您应该能够在NVidia OpenGL SDK中的某处找到它。所以如果你不明白解释,我建议抓住sdk并调查任何允许你用鼠标旋转对象的例子。

+0

+1为轨迹球。用一些不错的图片解释:http://viewport3d.com/trackball.htm – 2012-03-01 19:10:25

0

一个简单的方法是简单地将围绕Y轴的旋转设置为translationInView x分量旋转,并将围绕X轴的旋转分量设置为translationInView y分量。由于旋转值以弧度表示,您可能必须将翻译除以某个数值。我通常发现为用户提供2个自由度是足够的,但如果您确实需要允许用户围绕z轴旋转,则可能需要考虑使用UIRotationGestureRecognizer来分别处理该情况。

CGPoint translation = [sender translationInView:self.view]; 
_rotationY = translation.x/100.0f; 
_rotationX = translation.y/100.0f;