2010-05-03 49 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);