gpt4 book ai didi

c - OpenGL 光照 vector 归一化

转载 作者:行者123 更新时间:2023-11-30 18:12:51 27 4
gpt4 key购买 nike

我试图找到加载到 opengl 程序中的任意对象的 vector 归一化。我正在尝试计算所有顶点的法线。我收集到的是,我需要首先计算面的法线,然后找到顶点法线的平均值。

当我运行程序时,某些对象被正确照亮,但大多数情况下并非如此。每个独立面上的三角形似乎都被正确照亮,但相邻面上则不然。为了计算每个顶点的法线,我假设我会找到六个连接三角形的标准化平均值,尝试这样做似乎不起作用。

这是我用来尝试计算每个面的法线的代码。

vec3 one, two;
for(int i = 0; i < vertices.vertexNumber; i += 3)
{
one.x = point3[i+1].x - point3[i].x;
one.y = point3[i+1].y - point3[i].y;
one.z = point3[i+1].z - point3[i].z;

two.x = point3[i+2].x - point3[i].x;
two.y = point3[i+2].y - point3[i].y;
two.z = point3[i+2].z - point3[i].z;

vec3 normal = normalizevec3(crossvec3(one, two));

normalized[i] = normal;
}

以及我用来标准化 vector 的函数

vec3 normalizevec3(vec3 v) {
float vecLength = lengthvec3(v);
vec3 dividebyzero = {0.0, 0.0, 0.0};
if (vecLength == 0)
return dividebyzero;
float X, Y, Z;
X = v.x / vecLength;
Y = v.y / vecLength;
Z = v.z / vecLength;
vec3 u = {X, Y, Z};
return u;
}

经过一些重构后,这就是我的立方体的样子。

enter image description here

enter image description here

我得到的正常值是

0.000000, 0.000000, 1.000000
0.000000, 0.000000, 1.000000
0.000000, 0.000000, 1.000000
0.000000, 0.000000, 1.000000
-1.000000, 0.000000, -0.000000
-1.000000, 0.000000, 0.000000
-1.000000, 0.000000, -0.000000
-1.000000, 0.000000, 0.000000
0.000000, -1.000000, 0.000000
-0.000000, -1.000000, 0.000000
0.000000, -1.000000, 0.000000
-0.000000, -1.000000, 0.000000

最佳答案

三角形的法线由顶点的顺序给出。

你在那里做的事情是错误的,因为你正在减去方向,然后使用叉积来获得垂直方向,这只是无意义的(你可以减去两个点并从中得到一个 vector ,然后将其标准化为一个方向,但两个方向相减是没有意义的)。

如果您想找到三角形的平均法线(考虑到三角形的每个 vector 具有不同的法线),请使用原始平均值,然后进行标准化。它会工作得很好。

您似乎已经有了法线信息(法线 vector )。闪电就够了!

您需要计算顶点“法线”的唯一时间是当您实际计算其切线和副法线以应用法线贴图时。首先正确实现 Phong 着色器,然后您可以转到法线贴图。

关于c - OpenGL 光照 vector 归一化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29868169/

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