gpt4 book ai didi

opengl - 我的 OpenGL Go 矩阵函数(Perspective/Frustum & Lookat 矩阵)有什么问题?

转载 作者:IT王子 更新时间:2023-10-29 01:14:15 24 4
gpt4 key购买 nike

首先,这是非常简单的“新手标准”顶点着色器:

in vec3 aPos;
uniform mat4 uMatModel; uniform mat4 uMatView; uniform mat4 uMatProj;

void main () {
gl_Position = uMatProj * uMatView * uMatModel * vec4(aPos, 1.0);
}

现在我渲染的是一个简单的六面立方体。 36 个顶点坐标中没有应用或固有的旋转。标准教程风格 -0.5..+0.5 的东西。我会在这里为您省去顶点数组,但请放心,就这么简单。

  • uMatModel 目前只是单位矩阵,目前还没有缩放/平移/旋转
  • uMatView 是一个 LookAt 矩阵(下面的 Go 代码)调用 pos={ 0.1, 0.1, -3.0 }, target={ ​​0.1, 0.1, 0.1 }, up={ 0, 1, 0 }(记住立方体顶点坐标在所有维度上都在 -0.5 和 0.5 之间,所以 0.1s 应该“几乎在中心”)
  • uMatProj 是一个用 fov=45 aspect=winwidth/winheight near=0.1 far=100 调用的透视矩阵(下面的 Go 代码)

理论上,“相机”应该在正对着它的立方体“后面”大约 2-3 个单位。相反,我得到...

enter image description here

我想知道轮换是从哪里来的……我什至还没有实现轮换。

所以总而言之,我尝试自己在 Go 中实现所需的矩阵函数,计算数学。但我一定是在某个地方出了问题。 谁能在我下面的代码中发现任何矩阵理论问题?

type Mat4x4 [4][4]float64

func (me *Mat4x4) Identity () {
me[0][0], me[0][1], me[0][2], me[0][3] = 1, 0, 0, 0
me[1][0], me[1][1], me[1][2], me[1][3] = 0, 1, 0, 0
me[2][0], me[2][1], me[2][2], me[2][3] = 0, 0, 1, 0
me[3][0], me[3][1], me[3][2], me[3][3] = 0, 0, 0, 1
}

func (me *Mat4x4) Frustum (left, right, bottom, top, near, far float64) {
me[0][0], me[0][1], me[0][2], me[0][3] = (near * 2) / (right - left), 0, 0, 0
me[1][0], me[1][1], me[1][2], me[1][3] = 0, (near * 2) / (top - bottom), 0, 0
me[2][0], me[2][1], me[2][2], me[2][3] = (right + left) / (right - left), (top + bottom) / (top - bottom), -(far + near) / (far - near), -1
me[3][0], me[3][1], me[3][2], me[3][3] = 0, 0, -(far * near * 2) / (far - near), 0
}

func (me *Mat4x4) Perspective (fovY, aspect, near, far float64) {
var top = near * math.Tan(fovY * math.Pi / 360)
var right = top * aspect
me.Frustum(aspect * -top, right, -top, top, near, far)
}

func (me *Mat4x4) LookAt (eyePos, lookTarget, worldUp *Vec3) {
var vz = eyePos.Sub(lookTarget)
vz.Normalize()
var vx = worldUp.Cross(&vz)
vx.Normalize()
var vy = vz.Cross(&vx)
vy.Normalize()
me[0][0], me[0][1], me[0][2], me[0][3] = vx.X, vy.X, vz.X, 0
me[1][0], me[1][1], me[1][2], me[1][3] = vx.Y, vy.Y, vz.Y, 0
me[2][0], me[2][1], me[2][2], me[2][3] = vx.Z, vy.Z, vz.Z, 0
me[3][0], me[3][1], me[3][2], me[3][3] = -((vx.X * eyePos.X) + (vx.Y * eyePos.Y) + (vx.Z * eyePos.Z)), -((vy.X * eyePos.X) + (vy.Y * eyePos.Y) + (vy.Z * eyePos.Z)), -((vz.X * eyePos.X) + (vz.Y * eyePos.Y) + (vz.Z * eyePos.Z)), 1
}

注意,这里的Vec3是同一个包中的自定义类型,我这里没有包含。现在我假设 Vec3 函数是正确的(也更容易验证)并怀疑我以某种方式弄乱了矩阵结构中的 LookAt 和/或 Perspective 算法。

最佳答案

这个(大概)deg 到 rad 的转换可以吗?

func (me *Mat4x4) Perspective (fovY, aspect, near, far float64) {
var top = near * math.Tan(fovY * math.Pi / 360)
var right = top * aspect
me.Frustum(aspect * -top, right, -top, top, near, far)
}

也许应该有:

        top := near * math.Tan(fovY * 2 * math.Pi / 360)

关于opengl - 我的 OpenGL Go 矩阵函数(Perspective/Frustum & Lookat 矩阵)有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12847094/

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