我使用OpenGL,正是Cocos3d,在iPhone/iPad项目中显示地球仪。我希望用户能够用手指旋转地球仪。我得到的是2D(x/y)值,但是我得到了2D(x/y)的值,但是我不知道如何解决3轴的所有问题。但是我不知道如何解决3轴的所有问题。我如何在3D旋转中转换它们?二维手势/运动的3D旋转(OpenGL/Cocos3D)
回答
想象一下,在窗口的中心是接触窗口边缘的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并调查任何允许你用鼠标旋转对象的例子。
一个简单的方法是简单地将围绕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;
- 1. UIScrollView上的旋转手势
- 2. 拖动和旋转手势在iPad上
- 3. 3D手势识别
- 4. iPhone上的双指旋转手势?
- 5. 的UIImageView手势(缩放,旋转)问题
- 6. C#,旋转二维数组
- 7. 优化二维旋转
- 8. C二维数组旋转
- 9. 二维旋转阵列
- 10. 如何跟踪旋转手势
- 11. 围绕手势点旋转/缩放
- 12. 用触摸手势旋转UIImageView - iphone dev
- 13. 旋转手势结束后继续旋转图像
- 14. NSUndoManager使用旋转手势撤消UIImage旋转
- 15. WPF 3d旋转动画
- 16. 猫头鹰旋转木马是不平滑的滑动手势
- 17. 转换3D - >二维坐标
- 18. 旋转整数的二维数组
- 19. Starling 3D旋转
- 20. JavaFX的3D旋转
- 21. UIKit动态与平移,旋转和捏手势
- 22. 3D翻转/旋转柔性动作3
- 23. 如何旋转二维字节数组?
- 24. 图片库变焦和二维旋转
- 25. 二维欧几里德矢量旋转
- 26. UIView的真实3D旋转动画
- 27. 2在Android手指旋转手势监听器
- 28. javafx 3d Meshview旋转
- 29. 3D旋转X轴
- 30. CSS 3D框旋转
+1为轨迹球。用一些不错的图片解释:http://viewport3d.com/trackball.htm – 2012-03-01 19:10:25