gpt4 book ai didi

c++ - OpenGL 投影/矩阵混淆

转载 作者:行者123 更新时间:2023-11-30 02:49:06 24 4
gpt4 key购买 nike

我正在尝试投影一个点的法线并根据它是(从相机/观察平面的角度)向垂直方向左侧倾斜还是向垂直方向右侧倾斜来为其着色。

为此,我将我的点取为正态并将其乘以 gl_ModelViewProjectionMatrix,然后检查它的 x 值是正值还是负值。然而,我所有的点都变成红色(表示垂直左侧,绝对不是这种情况)。如果我将 ModelViewProjectionMatrix 更改为 gl_ProjectionMatrix,我会得到红色和绿色的点,但是如果没有 ModelViewMatrix,它们显然不会从相机的角度着色。

我是不是误会了什么?

着色器示例:

void main(){
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

vec4 temp = vec4(vNormal.x, vNormal.y, vNormal.z, 1);
vMajorTransformed = gl_ModelViewProjectionMatrix * temp;

if (vMajorTransformed.x < 0) {
gl_FrontColor = vec4(1, 0, 0, 1);
} else {
gl_FrontColor = vec4(0, 1, 0, 1);
}

gl_PointSize = 3;
}

最佳答案

法线是一个方向,而不是一个点。这意味着它的 w 组件应该是 0。否则,你最终可能会对其应用翻译,这肯定会弄乱 x, y, z 坐标(我猜你的情况就是这样)。

另请注意,如果您的模型 View 矩阵包含旋转和平移以外的任何内容,法线将再次变得困惑。它们必须通过逆转置来转换。逆和转置抵消仅旋转矩阵,但对于其他变换,您必须使用它们。

而且您可能不想对它们应用投影 - 您之后的测试(x 坐标)可以在相机坐标中进行评估(这通常比投影空间更容易推理) ).

关于c++ - OpenGL 投影/矩阵混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21539496/

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