當前狀態:OpenGLES20 - 旋轉矩陣螺釘運動 - 用角度旋轉視圖矩陣?
創建平截頭體,保存在mViewMatrix
,還我有兩個四元數q
,三個角度(偏航,側傾,俯仰例如),以及一個旋轉矩陣mRotationMatrix
float數組 - 表示四元數以及角度的旋轉。
我想實現的是某種類型的增強現實效果。我目前應用mRotationMatrix
到mViewMatrix
:
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);
該處理的整個旋轉,向上矢量爲好,這樣旋轉工作正常。但是,由於旋轉矩陣來自設備的傳感器,旋轉矩陣就是錯誤的軸線。
作爲參考,這個形象應該幫助:
方案1: 偏航:向北指點,這是0.1 間距:0 卷:0
相機是向右看,但是y是正確的。
如果我現在增加間距,即拿起設備,相機現在移動到右側,而不是仰視。
如果我增加偏航,攝像頭向上移動,而不是向正確的。
如果我增加滾動,奇怪的轉換髮生。
在視頻中,我執行順序的變動。指南針也顯示正確的動作,只是OpenGL相機的轉換被擰緊了。
目前,我使用下面的代碼來獲取旋轉矩陣,以及俯仰/滾動/偏航:
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感恩。
我最近也遇到類似的問題。 當我通過觸摸屏幕旋轉物體時,旋轉軸也旋轉了。現在旋轉會變得很奇怪。 如果這是你的問題是..我可以告訴你我是如何解決這個問題的。 這是問題嗎? – umerbanday
您將設備參考框架中的x,y,z向量重新映射到您的應用參考框架的想法是正確的。我們建議您繪製兩個參考框架並計算從一個到另一個的旋轉,而不是通過實驗交換這些向量。然後簡單地將設備讀數乘以矩陣,將它們放入您的應用參考框架中。 – marcv81
@umerbanday我不確定,但是如果你可以發佈你的解決方案,我會很高興,讓我給它一個鏡頭。 – damian