我有使用3个旋转角度旋转相机的webgl代码,然后它返回前向,左向和向上向量。它工作正常:
function matrixFromPositionAndRotation(aPosition, aRotX, aRotY, aRotZ) {
var matrix = mat4.create();
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 2000.0, matrix);
mat4.rotateX(matrix, aRotX);
mat4.rotateY(matrix, aRotY);
mat4.rotateZ(matrix, aRotZ);
mat4.translate(matrix, aPosition);
return {
matrix: matrix,
forward: vec3.create([matrix[2], matrix[6], matrix[10]]),
left: vec3.create([matrix[0], matrix[4], matrix[8]]),
up: vec3.create([matrix[1], matrix[5], matrix[9]])
};
}
但是我想做相反的事情。我知道位置,向前,向左和向上矢量,并且我想计算投影矩阵。我尝试了相反的方法,但是没有用:
function matrixFromPositionAndVectors(aPosition, aForward, aLeft, aUp) {
var matrix = mat4.create();
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 2000.0, matrix);
mat4.translate(matrix, aPosition);
matrix[0] = aLeft[0];
matrix[4] = aLeft[1];
matrix[8] = aLeft[2];
matrix[2] = aForward[0];
matrix[6] = aForward[1];
matrix[10] = aForward[2];
matrix[1] = aUp[0];
matrix[5] = aUp[1];
matrix[9] = aUp[2];
return {
matrix: matrix
};
}
您可能需要将矩阵乘以要创建的矩阵
mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 2000.0, matrix);
mat4.translate(matrix, aPosition);
const m = [
...aLeft, 0,
...aUp, 0,
...aForward, 0,
0, 0, 0, 1,
];
mat4.multiply(matrix, matrix, m);
尽管请注意,我希望aLeft
实际上是aRight
。换句话说,考虑身份
[
1, 0, 0, 0, // points right (x = 1)
0, 1, 0, 0, // points up (y = 1)
0, 0, 1, 0, // points ?? (z = 1) If you define +Z as forward.
0, 0, 0, 1,
]
对于相机矩阵,-Z通常向前。
我还猜测您不熟悉WebGL(OpenGL)矩阵。他们称行为“列”
[
1, 0, 0, 0, // column 0
0, 1, 0, 0, // column 1
0, 0, 1, 0, // column 2
0, 0, 0, 1, // column 3
]
因此xAxis进入此处
[
Xx, Xy, Xz, 0, // column 0 (xAxis)
0, 1, 0, 0, // column 1
0, 0, 1, 0, // column 2
0, 0, 0, 1, // column 3
]
尽管您当然没有发布数学库。 mat4
不是任何标准的一部分,因此,如果没有看到它,我们就无法知道它在做什么,只能猜测。
您可以测试。这样做
console.log(mat4.translate(mat4.create(), [11, 22, 33]));
您可能会得到
[
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
11,22,33, 1,
]