2014-02-26 149 views
1

當前狀態:OpenGLES20 - 旋轉矩陣螺釘運動 - 用角度旋轉視圖矩陣?

創建平截頭體,保存在mViewMatrix,還我有兩個四元數q,三個角度(偏航,側傾,俯仰例如),以及一個旋轉矩陣mRotationMatrix float數組 - 表示四元數以及角度的旋轉。

我想實現的是某種類型的增強現實效果。我目前應用mRotationMatrixmViewMatrix

Matrix.setLookAtM(mTmpMatrix, 0, // mViewMatrix 
      mCameraPosition[0], mCameraPosition[1], mCameraPosition[2], // eye 
      mTargetRotPosition[0], mTargetRotPosition[1], mTargetRotPosition[2], 
      0, 1, 0); // up 

    Matrix.setIdentityM(mViewMatrix, 0); 
    Matrix.multiplyMM(mViewMatrix, 0, mRotationMatrix, 0, mTmpMatrix, 0); 

該處理的整個旋轉,向上矢量爲好,這樣旋轉工作正常。但是,由於旋轉矩陣來自設備的傳感器,旋轉矩陣就是錯誤的軸線。

作爲參考,這個形象應該幫助:

enter image description here

方案1: 偏航:向北指點,這是0.1 間距:0 卷:0

相機是向右看,但是y是正確的。

如果我現在增加間距,即拿起設備,相機現在移動到右側,而不是仰視。

如果我增加偏航,攝像頭向上移動,而不是向正確的。

如果我增加滾動,奇怪的轉換髮生。

在視頻中,我執行順序的變動。指南針也顯示正確的動作,只是OpenGL相機的轉換被擰緊了。

視頻:Sample screenrecord video

目前,我使用下面的代碼來獲取旋轉矩陣,以及俯仰/滾動/偏航:

 switch (rotation) { 
      case Surface.ROTATION_0: 
       mRemappedXAxis = SensorManager.AXIS_MINUS_Y; 
       mRemappedYAxis = SensorManager.AXIS_Z; 
       break; 

      case Surface.ROTATION_90: 
       mRemappedXAxis = SensorManager.AXIS_X; 
       mRemappedYAxis = SensorManager.AXIS_Y; 
       break; 

      case Surface.ROTATION_180: 
       mRemappedXAxis = SensorManager.AXIS_Y; 
       mRemappedYAxis = SensorManager.AXIS_MINUS_Z; 
       break; 

      case Surface.ROTATION_270: 
       mRemappedXAxis = SensorManager.AXIS_MINUS_X; 
       mRemappedYAxis = SensorManager.AXIS_MINUS_Y; 
       break; 
     } 

     float[] rotationMatrix = new float[16]; 
     float[] correctedRotationMatrix = new float[16]; 
     float[] rotationVector = new float[]{x, y, z}; // from sensor fusion 
     float[] orientationVals = new float[3]; 
     SensorManager.getRotationMatrixFromVector(rotationMatrix, rotationVector); 
     SensorManager.remapCoordinateSystem(rotationMatrix, mRemappedXAxis, mRemappedYAxis, correctedRotationMatrix); 
     SensorManager.getOrientation(correctedRotationMatrix, orientationVals); 

我已經嘗試了一些其他重映射-combinations,但他們都不似乎在運動翻譯去改變什麼..

我的另一個想法是旋轉我使用的setLookAtM由自己的載體。但我不知道我應該如何使用向上的向量。

如果有人能夠向我指出如何處理旋轉的方向,那麼我執行的動作將被正確解析,否則我應該如何在OpenGL中使用裸角度來做到這一點, d感恩。

+0

我最近也遇到類似的問題。 當我通過觸摸屏幕旋轉物體時,旋轉軸也旋轉了。現在旋轉會變得很奇怪。 如果這是你的問題是..我可以告訴你我是如何解決這個問題的。 這是問題嗎? – umerbanday

+0

您將設備參考框架中的x,y,z向量重新映射到您的應用參考框架的想法是正確的。我們建議您繪製兩個參考框架並計算從一個到另一個的旋轉,而不是通過實驗交換這些向量。然後簡單地將設備讀數乘以矩陣,將它們放入您的應用參考框架中。 – marcv81

+0

@umerbanday我不確定,但是如果你可以發佈你的解決方案,我會很高興,讓我給它一個鏡頭。 – damian

回答

0

以我的情況下,我用於計算增量旋轉增量(角度)每當手指在屏幕上移動的時間。從這個增量旋轉角度,我創建了一個臨時旋轉矩陣。然後,我用我的整體旋轉矩陣(歷史旋轉矩陣與所有以前的增量旋轉)與此相乘,最後在我的繪製方法中使用此整體旋轉矩陣。

問題是我在POST MULTIPLYING增量旋轉與我的整體旋轉,這意味着...我的最新旋轉將應用於對象的第一個和最古老的(第一)旋轉將應用到最後。

這是搞砸了一切。

該解決方案很簡單,而不是後乘法,我預增加了我的整體旋轉矩陣的增量旋轉。我的旋轉現在是正確的順序,一切工作正常。

希望這會有所幫助。

這裏是我從中學到的東西。檢查這個問題。 「9.070如何將對象轉換爲固定座標系而不是對象的本地座標系?」 http://www.opengl.org/archives/resources/faq/technical/transformations.htm#tran0162

+0

感謝您的提示。我不確定這是否是解決方案,因爲我不是旋轉對象本身,而是旋轉視圖矩陣,並且我不再旋轉「再次」 - 我總是從我的lookAt函數中獲取默認視圖矩陣,並且用給定的旋轉矩陣旋轉它。如果我正確理解鏈接,只有在旋轉一個對象並保存旋轉後的矩陣時纔會發生這種情況 - 並嘗試再次旋轉它? – damian

+0

那麼建議使用增量旋轉,因爲在每次計算整個旋轉的情況下,旋轉的順序(例如沿着x..y沿着y..etc)可能會搞砸。 – umerbanday

+0

你有什麼建議,我怎麼能做到這一點,因爲我只能得到整個設備旋轉的四元數/旋轉矩陣? – damian