【发布时间】:2019-10-04 16:02:10
【问题描述】:
我有 webgl 代码,它使用 3 个旋转角度来旋转相机,然后它返回向前、向左和向上的向量。它工作正常:
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构成投影矩阵的矩阵。其他矩阵有其他名称,具体取决于它们的使用方式。
标签: javascript 3d opengl-es webgl