我试图找到加载到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;
}
经过一些重构后,这里的一些就是我的立方体的样子。
我得到的正常值是
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
答案 0 :(得分:-1)
三角形的法线由顶点的顺序给出。
你在做什么是错误的,因为你是减去方向,然后使用叉积来获得垂直方向,这只是无意义(你可以减去两个点并从中得到一个向量,然后将其标准化为一个方向,但两个方向毫无意义地减去它们。)
如果要查找三角形的平均法线(考虑到每个向量的三角形具有不同的法线),请使用原始平均值然后进行标准化。它会正常工作。
您似乎已经拥有正常信息(法线向量)。这对闪电来说已经足够了!
你唯一需要计算一个顶点&#34; normal&#34;是你实际计算它的切线和副法线以便应用法线贴图。首先正确实现Phong着色器,然后您可以转到法线贴图。