gpt4 book ai didi

c++ - 不正确的观察矩阵

转载 作者:太空狗 更新时间:2023-10-29 20:21:16 25 4
gpt4 key购买 nike

我已经开始研究定向光的阴影贴图,为此我需要一个 lookAt 矩阵,但是当我尝试从在线教程的示例构建时,它看起来像这样:

enter image description here

目前看起来是这样的: https://media.giphy.com/media/QrMnqBBJZuATu/giphy.gif

我尝试了多种构造方法但都没有成功,我检查了规范化、交叉和平移函数是否不正确,但事实并非如此。我也尝试过从列主矩阵更改为行主矩阵,但没有成功。有人能指出我做错了什么吗?

看矩阵构造:

中心 vector = (0, 0, 0),向上 vector = (0, 1, 0)

Matrix4f Matrix4f::lookAt(const Vector3f& position, const Vector3f& center, const Vector3f& up) {
Matrix4f out(1.0f);

Vector3f z = position.substract(center).normalize();


Vector3f y = up;

Vector3f x = y.cross(z).normalize();

y = z.cross(x);

out.mElements[0 * 4 + 0] = x.x;
out.mElements[0 * 4 + 1] = x.y;
out.mElements[0 * 4 + 2] = x.z;

out.mElements[1 * 4 + 0] = y.x;
out.mElements[1 * 4 + 1] = y.y;
out.mElements[1 * 4 + 2] = y.z;

out.mElements[2 * 4 + 0] = z.x;
out.mElements[2 * 4 + 1] = z.y;
out.mElements[2 * 4 + 2] = z.z;

return (out * Matrix4f::translation(Vector3f(-position.x, -position.y, -position.z)));
}
}

代码来源:https://stackoverflow.com/users/5577765/rabbid76

这就是我将矩阵传递给着色器的方式:

void Shader::setMat4(const char* name, const math::Matrix4f& matrix){
glUniformMatrix4fv(getUniformLocation(name), 1, GL_TRUE, matrix.mElements);
}

在我计算出 lookAt 矩阵后,我直接将它传递给顶点着色器以统一:view 并像这样计算一个点:

gl_Position = projection * view * model * vec4(vertexPosition, 1.0);

这就是我的矩阵乘法的工作原理:

Matrix4f Matrix4f::multiply(const Matrix4f& other) const {
Matrix4f out;
for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
fl32 o = 0;
for (int c = 0; c < 4; c++) {
o += this->mElements[c + y * 4] * other.mElements[x + c * 4]; }
out.mElements[x + y * 4] = o;
}
}
return out;
}

编辑:更新图片编辑:添加了更详细的描述

最佳答案

您需要在计算 u 之前对 s 进行归一化。我不确定这是否是唯一的问题

关于c++ - 不正确的观察矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44928859/

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