我目前正在并行運行兩個具有 2 個不同坐標系的游戲引擎:
- 古墓麗影(TR)坐標系;
- 超級馬里奧 64(SM64)坐標系;
要轉換頂點位置(TR->SM64),我只需執行以下操作:
- x' = x/縮放
- y' = -y/縮放
- z' = -z/縮放
逆變換(SM64 -> TR)顯然是相似的:
- x' = x*縮放
- y' = -y*縮放
- z' = -z*縮放
現在我想將 SM64 中的影片轉換矩陣匯入到 TR 中,以將馬里奧的影片應用到 Lara。這里的問題變成了旋轉四元數。
SM64 影片系統對角色應用基本變換,然后為角色裝備的每個骨骼不斷堆疊更多變換矩陣,并進行平移和旋轉。
為了固定位置的標志和縮放,我將基本變換矩陣乘以 (S, -S, -S),其中 S 是縮放因子。這在轉置到 TR 時固定了骨骼的位置,但旋轉四元數完全被破壞了。
為了嘗試修復它,我對變換矩陣應用了一些旋轉:
mat = mat4(
originalMatrix[0][0], originalMatrix[0][1], originalMatrix[0][2], originalMatrix[0][3],
originalMatrix[1][0], originalMatrix[1][1], originalMatrix[1][2], originalMatrix[1][3],
originalMatrix[2][0], originalMatrix[2][1], originalMatrix[2][2], originalMatrix[2][3],
originalMatrix[3][0], originalMatrix[3][1], originalMatrix[3][2], originalMatrix[3][3]
);
mat.rotateX(-M_PI/2);
mat.rotateZ(M_PI/2);
position=mat.getPos();
rot=mat.getRot(); //gets a rotation quaternion
但不幸的是,它翻轉了 Y 全域角度,對于更復雜的骨骼旋轉(如腳),它變得一團糟:

位置倒置在地面下方(我洗掉了縮放中的標牌黑客以避免混亂)并且旋轉仍然錯誤。
uj5u.com熱心網友回復:
在 Open Lara 開發者 XProger 的幫助下,我設法找到了解決這個問題的方法。
首先,讓我們將 T 定義為兩個坐標系之間的變換矩陣:
mat4 T = mat4(
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, -1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
1 - 我將我想在 TR 側為 T 操作的身體部位的所有頂點相乘,因此它們與 SM64 的坐標相同:
vertex = T*vertex;
2 - 我旋轉了 SM64 矩陣,使其與 TR 坐標對齊:
mat = mat4(
originalMatrix[0][0], originalMatrix[0][1], originalMatrix[0][2], originalMatrix[0][3],
originalMatrix[1][0], originalMatrix[1][1], originalMatrix[1][2], originalMatrix[1][3],
originalMatrix[2][0], originalMatrix[2][1], originalMatrix[2][2], originalMatrix[2][3],
originalMatrix[3][0], originalMatrix[3][1], originalMatrix[3][2], originalMatrix[3][3]
);
mat.rotateX(M_PI/2);
mat.rotateZ(-M_PI/2);
3 - 我轉換了矩陣坐標系:
mat = T.inverse()*mat*T;
4 - 將我在 SM64 變換開始時應用的縮放比例從 [S,-S,-S] 更改為 [S,S,S]。
經過這一切,我終于將影片轉換矩陣從 SM64 引擎正確轉換為 TR。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507874.html
上一篇:用char代替 -*/的數學運算
下一篇:GNSS模塊的投影
