gpt4 book ai didi

c++ - QMatrix4x4 模型 View 投影 OpenGL 无法获取要渲染的场景

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:53 26 4
gpt4 key购买 nike

给定这个顶点着色器:

attribute vec3 vertex;
uniform mat4 mvp;

void main() {
gl_Position = mvp * vec4(vertex, 1.0);
}

还有这个片段着色器:

void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

mvp 矩阵是单位矩阵或者模型矩阵是缩放、旋转或平移变换时,它能够呈现下面的数据:

GLfloat values[] = {
-1.0, -1.0, +0.0,
+1.0, -1.0, +0.0,
+0.0, +1.0, +0.0,
};

为什么 Qt 的 QMatrix4x4::lookAtQMatrix4x4::perspective 的以下用法会导致场景呈现为好像没有对象一样?

QMatrix4x4 model;
QMatrix4x4 view;
view.lookAt(
QVector3D(0.0, 0.0, 10.0), // Eye
QVector3D(0.0, 0.0, 0.0), // Focal Point
QVector3D(0.0, 1.0, 0.0)); // Up vector
QMatrix4x4 proj;
// Window size is fixed at 800.0 by 600.0
proj.perspective(45.0, 800.0 / 600.0, 1.0, 100.0);
QMatrix4x4 mvp = (model * view * proj);

我正在寻找的不仅是如何修复代码,还包括我可以在未来尝试调试这些东西的方法。


我凭直觉将 mvp 更改为 p * v * m 并解决了问题。如果你必须以相反的顺序进行乘法,为什么它是 mvp 呢?我知道矩阵乘法是不可传递的。也就是说,如果 A 和 B 是矩阵,如果 A 和 B 不是 I,则 A * B != B * A。

最佳答案

之所以称为 MVP,是因为……有人这样命名它。 ;)

虽然有一定的道理。它基本上按照应用的顺序列出了转换。您首先将模型矩阵应用于顶点,然后将 View 矩阵应用于其结果,然后将投影矩阵应用于两者的结果。

或者在数学上,对于输入顶点 vObj,您可以这样写:

vWorld = M * vObj
vEye = V * vWorld
vClip = P * vEye

如果你代入方程式,你会得到:

vClip = P * vEye = P * (V * vWorld) = P * (V * (M * vObj))

矩阵乘法是关联的,因此可以重写为:

P * (V * (M * vObj)) = (P * V * M) * vObj

因此,组合矩阵计算为P * V * M

关于c++ - QMatrix4x4 模型 View 投影 OpenGL 无法获取要渲染的场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28917545/

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