2012-08-15 252 views
19

Rotation and Translation about arbitrary point矩陣用於旋轉/平移

爲了旋轉/平移對象(大約只有z軸和僅在xy平面平移旋轉)不只是WRT全球中心(設備中心),而且還WRT的適當乘法其他任意點,我創建了一個算法,這是正確的(因爲我所討論的所有高級編碼器認爲它是正確的),它是花了很多時間來刪除不希望的翻譯在實現(算法創建於8月4日在同一天實施,自此代碼修改了15次)。

下面是實施http://www.pixdip.com/opengles/transform.php#ALGO1

被產生不希望的翻譯的代碼行是內:

private static void updateModel(int upDown, float xAngle, float yAngle, float zAngle) {

和下面列出:

  1. Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);

  2. objX = GLES20Renderer._uBodyCentreMatrix[0];

  3. objY = GLES20Renderer._uBodyCentreMatrix[1];

沿+ Y不期望的翻譯仍然存在,即使以下更改:

  1. objY = _uBodyCentreMatrix[1] - _uBodyCentre[1];

  2. zAngle = 0;

  3. ds = 0;

-0.545867f被添加到Y在每次調用協調onDrawFrame(),因爲渲染器類的這些字段:

private static final float[] _uBodyCentre = new float[]{-0.019683f, -0.545867f, -0.000409f, 1.0f};

protected static float[] _uBodyCentreMatrix = new float[4];

http://www.pixdip.com/opengles/transform.php#FIELDS

我需要幫助理解爲什麼是不需要翻譯發生,究竟是什麼毛病轉換,或者是它,這是錯誤的算法。

萬向節鎖可以成爲一個問題嗎?

請不要問我執行/練習更簡單的例子,因爲我已經準備好了Renderer類用於關於全局z軸的旋轉/平移,並且這個新的任務我使用了相同的類,稍作修改在updateModel()

(請注意,該期望的旋轉僅約z軸和翻譯僅在xy平面)

[API 10-> 15]

的實際渲染器類有兩個對象:坦克炮塔(噴嘴)和坦克身體,而轉塔(噴嘴)具有不期望的向前平移,所述主體具有不期望的向後平移

法APK for平移/旋轉有關設備中心(這是很容易在opengles 2.0作出): http://www.pixdip.com/opengles/global.php

法APK for翻譯關於任意點/旋轉(已經沿+ Y不期望的翻譯): http://www.pixdip.com/opengles/local.php

法APK for平移/旋轉大約任意點,其中的UpdateModel()被調用只有4次: http://www.pixdip.com/opengles/limited.php 和所需的代碼(瓦特這應該是足夠的)在這裏:http://www.pixdip.com/opengles/code.php

對象的部件(噴嘴/炮塔,車身)當前正在圍繞自己的中心旋轉而不是物體的中心(這是_playerCentre),我稍後會對其進行修改。

我試圖證明邏輯http://www.pixdip.com/opengles/images.php

+0

我不明白,爲什麼你有不受歡迎的翻譯?你的算法是否生成它們?他們來自哪裏?我建議你在出現不希望的翻譯之前先消除它。 – RaphMclee 2012-08-15 07:42:28

+0

產生不需要的翻譯的代碼行不能被刪除,因爲它們是算法的一部分,我沒有任何其他選項。算法是否正確我仍然不確定,並且實現正在生成一個自動翻譯,我不知道如何刪除它,因爲我只有一個算法,我不能使用替代算法,請嘗試使用apk PLZ來理解它更清楚。 – GLES 2012-08-15 07:44:11

+0

我可以看到你已經爲這個問題付出了很多努力,但我不得不說,我不能真正理解你在說什麼。我無法弄清楚你想在'images.php'頁面上說什麼,我下載了你的應用程序'local.php',但它似乎沒有做任何事情。我只看到兩個按鈕和一個紫色正方形,而當我觸摸按鈕時什麼都沒有發生。你不斷提及一個不受歡迎的翻譯,但不清楚它究竟是什麼或者不想要的。你可以嘗試鏈接單個圖像,並清楚地圈出並註釋問題是什麼? – Tim 2012-08-17 16:16:00

回答

4

[解決] java的浮點錯誤是唯一原因

M = T * I * T [INV]

沒有導致成單位矩陣,那麼 而不是使用Matrix.MultiplyMM

我鍵入矩陣之間的所有乘法運算

4

你可以使用的方法是這樣的:

public void rotateToAbritrary(float[] arbitraryPoint, float xAngle, float yAngle, float zAngle) { 
    Matrix.translateM(modelMatrix, 0, arbitraryPoint[0], arbitraryPoint[1], arbitraryPoint[2]); 
    float max = Math.max(xAngle, Math.max(yAngle, zAngle)); 
    if(max != 0.0f) Matrix.rotateM(modelMatrix, 0, max, xAngle/max, yAngle/max, zAngle/max); 
    Matrix.translateM(modelMatrix, 0, -arbitraryPoint[0], -arbitraryPoint[1], -arbitraryPoint[2]); 
} 

這就是我看到它,至少,我離開你的落實。我收集你的代碼不會受到Gimbal鎖。

5

它看起來像的問題是:

Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0); 

Matrix.multiplyMV是乘以一個4×4矩陣4元素矢量,並將結果存儲在4族元素的列向量的方法。在矩陣符號中:結果= lhs x rhs。如果resultVector元素與lhsMatrix或rhsVector元素重疊,則resultVector元素值未定義。

我不認爲你發佈了所有的代碼,所以我無法確定,但是根據你對'_uBodyCentreMatrix'的命名來判斷,你可能會遇到一個錯誤,因爲它不是一個4元素的列向量。

我假設'_ModelMatrixBody'是一個4x4的矩陣,'_uBodyCentre'是一個4元素的向量,否則這些可能會有問題。

+0

嗨,約瑟夫,你能告訴我,如何將翻譯和旋轉應用於Android中的OpenGL ES2.0中的GLSurfaceview。 – harikrishnan 2013-06-27 09:26:02