我試圖在三維中顯示三個笛卡兒平面時遇到問題,當它們旋轉平面時,會在一個方向上拉伸(z軸,藍色)並在另一個方向上(x軸紅色)等這些圖像示出了圍繞y軸旋轉:Webgl:旋轉對象變得沿着軸線變形
我計算投影矩陣,與來自GL-矩陣庫mat4.perspective:
mat4.perspective(this.pMatrix_, this.vFieldOfView_, this.aspect_, this.near_, this.far_);
用的值:
private near_ = 0.1;
private far_ = 1000.0;
private vFieldOfView_ = 60.0 * Math.PI/180;
頂點着色器:
void main(void) {
gl_Position = uProjection * uView * uTransform * vec4(aVertexPosition, 1.0);
}
視圖矩陣將對象2.0單位轉換爲遠離相機。
let t = new Mat4();
t.array[12] = v.x;
t.array[13] = v.y;
t.array[14] = v.z;
我旋轉使用此代碼生成矩陣繞y軸的平面:
// identity matrix already set
let rad = angle * Math.PI/180;
r.array[0] = Math.cos(rad);
r.array[2] = Math.sin(rad);
r.array[8] = -1.0 * Math.sin(rad);
r.array[10] = Math.cos(rad);
我乘三個變換對象的矩陣順序如下: 旋轉*翻譯*規模。正在使用四元數來處理旋轉,但它們同樣被扭曲,因此回到使用旋轉矩陣並保持旋轉簡單,在一個軸上。看起來我正在按照錯誤的順序進行一些乘法步驟,或者沒有正確使用透視矩陣,或者得到錯誤的符號。
更新:
只是爲了澄清上的一些在頂點着色器矩陣的值:從mat.perspective(...)獲得
uProjection = pMatrix_ =值。可以使用uView = [1,0,0,0,0,1,0,0,0,0,1,0.0,0,0,0,1](即,在z軸上相隔2個單位)的矩陣,其中, 。
uTransform在本例中應該是單位矩陣。
UPDATE2:
uView竟是[1,0,0,0,0,1,0,0,0,0,1,0,0,0,-2.0,1]
如果你正在使用gl-matrix庫,爲什麼'new Mat4()'而不是'mat4.create()'? –
由於您將矩陣分開,因此向我們展示每個矩陣的值可能會有所幫助。它看起來像一個標誌可能翻轉了某處,這就是爲什麼我通常堅持現有的數學庫,如gl矩陣,而不是直接數組訪問。 –
使用typescript並使用Mat4類來簡化類型檢查,這基本上只是一個包含評估者的Float32Array(16)。使用gl-matrix做像透視矩陣這樣的計算。 – dppower