Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
3d 三维曲面法线提取器_3d_Extract_Mesh - Fatal编程技术网

3d 三维曲面法线提取器

3d 三维曲面法线提取器,3d,extract,mesh,3d,Extract,Mesh,我有一个3D闭合网格对象,它有3D 65.000个位置坐标。 出于照明目的,我需要一个3D曲面法线提取器 你能帮我拿一下吗 谢谢 Richard既然你有索引,我假设它是一个三角形列表/条形图或扇形图。读每个三角形。通过取三角形向量中的2个来计算法线。不过你有一个问题。如果你不知道三角形的缠绕顺序,那么你可能会得到相反的值。哪个软件创建了网格?您能否在数据文件或软件中检查缠绕顺序?它是左手的还是右手的?既然你有索引,我假设它是一个三角形列表/条带或扇形。读每个三角形。通过取三角形向量中的2个来计算

我有一个3D闭合网格对象,它有3D 65.000个位置坐标。 出于照明目的,我需要一个3D曲面法线提取器

你能帮我拿一下吗

谢谢


Richard

既然你有索引,我假设它是一个三角形列表/条形图或扇形图。读每个三角形。通过取三角形向量中的2个来计算法线。不过你有一个问题。如果你不知道三角形的缠绕顺序,那么你可能会得到相反的值。哪个软件创建了网格?您能否在数据文件或软件中检查缠绕顺序?它是左手的还是右手的?

既然你有索引,我假设它是一个三角形列表/条带或扇形。读每个三角形。通过取三角形向量中的2个来计算法线。不过你有一个问题。如果你不知道三角形的缠绕顺序,那么你可能会得到相反的值。哪个软件创建了网格?您能否在数据文件或软件中检查缠绕顺序?它是左手的还是右手的?

你需要的只是组成三角形两边的向量的叉积,标准化为单位向量


正如安德鲁·基思(Andrew Keith)在他的评论中所说,当你从“外部”看三角形时,你最好知道三角形是顺时针或逆时针定义的。如果你不能保证一致性,你的手上就乱七八糟。但可能(或者至少希望如此)创建对象的代码是合理的。

您需要的只是组成三角形两侧的向量的叉积,标准化为单位向量


正如安德鲁·基思(Andrew Keith)在他的评论中所说,当你从“外部”看三角形时,你最好知道三角形是顺时针或逆时针定义的。如果你不能保证一致性,你的手上就乱七八糟。但创建对象的代码可能(或者至少希望如此)是合理的。

好的,这里有一个执行此任务的通用算法,与您使用的语言和图形库无关

  • 我假设你想计算顶点法线,也就是说,每个顶点有一条法线
  • 除了65000个顶点位置外,我还假设您有一些定义网格中三角形的索引列表,例如网格中的三角形1由顶点3、7和24组成。无论是三角形列表、条带还是网格面的其他描述,它们基本上都是一样的:它们描述了某种方法来确定特定面的顶点。这些方法之间的差异通常与效率有关,但这并没有真正改变该算法背后的基本思想
  • 首先需要计算网格中每个三角形的法线。对于顶点位置向量为a、b和c的三角形,计算三角形中两条边的边向量,例如edge1=b-a、edge2=c-a。然后取这两个向量的叉积,得到三角形的法向量。叉积的结果是需要归一化的向量
  • 计算完所有三角形法线后,将通过平均顶点所属每个三角形的法线来计算顶点的法线。可以直接对法线进行未加权平均,即,如果顶点是法线为n1、n2和n3的3个面的一部分,则顶点法线仅为(n1+n2+n3)/3。您还可以进行加权平均,其中总和中的每个三角形法线都由某个重要因子(如该三角形的面积)进行加权。这里没有正确的方法,你可以玩不同的东西。不管怎样,一旦计算出平均值,它也需要正常化。然而,这可以在一个步骤中完成,因为对于3个向量n1、n2和n3,归一化(n1+n2+n3)=归一化((n1+n2+n3)/3)
  • 现在,我必须强调的是,这只是一个粗略的描述,说明为了达到这一目的,需要完成哪些工作。为了提高效率,可以在某些方面进行削减。我的意思是,您不需要先计算所有三角形法线,然后再计算所有顶点法线-这两个步骤可以混合使用以提高效率

    一些伪代码可能看起来像这样

    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。然后取这两条向量的叉积,得到该三角形的法向量。结果如下:交叉积的方向是一个需要归一化的向量
  • 一旦所有三角形法线都有了