我一直在網上玩一些算法一段時間,我似乎無法讓他們工作,所以我在這裏拋出問題;方向矢量的旋轉矩陣
我試圖從一個點呈現速度矢量線。繪製直線並不困難:只需將長度爲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();
你的問題幾乎不可能理解,特別是關於「半速度矢量」的部分。 – 2008-10-19 11:37:29
爲什麼你要兩次調用vec_z.normalize,這裏的是什麼? –
2008-10-19 12:14:14
這是原始代碼中的拼寫錯誤。這對最終的解決方案實際上並沒有什麼不同,但它會使y縮放比較時髦。 :-) – 2008-10-19 12:23:39