OpenGL照明矢量归一化

时间:2015-04-25 17:03:43

标签: c opengl lighting

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

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

以下是我用于尝试计算每张脸的法线的代码。

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;
}

和我用来规范化向量的函数

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

1 个答案:

答案 0 :(得分:-1)

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

你在做什么是错误的,因为你是减去方向,然后使用叉积来获得垂直方向,这只是无意义(你可以减去两个点并从中得到一个向量,然后将其标准化为一个方向,但两个方向毫无意义地减去它们。)

如果要查找三角形的平均法线(考虑到每个向量的三角形具有不同的法线),请使用原始平均值然后进行标准化。它会正常工作。

您似乎已经拥有正常信息(法线向量)。这对闪电来说已经足够了!

你唯一需要计算一个顶点&#34; normal&#34;是你实际计算它的切线和副法线以便应用法线贴图。首先正确实现Phong着色器,然后您可以转到法线贴图。