2008-10-19 198 views
4

我一直在網上玩一些算法一段時間,我似乎無法讓他們工作,所以我在這裏拋出問題;方向矢量的旋轉矩陣

我試圖從一個點呈現速度矢量線。繪製直線並不困難:只需將長度爲velocity.length的線插入圖形即可。這使得該線位於y軸方向的中心點。我們現在需要通過適當的輪換和翻譯來解決這個問題。

平移向量不難計算:它是速度向量的一半。然而,旋轉矩陣對我來說是非常難以捉摸的。給定一個方向矢量<x, y, z>,我需要什麼矩陣?

編輯1:看;如果你不明白這個問題,你可能無法給我一個答案。

這是我目前擁有者:根據this article

     Vector3f translation = new Vector3f(); 
        translation.scale(1f/2f, body.velocity); 

        Vector3f vec_z = (Vector3f) body.velocity.clone(); 
        vec_z.normalize(); 

        Vector3f vec_y; // reference vector, will correct later 
        if (vec_z.x == 0 && vec_z.z == 0) { 
         vec_y = new Vector3f(-vec_z.y, 0f, 0f); // could be optimized 
        } else { 
         vec_y = new Vector3f(0f, 1f, 0f); 
        } 
        Vector3f vec_x = new Vector3f(); 
        vec_x.cross(vec_y, vec_z); 
        vec_z.normalize(); 

        vec_y.cross(vec_x, vec_z); 
        vec_y.normalize(); 
        vec_y.negate(); 

        Matrix3f rotation = new Matrix3f(
         vec_z.z, vec_z.x, vec_z.y, 
         vec_x.z, vec_x.x, vec_x.y, 
         vec_y.z, vec_y.x, vec_y.y 
        ); 

        arrowTransform3D.set(rotation, translation, 1f);

。是的,我已經嘗試過標準旋轉矩陣(vec_x.x,vec_y.x等),它不起作用。我一直在旋轉列和行,看看是否有任何影響。

編輯2:

道歉一下我的意見粗魯的措辭。

所以它看起來像是兩個錯誤的組合;其中一個是House MD指出的(變量的命名非常糟糕:vec_z實際上是vec_y等等),另一個是我需要在將矩陣傳遞給渲染引擎之前將其轉換(轉置非常接近!)。因此,修改後的代碼是:

     Vector3f vec_y = (Vector3f) body.velocity.clone(); 
        vec_y.normalize(); 

        Vector3f vec_x; // reference vector, will correct later 
        if (vec_y.x == 0 && vec_y.z == 0) { 
         vec_x = new Vector3f(-vec_y.y, 0f, 0f); // could be optimized 
        } else { 
         vec_x = new Vector3f(0f, 1f, 0f); 
        } 

        Vector3f vec_z = new Vector3f(); 
        vec_z.cross(vec_x, vec_y); 
        vec_z.normalize(); 

        vec_x.cross(vec_z, vec_y); 
        vec_x.normalize(); 
        vec_x.negate(); 

        Matrix3f rotation = new Matrix3f(
         vec_x.x, vec_x.y, vec_x.z, 
         vec_y.x, vec_y.y, vec_y.z, 
         vec_z.x, vec_z.y, vec_z.z 
        ); 
        rotation.invert();
+0

你的問題幾乎不可能理解,特別是關於「半速度矢量」的部分。 – 2008-10-19 11:37:29

+0

爲什麼你要兩次調用vec_z.normalize,這裏的是什麼? – 2008-10-19 12:14:14

+0

這是原始代碼中的拼寫錯誤。這對最終的解決方案實際上並沒有什麼不同,但它會使y縮放比較時髦。 :-) – 2008-10-19 12:23:39

回答

1

Dupe.

的問題有涉及得到一個旋轉到一定軸,而我關心的是得到一個旋轉矩陣。

嘖嘖,我不知道你是否可以打開convert one to the other

順便說一句,你目前的解決方案選擇一個任意的y軸,然後再正交化應該工作正常;它看起來很麻煩,至少寫得不好。 'z_vec'對y軸來說不是一個好的變量名。無論如何,'z,x,y'順序是什麼?

如果它仍然不起作用,請嘗試進行隨機更改,直到它發生變化 - 轉置矩陣,否定矢量,直到出現偶數個符號錯誤爲止。

此外,由於您要求陌生人花時間幫助您,所以您的語氣也會顯得粗魯無禮。