【问题标题】:How to determine ordering of 3D vertices如何确定 3D 顶点的顺序
【发布时间】:2010-01-01 07:20:32
【问题描述】:

如果我在 3D 坐标空间中有 5 个顶点,我如何确定这些顶点的顺序。即顺时针或逆时针。

如果我详细说明这一点,

我有一个由一组多边形组成的 3D 模型。每个多边形都是顶点的集合,我想计算多边形表面的范数。要计算范数,我必须按逆时针顺序考虑顶点。我的问题是给定一组顶点我如何确定它是顺时针还是逆时针排列?


这是用于生成导航网格,我想删除代理无法行走的多边形。为此,我的方法是计算表面范数(多边形的垂直向量)并根据与 2D 平面的角度移除多边形。为了计算规范,我应该知道点的排列顺序。那么对于多边形中给定的一组点,我如何确定点的排列顺序。

例如。

polygon1 由 Vertex1 = [-21.847065 -2.492895 19.569759]、Vertex2 [-22.279873 1.588395 16.017160]、Vertex3 [-17.234818 7.132950 7.453146] 这三个点组成,我如何确定它们的顺序

【问题讨论】:

  • 你会在mathoverflow.net获得更好的运气。
  • 在 3D 空间中没有顺时针或逆时针之类的东西。顺时针或逆时针仅适用于 2D 平面。如果您想首先将顶点投影到 2D 平面上,则由您来定义该平面。如前所述,您的问题毫无意义。
  • 我很困惑;您的顶点是否已经排序并且您想要确定顺序,或者它们是随机排序的并且您想要将它们按顺序排列?您是否也知道要做出此决定,顶点需要映射到平面,并且需要将一侧声明为前面?通常排序用于指定三角形是否面向相机。无论哪种方式,您为什么要这样做以及使用什么语言和/或框架?或者这是一个家庭作业问题?

标签: math


【解决方案1】:

正如其他人所指出的,您的问题并不完全清楚。类似于3D backface culling 测试吗?如果是这样,则需要一个点来确定相对的缠绕方向。从多边形的一侧看,顶点看起来是顺时针旋转的。从另一边看,它们似乎是逆时针旋转的。

但是假设你的多边形是凸面的并且是平面的。取任意三个连续的顶点 A、B 和 C。然后你可以使用 cross product 找到 surface normal 向量:

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

将法线的dot product 与来自给定视点 V 的向量一起带到其中一个顶点将为您提供一个值,其符号表示从 V 观察时顶点的缠绕方式:

w = N . (A - V)

顺时针方向是正数,逆时针方向是负数还是相反,取决于您的坐标系的手性。

【讨论】:

  • 因此,如果对于所有顶点我们都有负值或正值,则缠绕顺序始终为 CCW 或 CW。对吗?
【解决方案2】:

您的问题定义太差,无法给出完整的答案,但这是一个框架。

缺失的部分(如果你愿意的话是肉)是一个函数,它采用任意两个坐标并告诉你哪个比另一个“更大”。如果对此没有明确的定义,您将无法使任何事情发挥作用。

其余的,骨架,非常简单。使用比较函数对向量列表进行排序。对于五个向量,您只需要一个简单的bubble sort,但如果顶点数量显着增加,您可能需要研究一种更快的排序算法(即Quicksort)。

如果您选择的语言/库为您提供排序,那么您已经有了自己的骨架。

编辑 重新阅读您的问题后,我还想到,由于这些 n 个顶点定义了一个多边形,您可能可以假设它们都位于同一平面上(如果它们不位于同一平面上,那么祝您渲染 那个)。

因此,如果您可以将矢量坐标映射到该平面上的二维位置,您可以将问题简化为在二维空间中顺时针或逆时针排列它们。

【讨论】:

    【解决方案3】:

    我认为您的困惑来自这样一个事实,即计算叉积的方法有时是根据顺时针方向教授的,检查 3 点 A、B、C 的顺时针方向确定以下符号: (B-A) X (C - A) 然而,更好的定义实际上为您确定了这一点。 一般来说,3维中的5个任意点不能说是顺时针排列,但是3个可以,因为3个点总是在一个平面上。

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 2010-11-15
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多