Opengl 三角形法线与顶点法线

Opengl 三角形法线与顶点法线,opengl,graphics,3d,geometry,mesh,Opengl,Graphics,3d,Geometry,Mesh,通过使用三个顶点位置v0,v1,v2,并使用叉积,我可以计算三角形法线N: 问题是三维网格数据结构需要每个顶点都有法线。我的意思是,它需要n1,n2和n3。我不知道计算它们的正确方法是什么 尝试 我尝试对n1、n2和n3使用相同的N值,但我不确定这是否正确: n1=n2=n3=N实现平滑顶点法线,如下所示: std::向量点=。。。 std::vector facets=。。。 //计算顶点共享的面/三角形数 向量计数器; counters.resize(points.size()); //计

通过使用三个顶点位置
v0
v1
v2
,并使用叉积,我可以计算三角形法线
N

问题是三维网格数据结构需要每个顶点都有法线。我的意思是,它需要
n1
n2
n3
。我不知道计算它们的正确方法是什么

尝试 我尝试对
n1
n2
n3
使用相同的
N
值,但我不确定这是否正确:

n1=n2=n3=N

实现平滑顶点法线,如下所示:

std::向量点=。。。
std::vector facets=。。。
//计算顶点共享的面/三角形数
向量计数器;
counters.resize(points.size());
//计算法线
规范。明确();
norms.resize(points.size());
用于(Vec3i f:面){
int i0=f.x();
int i1=f.y();
inti2=f.z();
Vec3d pos0=点(i0);
Vec3d pos1=点(i1);
Vec3d pos2=点(i2);
Vec3d N=三角法线(位置0、位置1、位置2);
//必须规范化
// https://stackoverflow.com/a/21930058/3405291
N.正常化();
范数[i0]+=N;
范数[i1]+=N;
范数[i2]+=N;
计数器[i0]++;
计数器[i1]++;
计数器[i2]++;
}
对于(int i=0;i0)
标准[i]/=计数器[i];
其他的
规范[i].规范化();
}
实现平滑顶点法线,如下所示:

std::向量点=。。。
std::vector facets=。。。
//计算顶点共享的面/三角形数
向量计数器;
counters.resize(points.size());
//计算法线
规范。明确();
norms.resize(points.size());
用于(Vec3i f:面){
int i0=f.x();
int i1=f.y();
inti2=f.z();
Vec3d pos0=点(i0);
Vec3d pos1=点(i1);
Vec3d pos2=点(i2);
Vec3d N=三角法线(位置0、位置1、位置2);
//必须规范化
// https://stackoverflow.com/a/21930058/3405291
N.正常化();
范数[i0]+=N;
范数[i1]+=N;
范数[i2]+=N;
计数器[i0]++;
计数器[i1]++;
计数器[i2]++;
}
对于(int i=0;i0)
标准[i]/=计数器[i];
其他的
规范[i].规范化();
}

如果要计算弯曲对象(如球体)的“平滑”网格,必须从相邻面插值顶点法线normals@Rabbid76你知道我能从中得到什么样的计算方法吗?@user3405291这是另一个问题中的一个例子:@gkv311谢谢!正是我所需要的:如果你想为一个弯曲的物体(比如一个球体)计算一个“平滑”的网格,你必须从相邻的面插值顶点法线normals@Rabbid76你知道我能从中得到什么样的计算方法吗?@user3405291这是另一个问题中的一个例子:@gkv311谢谢!正是我所需要的:看到了吗