gpt4 book ai didi

java - 渲染和眼空间未对准导致光线转换不精确

转载 作者:行者123 更新时间:2023-12-02 01:31:53 24 4
gpt4 key购买 nike

我一直在开发类似 Minecraft 的体素游戏一段时间,并决定通过光线转换来实现 block 放置和销毁。然而,我意识到,当站在非常靠近一个 block 时,该 block 会围绕自身旋转,而不是围绕相机(或观察平面)旋转。眼睛位置偏离约。任何给定轴上的 0.5。我非常确定这就是我的光线转换无法精确工作的原因,我认为问题出在投影上。

我尝试过使用不同的投影方法,但它们都有相同的结果。创建 View 矩阵时调整相机的位置也不起作用,并导致一些奇怪的拉伸(stretch)和错误的旋转。

我的投影矩阵代码:

public static Matrix4f createProjectionMatrix (float fov, float aspectRatio, float clipNear, float clipFar) {
float tanHalfFOV = (float)Math.tan(fov/2);
float zm = clipFar + clipNear;
float zp = clipFar - clipNear;

Matrix4f matrix = new Matrix4f();
matrix.m00(1.0f / (tanHalfFOV * aspectRatio));
matrix.m11(1.0f / tanHalfFOV);
matrix.m22(-zm / zp);
matrix.m32(-2.0f * clipNear * clipFar / zp);
matrix.m23(-1.0f);

return matrix;
}

View 矩阵代码:

public static Matrix4f getViewMatrix () {
return new Matrix4f().rotateXYZ(rotation).translate(-position.x, -position.y, -position.z);
}

着色器代码:

#version 400 core

in vec3 worldCoords;
in vec2 textureCoords;

out vec2 passTextureCoords;

uniform mat4 projViewMatrix;

void main () {
gl_Position = projViewMatrix * vec4(worldCoords, 1.0);

passTextureCoords = textureCoords;
}

渲染代码:

public static void render (ChunkMesh cm) {
Renderable model = cm.getModel();

Shaders.CHUNK_MESH_SHADER.activate();
Shaders.CHUNK_MESH_SHADER.loadToUniform("projViewMatrix", Display.getProjectionMatrix().mul(Camera.getViewMatrix(), new Matrix4f()));

GL30.glBindVertexArray(model.vaoID);
GL20.glEnableVertexAttribArray(0);
GL20.glEnableVertexAttribArray(1);

GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, BlockTexture.TEXTURE.textureID);

GL11.glDrawElements(GL11.GL_TRIANGLES, model.vertexCount, GL11.GL_UNSIGNED_INT, 0l);

GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
GL30.glBindVertexArray(0);

Shaders.CHUNK_MESH_SHADER.deactivate();
}

沿着任何给定的轴,光线转换都表现得很好,但是当面向两个轴之间时,光线转换看起来其原点与屏幕中心不同。由于我的问题集中在未对准而不是光线转换(这似乎有效),因此我只会在需要时添加代码。如有任何帮助,我们将不胜感激!

最佳答案

这是一个有一定根据的猜测,因为您还没有准确指定 Matrix4f 实际是什么。但假设有一些标准约定,例如 lwjgl 中的 Matrix4f 类,构造函数会将新矩阵初始化为恒等矩阵。因此,您需要修改 createProjectionMatrix() 函数以添加

matrix.m33(0.0);

将最后一个元素显式设置为零,因为没有它,您实际上设置了w_clip = -z_eye + 1,将投影中心移动到您认为相机所在位置的前面1个单位。

关于java - 渲染和眼空间未对准导致光线转换不精确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55888828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com