3d 三维曲面法线提取器
我有一个3D闭合网格对象,它有3D 65.000个位置坐标。 出于照明目的,我需要一个3D曲面法线提取器 你能帮我拿一下吗 谢谢3d 三维曲面法线提取器,3d,extract,mesh,3d,Extract,Mesh,我有一个3D闭合网格对象,它有3D 65.000个位置坐标。 出于照明目的,我需要一个3D曲面法线提取器 你能帮我拿一下吗 谢谢 Richard既然你有索引,我假设它是一个三角形列表/条形图或扇形图。读每个三角形。通过取三角形向量中的2个来计算法线。不过你有一个问题。如果你不知道三角形的缠绕顺序,那么你可能会得到相反的值。哪个软件创建了网格?您能否在数据文件或软件中检查缠绕顺序?它是左手的还是右手的?既然你有索引,我假设它是一个三角形列表/条带或扇形。读每个三角形。通过取三角形向量中的2个来计算
Richard既然你有索引,我假设它是一个三角形列表/条形图或扇形图。读每个三角形。通过取三角形向量中的2个来计算法线。不过你有一个问题。如果你不知道三角形的缠绕顺序,那么你可能会得到相反的值。哪个软件创建了网格?您能否在数据文件或软件中检查缠绕顺序?它是左手的还是右手的?既然你有索引,我假设它是一个三角形列表/条带或扇形。读每个三角形。通过取三角形向量中的2个来计算法线。不过你有一个问题。如果你不知道三角形的缠绕顺序,那么你可能会得到相反的值。哪个软件创建了网格?您能否在数据文件或软件中检查缠绕顺序?它是左手的还是右手的?你需要的只是组成三角形两边的向量的叉积,标准化为单位向量
正如安德鲁·基思(Andrew Keith)在他的评论中所说,当你从“外部”看三角形时,你最好知道三角形是顺时针或逆时针定义的。如果你不能保证一致性,你的手上就乱七八糟。但可能(或者至少希望如此)创建对象的代码是合理的。您需要的只是组成三角形两侧的向量的叉积,标准化为单位向量
正如安德鲁·基思(Andrew Keith)在他的评论中所说,当你从“外部”看三角形时,你最好知道三角形是顺时针或逆时针定义的。如果你不能保证一致性,你的手上就乱七八糟。但创建对象的代码可能(或者至少希望如此)是合理的。好的,这里有一个执行此任务的通用算法,与您使用的语言和图形库无关
Vector verts[65000]; // 65000 vertex positions
Triangle faces[87000]; // as an example, 87000 triangles
Vector normals[65000]; // 1 normal per vertex - initialised to (0, 0, 0)
// loop over all faces to calculate vertex normals
for (int i=0 ; i<87000 ; i++)
{
Vector v1 = verts[faces[i].vertex1];
Vector v2 = verts[faces[i].vertex2];
Vector v3 = verts[faces[i].vertex3];
Vector edge1 = v2 - v1;
Vector edge2 = v3 - v1;
Vector normal = edge1.CrossProduct(edge2); // or edge2.CrossProduct(edge1)
normal.Normalise();
normals[faces[i].vertex1] += normal;
normals[faces[i].vertex2] += normal;
normals[faces[i].vertex3] += normal;
}
// vertex normals need to be normalised
for (int i=0 ; i<65000 ; i++)
{
normals.Normalise();
}
矢量顶点[65000];//65000个顶点位置
三角形面[87000];//例如,87000个三角形
向量法线[65000];//每个顶点1法线-初始化为(0,0,0)
//在所有面上循环以计算顶点法线
对于(inti=0;iOK),这里有一个执行此任务的通用算法,与您使用的语言和图形库无关
我假设你想计算顶点法线,也就是说,每个顶点有一条法线
除了65000个顶点位置外,我还假设你有一些定义网格中三角形的索引列表,例如,网格中的三角形1由顶点3、7和24组成。无论你有三角形列表、条带或其他网格面的描述,它们基本上都是一样的:它们描述某种类型一种确定特定面的顶点的方法。这种方法之间的差异通常与效率有关,但它并没有真正改变这种算法背后的基本思想
首先需要计算网格中每个三角形的法向量。对于顶点位置向量a、b和c的三角形,计算三角形中两条边的边向量,例如edge1=b-a、edge2=c-a。然后取这两条向量的叉积,得到该三角形的法向量。结果如下:交叉积的方向是一个需要归一化的向量
一旦所有三角形法线都有了