我使用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. UIImageView的旋轉手勢
- 3. 拖動和旋轉手勢在iPad上
- 4. IKImage手勢縮放旋轉
- 5. 3D圍繞原點的姿勢旋轉
- 6. 如何從滑動手勢確定3D對象的旋轉角度?
- 7. 3D手勢識別
- 8. 手勢 - 當手指運動
- 9. C#,旋轉二維數組
- 10. C二維數組旋轉
- 11. 優化二維旋轉
- 12. 二維旋轉陣列
- 13. 的UIImageView手勢(縮放,旋轉)問題
- 14. iPhone上的雙指旋轉手勢?
- 15. Swift - 旋轉90度的手勢和旋轉增量
- 16. 用觸摸手勢旋轉UIImageView - iphone dev
- 17. 在Windows Phone中旋轉手勢
- 18. 圍繞手勢點旋轉/縮放
- 19. 用戶手勢在iOS6上旋轉MapView
- 20. 如何跟蹤旋轉手勢
- 21. Android-用單指手勢旋轉圖像
- 22. WPF 3d旋轉動畫
- 23. 旋轉手勢結束後繼續旋轉圖像
- 24. NSUndoManager使用旋轉手勢撤消UIImage旋轉
- 25. 沿手指旋轉3D立方體android
- 26. 使用手勢旋轉垂直拖動的橢圓
- 27. 貓頭鷹旋轉木馬是不平滑的滑動手勢
- 28. 轉換3D - >二維座標
- 29. 轉換3D陣列以二維數組
- 30. 旋轉整數的二維數組
+1爲軌跡球。用一些不錯的圖片解釋:http://viewport3d.com/trackball.htm – 2012-03-01 19:10:25