【问题标题】:How to check three vertices of triangle are in cyclic order or anticyclic order?如何检查三角形的三个顶点是循环顺序还是反循环顺序?
【发布时间】:2016-02-15 09:51:44
【问题描述】:

我的目标是检查 STL 文件中三角形的法线方向是否一致??

例如。 STl 文件如下,我想检查所有方面是否在同一个方向,即向外。??

面法线 0 0 -1

outer loop
  vertex -20.5411 -4.36615 0
  vertex -16.9894 -12.3435 0
  vertex -19.1845 -8.54147 0
endloop

端面

面法线 -0.994522 0.104528 0

outer loop
  vertex -21 0 0
  vertex -21 0 2
  vertex -20.5411 4.36615 0
endloop

端面

我想通过顶点的叉积来计算法线,但是我怎么知道方向??

我读到“循环单位向量的叉积是正的”。但是我应该如何在我的问题中使用这个规则呢??

谁能帮帮我??我真的被困在这里:(

【问题讨论】:

    标签: c# 3d geometry coordinate-systems


    【解决方案1】:

    检查法线的点积和2个边缘方向的叉积的符号,例如给定正常的N 和点ABC

    ((B - A) x (C - A)) * N
    

    叉积应该产生与法线方向相同的向量,因为ST两个向量的点积是

    S * T = |S| * |T| * cos(theta)
    

    其中theta 是向量之间的角度,当且仅当方向正确时,这应该是正的。 (这里假设三角形没有2个点在同一位置)

    Java 代码示例(使用javafx.geometry.Point3D):

    boolean check(Point3D normal, Point3D p1, Point3D p2, Point3D p3) {
        return p2.subtract(p1)
                .crossProduct(p3.subtract(p1))
                .dotProduct(normal) > 0;
    }
    

    【讨论】:

    • 感谢 Fabian,但我不明白这将如何帮助我检查 stl 文件的所有三角形是否在同一方向(如果顶点在,则根据右手定则朝外)逆时针方向)??还有一件事,在少数 STL 文件中,默认情况下没有给出法线,所以我将使用叉积进行计算,然后对其进行归一化。
    • 给定函数比较两个三角形...但是我怎么知道在给定的一组三角形中哪个三角形的方向正确(即哪个三角形朝外??)所以我将法线作为参考三角形并检查所有剩余的三角形。请让我知道...我整天都很困惑
    【解决方案2】:

    找到Z坐标较高的三角形,检查法线是几乎向外(Z+方向)还是几乎向内(Z-方向)。一旦知道这一点,只需移动到未访问的相邻三角形,检查法线是否翻转并将它们标记为已访问。

    访问完所有三角形后,停止。

    【讨论】:

    • 几乎向外或向内方向是什么意思?你能给我请告诉我如何知道给定的三角形是朝外还是朝内??
    • 需要检查世界Z方向与最高三角形法线的夹角是否接近于零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多