【发布时间】:2019-11-14 15:20:45
【问题描述】:
我一直在关注由 YouTuber 'thebennybox' 策划的游戏引擎教程系列,但遇到了一个问题。立方体网格应该显示在屏幕上,在这个特定的情节中,目标是修复由于不方形纵横比而导致的对象拉伸。但是,当我尝试实现相同的代码时,立方体会完全分散。我已经多次查看材料,所以问题出在代码的其他部分,或者我还没有发现我在复制代码时的错误[来自此视频:https://youtu.be/cgaixZEaDCg]。
实现矩阵透视之前的代码:
public void render()
{
shader.bind();
shader.setUniform("transform", transform.getTransformation());
mesh.draw();
}
之后:
public void render()
{
shader.bind();
shader.setUniform("transform", transform.getProjectedTransformation());
mesh.draw();
}
这个新的转换过程“getPerspectiveTransformation()”看起来像 这个:
public Matrix4f getProjectedTransformation()
{
Matrix4f transformationMatrix = getTransformation();
Matrix4f projectionMatrix = new Matrix4f().initProjection(fov, width, height, zNear, zFar);
return projectionMatrix.mul(transformationMatrix);
}
随后在 Matrix4f 上调用“initProjection”以及我知道单独工作的正常“getTransformation”过程:
public Matrix4f initProjection(float fov, float width, float height, float zNear, float zFar)
{
float ar = width/height;
float tanHalfFOV = (float)Math.tan(Math.toRadians(fov / 2));
float zRange = zNear - zFar;
m[0][0] = 1.0f / (tanHalfFOV * ar); m[0][1] = 0; m[0][2] = 0; m[0][3] = 0;
m[1][0] = 0; m[1][1] = 1.0f / tanHalfFOV; m[1][2] = 0; m[1][3] = 0;
m[2][0] = 0; m[2][1] = 0; m[2][2] = (-zNear - zFar)/zRange; m[2][3] = 2 * zFar * zNear / zRange;
m[2][0] = 0; m[2][1] = 0; m[2][2] = 1; m[2][3] = 0;
return this;
}
我不认为问题在于两个矩阵相乘和返回的顺序(第三块代码),并且我无法推断出问题的代码部分源于。
如果您有调试建议或认为问题出在我未包含的基本代码片段中,那么我将提供任何其他块。
编辑:我使用 OpenGL 进行渲染,使用 JFrame 作为窗口管理器。
【问题讨论】:
-
矩阵的最后一行不应该有第一个索引“3” - 例如,将
m[2][2] = 1;更改为m[3][2] = 1;
标签: java opengl projection-matrix