2010-07-12 25 views
0

我正嘗試使用iPhone/iPod加速來直接操作3D對象。爲此,我一直在尋找很多東西(歐拉角,四元數等)。使用iPhone/iPod Touch加速旋轉3D對象

我使用OpenSG,在那裏我有一個3D環境,並希望操縱某個對象(只是在所有可能的iPhone/iPod的自由度的使用只有加速旋轉)。

所以,我想弄清楚這個問題的解決方案,但它仍然沒有預期的結果,並在某些角度得到一些奇怪的旋轉。

誰能告訴我什麼,我做錯了什麼?或者,有沒有更好的方法做到這一點,而不使用四元數?

加速度變量是一個Vec3f,其中包含來自iPhone/iPod的加速度計值,它使用低通濾波器進行濾波。

acceleration.normalize(); 
Vec3f reference = OSG::Vec3f(0, 0, 1); 
OSG::Vec3f axis = acceleration.cross(reference); 
angle = acos(acceleration.dot(reference)); 
OSG::Quaternion quat; 
quat.setValueAsAxisRad(axis, angle); 

此代碼後,我用四元數更新我的場景節點。

+0

我將參考向量更改爲(0,-1,0),但我認爲這不會產生變化,並且似乎正在做我所需要的。但是當角度爲180度時,物體在一個軸上進行一些旋轉並返回到相同的位置。我怎樣才能解決這個奇怪的旋轉? – PLinhol 2010-07-13 01:50:32

+0

我覺得現在的問題是在180度的角度__acos__。如果我可以使用__atan2__,它可能會被修復。我一直在審查我的三角,並沒有找到辦法做到這一點... 有誰知道如何解決這個問題?或者,有沒有更好的方法來做到這一點? – PLinhol 2010-07-13 13:32:57

+0

我似乎是某種萬向節鎖。但這不應該發生,對吧? 任何人都可以指出我解決這個問題的辦法嗎? – PLinhol 2010-07-13 22:04:04

回答

1

有史以來最好的布拉德拉森在寫他的Moleculs應用程序時發佈了一個很好的描述,

他對達到爲旋轉方法如下:

GLfloat currentModelViewMatrix[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, currentModelViewMatrix); 
glRotatef(xRotation, currentModelViewMatrix[1], currentModelViewMatrix[5], currentModelViewMatrix[9]); 
glGetFloatv(GL_MODELVIEW_MATRIX, currentModelViewMatrix); 
glRotatef(yRotation, currentModelViewMatrix[0], currentModelViewMatrix[4], currentModelViewMatrix[8]); 

但這是否是有幫助的,我不能推薦這個博客條目足夠Brad learns a lesson or two

編輯補充一點,我可能誤解了問題,但會保留在這裏,因爲它可能會幫助人們搜索類似的關鍵字。

+0

好的,謝謝你試試。 – PLinhol 2010-07-13 01:12:37

+0

+1表示「曾經美妙的布拉德拉森」。他太棒了。來自平行世界的知識「實體」! – SpaceDog 2011-03-03 23:23:44

3

我想做同樣的事情,只是試了一下,我從來沒有與加速度計扮演周圍,它似乎像它應該是可能的。

的問題是,如果你在一個表中設置你的iPhone,然後慢慢靠近旋轉它,並觀察加速度計的輸出,它基本上是沒有改變(一個比重下降)。如果您在四個邊的任何一個上向上/向下傾斜,您將看到輸出發生變化。

換句話說,你知道你的桌面傾斜上/下或左/右,但你不能告訴你是紡紗它。因此,您可以將此傾斜映射到3D對象的兩個旋轉。

你也許可以使用指南針的水平旋轉,我不能嘗試,因爲我是在Unity遊戲引擎原型,它似乎並不支持指南針呢。