立体光刻(STL)文件中的三角形顶点绕组顺序(三角形对象)

时间:2012-01-03 17:03:02

标签: 3d cad 3d-modelling

我正在研究STL文件导入程序,并认为我会使用正常给定来确定三角形缠绕顺序。下面包括具有4个三角形的样本数据(原始数据具有超过70k个三角形)。假设顶点是逆时针指定的,我的代码的逻辑计算法线,然后使用提供的法线计算此计算法线的点积。如果结果是正的,那么我假设是逆时针方向,否则顺时针方向。

        tm.SetCCW(Dot(Cross(facet.getVertex2() - facet.getVertex1(),facet.getVertex3() - facet.getVertex1()),facet.getNormal()) > 0.0);

此逻辑在特定3D扫描仪的一组文件上失败。当我将这些文件加载​​到Rhino3D中,并发出“Dir”来查看正常方向时,Rhino的方向是正确的!与我尝试过的其他一些STL观众相同。

我的代码推断顶点是按样本数据的顺时针顺序提供的,但是当使用该绕组顺序时,模型是由内向外的,这意味着提供的法线是错误的。

这使我得出这样的结论:STL导入器的惯例是忽略所提供的法线,并假设逆时针缠绕顺序。我正在寻找有更多STL文件格式经验的人来衡量我的假设是否正确。

solid object_name
    facet normal -0.651094 0.733745 -0.194150
        outer loop
            vertex 30.335684 -40.893806 -68.126500
            vertex 31.155055 -39.911656 -67.162500
            vertex 30.263726 -40.702583 -67.162500
        endloop
    endfacet
    facet normal -0.654292 0.732059 -0.189714
        outer loop
            vertex 30.335684 -40.893806 -68.126500
            vertex 31.225185 -40.098797 -68.126500
            vertex 31.155055 -39.911656 -67.162500
        endloop
    endfacet
    facet normal -0.711866 0.677947 -0.183397
        outer loop
            vertex 31.225185 -40.098797 -68.126500
            vertex 31.980540 -39.044870 -67.162500
            vertex 31.155055 -39.911656 -67.162500
        endloop
    endfacet
    facet normal -0.714326 0.676343 -0.179716
        outer loop
            vertex 31.225185 -40.098797 -68.126500
            vertex 32.048799 -39.228928 -68.126500
            vertex 31.980540 -39.044870 -67.162500
        endloop
    endfacet
endsolid

编辑:我对第一个方面的计算:

p1 = {30.335684, -40.893806, -68.126500}
p2 = {31.155055, -39.911656, -67.162500}
p3 = {30.263726, -40.702583, -67.162500}

u = p2 - p1 = {0.819371, 0.98215, 0.964}
w = p3 - p1 = {-0.071958, 0.191223, 0.964}

u x w = {0.762454, -0.859241, 0.227356}   (calculated normal)

given normal = {-0.651094, 0.733745, -0.194150}

calculated_normal <dot> given_normal = -1.17103

verdict: 90 < theta < 270 where theta is the angle between the calculated and given normals

1 个答案:

答案 0 :(得分:1)

当从对象外部查看顶点时,顶点应按逆时针顺序排列。 (显然,从对象内部查看它们是顺时针顺序)。

法线应指向外部。

我已经读过一些程序忽略了法线并且只通过顶点排序,我甚至读过建议将法线设置为{0.0,0.0,0.0},尽管规范说明了法线和应该使用顶点顺序。

虽然正常是多余的。对于许多程序,顶点顺序就是必要的。我不知道所有节目是否一般都是如此。我建议两者都正确。