ViewMatrix 计算弄乱了模型
ViewMatrix calculation messes up models
我有一个 WebGL 应用程序,它呈现一组立方体,每个立方体具有不同的高度。为了调整它们的大小,我使用变换矩阵来缩放立方体。我还有一个摄像头,可以用键盘移动。
要计算模型矩阵,我使用以下代码:
let matrix = matrix4Identity();
matrix = matrix4Translate(matrix, this.position);
matrix = matrix4Rotate(matrix, this.rotation[0], [1, 0, 0]);
matrix = matrix4Rotate(matrix, this.rotation[1], [0, 1, 0]);
matrix = matrix4Rotate(matrix, this.rotation[2], [0, 0, 1]);
matrix = matrix4ScaleWithVector(matrix, this.scale);
为了计算视图矩阵,我使用了这段代码:
let matrix = matrix4Identity();
matrix = matrix4Rotate(matrix, camera.rotation[0], [1, 0, 0]);
matrix = matrix4Translate(matrix, [camera.position[0], camera.position[1], camera.position[2]]);
return matrix4Inverse(matrix);
这是我使用的顶点着色器代码:
attribute vec3 vertices;
attribute vec3 normals;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
void main(void) {
vec4 worldPosition = modelMatrix * vec4(vertices, 1.0);
vec4 modelPosition = viewMatrix * worldPosition;
gl_Position = projectionMatrix * modelPosition;
}
但是,如果您移动相机,立方体就会平移。因此,当您向上移动相机时,立方体的(视觉)Y 位置会发生变化。此外,如果您旋转相机,它实际上会围绕其 X 轴旋转立方体。
但是,如果我删除模型矩阵中的比例变换,块不会再移动相机时改变它们的位置。
您可以在此处查看项目结果。 https://renuo.github.io/stayOFline/
使用WASD在X和Z轴上移动,R向上移动,F向下移动,o+l旋转相机。
更新:
第一次平移和旋转相机时,出现以下行为:
下查看完整代码
函数调用中的参数:
https://github.com/renuo/stayOFline/blob/100a890c177d5cacc2e98fd5df196740899abf38/engine/Renderer.js#L37
需要切换。
program.updateUniforms(this, camera, model, light)
应该是:
program.updateUniforms(this, model, camera, light)
我有一个 WebGL 应用程序,它呈现一组立方体,每个立方体具有不同的高度。为了调整它们的大小,我使用变换矩阵来缩放立方体。我还有一个摄像头,可以用键盘移动。
要计算模型矩阵,我使用以下代码:
let matrix = matrix4Identity();
matrix = matrix4Translate(matrix, this.position);
matrix = matrix4Rotate(matrix, this.rotation[0], [1, 0, 0]);
matrix = matrix4Rotate(matrix, this.rotation[1], [0, 1, 0]);
matrix = matrix4Rotate(matrix, this.rotation[2], [0, 0, 1]);
matrix = matrix4ScaleWithVector(matrix, this.scale);
为了计算视图矩阵,我使用了这段代码:
let matrix = matrix4Identity();
matrix = matrix4Rotate(matrix, camera.rotation[0], [1, 0, 0]);
matrix = matrix4Translate(matrix, [camera.position[0], camera.position[1], camera.position[2]]);
return matrix4Inverse(matrix);
这是我使用的顶点着色器代码:
attribute vec3 vertices;
attribute vec3 normals;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
void main(void) {
vec4 worldPosition = modelMatrix * vec4(vertices, 1.0);
vec4 modelPosition = viewMatrix * worldPosition;
gl_Position = projectionMatrix * modelPosition;
}
但是,如果您移动相机,立方体就会平移。因此,当您向上移动相机时,立方体的(视觉)Y 位置会发生变化。此外,如果您旋转相机,它实际上会围绕其 X 轴旋转立方体。 但是,如果我删除模型矩阵中的比例变换,块不会再移动相机时改变它们的位置。
您可以在此处查看项目结果。 https://renuo.github.io/stayOFline/ 使用WASD在X和Z轴上移动,R向上移动,F向下移动,o+l旋转相机。
更新:
第一次平移和旋转相机时,出现以下行为:
函数调用中的参数: https://github.com/renuo/stayOFline/blob/100a890c177d5cacc2e98fd5df196740899abf38/engine/Renderer.js#L37 需要切换。
program.updateUniforms(this, camera, model, light)
应该是:
program.updateUniforms(this, model, camera, light)