我画了一个有10000个顶点(100x100)的三角形网格,它将是一个草地.我使用了gldrawelements().我看了一整天,仍然无法理解如何计算这个法线.每个顶点是否有自己的法线或每个三角形都有自己的法线?有人能指出我正确的方向如何编辑我的代码以合并法线?
struct vertices {
GLfloat x;
GLfloat y;
GLfloat z;
}vertices[10000];
GLuint indices[60000];
/*
99..9999
98..9998
........
01..9901
00..9900
*/
void CreateEnvironment() {
int count=0;
for (float x=0;x<10.0;x+=.1) {
for (float z=0;z<10.0;z+=.1) {
vertices[count].x=x;
vertices[count].y=0;
vertices[count].z=z;
count++;
}
}
count=0;
for (GLuint a=0;a<99;a++){
for (GLuint b=0;b<99;b++){
GLuint v1=(a*100)+b;indices[count]=v1;count++;
GLuint v2=(a*100)+b+1;indices[count]=v2;count++;
GLuint v3=(a*100)+b+100;indices[count]=v3;count++;
}
}
count=30000;
for (GLuint a=0;a<99;a++){
for (GLuint b=0;b<99;b++){
indices[count]=(a*100)+b+100;count++;//9998
indices[count]=(a*100)+b+1;count++;//9899
indices[count]=(a*100)+b+101;count++;//9999
}
}
}
void ShowEnvironment(){
//ground
glPushMatrix();
GLfloat GroundAmbient[]={0.0,0.5,0.0,1.0};
glMaterialfv(GL_FRONT,GL_AMBIENT,GroundAmbient);
glEnableClientState(GL_VERTEX_ARRAY);
glIndexPointer( GL_UNSIGNED_BYTE, 0, indices ); …Run Code Online (Sandbox Code Playgroud) 我已经合法地完成了所有可能的研究,而这只是简单地计算每个相邻面的表面法线.计算表面法线很容易,但是如何找到每个顶点的相邻面?你用什么样的存储空间?我错过了什么吗?为什么每个人都这么容易.
任何指导将不胜感激.
我正在尝试向我的应用程序添加凹凸贴图功能,但我得到了非常多面的模型:

发生这种情况的原因是因为我正在计算每个面的切线、副法线和法线,而完全忽略了我从模型文件中获得的法线。
计算目前使用三角形的两条边和纹理空间向量得到切线和副法线,然后通过叉积计算法线。模型加载后,这一切都在 CPU 上完成,然后将值存储为模型几何的一部分。
vector1 = vertex2.coords - vertex1.coords;
vector2 = vertex3.coords - vertex1.coords;
tuVector = vertex2.texcoords - vertex1.texcoords;
tvVector = vertex3.texcoords - vertex1.texcoords;
float den = 1.0f / (tuVector.x * tvVector.y - tuVector.y * tvVector.x);
tangent.x = (tvVector.y * vector1.x - tvVector.x * vector2.x) * den;
tangent.y = (tvVector.y * vector1.y - tvVector.x * vector2.y) * den;
tangent.z = (tvVector.y * vector1.z - tvVector.x * vector2.z) * den;
binormal.x = (tuVector.x * vector2.x - tuVector.y * vector1.x) * …Run Code Online (Sandbox Code Playgroud) 我正在尝试计算各种游戏资产的顶点法线。我计算的法线用于“膨胀”模型(在真实模型后面绘制产生粗轮廓)。
我目前计算每张脸的法线并平均所有脸(堆栈溢出的其他几个问题建议这种方法)。但是,这不适用于像这样的尖角(相邻面的法线以橙色标记,我试图计算的法线以绿色标出)。

该物体看起来像一个小基座,我们正在查看左前角。有三个相邻的面(底面不可见;它的法线指向正下方)。
Blender 计算出一个很好的法线,它正好位于三个面的法线中间;似乎它以某种方式计算了一个法线,该法线对三个面法线中的每一个都具有最小旋转。当四边形以不同方式进行三角剖分时,Blender 的法线也不会改变。
平均面的法线给了我一个不同的法线,它在 Z 轴上略微向上(-0.45、-0.89、+0.08)。以这种方式给我的模型充气不会产生好的轮廓,因为轮廓的底面向上移动并且没有包围原始模型。
我试图查看 Blender 源代码,但找不到我要找的东西。如果有人可以指出 Blender 源代码中的算法,我也会接受。
我们有一组三角形。每个三角形都是三个点。每个点都是实数的三元组。我们可以计算每个三角形的表面法线。然而,对于 Gouraud 着色,我们需要顶点法线。因此,我们必须访问每个顶点并查看共享该顶点的三角形,平均它们的表面法线,然后得到顶点法线。
实现这一目标最有效的算法和数据结构是什么?
一个简单的方法是这样的(伪 python 代码):
MAP = dict()
for T in triangles:
for V in T.vertices:
key = hash(V)
if MAP.has(key):
MAP[key].append(T)
else:
MAP[key] = []
MAP[key].append(T)
VNORMALS = dict()
for key in MAP.keys():
VNORMALS[key] = avg([T.surface_normal for T in MAP[key]])
Run Code Online (Sandbox Code Playgroud)
有更有效的方法吗?