2012-03-01 73 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;