立体印刷(STL)文件(三角化物体)中的三角形顶点绕序。

3

我正在开发一个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

你如何看待STL文件中的三角剖分代码? - undefined
@HEWhoDoesn'tKnow 在STL文件中只有顶点和法线。如果我的回答没有帮助到你,请详细说明你的问题。 - undefined
嗯,我问这个是因为我的STL文件是二进制格式的,我看不到ASCII格式。 - undefined
@HEWhoDoesn'tKnow 我明白了。是的,STL文件有ASCII和二进制两种格式,我展示的是ASCII格式。二进制格式在这里有描述:https://en.wikipedia.org/wiki/STL_(file_format)#Binary_STL 如果你想要将其转换为人类可读的ASCII格式,编写一个转换程序并不难。另外,这个网站:https://www.meshconvert.com/ 声称可以在两种格式之间进行转换。 - undefined
1个回答

4
当从物体外部观察时,顶点应按逆时针顺序排列。(显然,从物体内部观察时它们则按顺时针顺序排列)。
法线应朝向外部。
我已经阅读过某些程序忽略法线并仅根据顶点顺序进行处理的情况,甚至还有一种建议是将法线设置为{0.0, 0.0, 0.0},尽管规范规定应同时使用法线和顶点顺序。
但是法线是多余的。对于许多程序,只需要顶点顺序即可。我不知道这是否普遍适用于所有程序。我建议两者都正确无误。

1
谢谢您的回复。您是否有关于STL文件中面应该按逆时针顺序排列的来源?根据我遇到的文件,似乎有超过90%的文件是这样的,我甚至在某个随机网页上读到过它们应该是逆时针的,但我从未见过明确的说明。 - undefined
我同意,从外部观察时,绕组顺序应为逆时针。坐标系统是右手坐标系,即 Z = 叉乘(X,Y)。然而,如果您使用的是左手坐标系,则绕组顺序将为顺时针。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接