【问题标题】:Finding left/right vertices to a point in a triangle in 3D在 3D 中查找到三角形中某个点的左/右顶点
【发布时间】:2013-12-13 03:53:49
【问题描述】:

给定一个 3D 三角形及其边上的一个点,我想找出该边的哪个顶点在该点的左侧,哪个在右侧。

请看下图:

在此图像中,顶点 v2v3 始终如图所示定位。在v3v2 之间还有一条线段。问题在于顶点v0v1,它们可能以交换顺序给出。我想知道v0 是在v3 的“左侧”还是“右侧”,以便我可以强制v0 始终位于其左侧,而v1 始终位于其右侧。

由于这个问题是 3D 的,我不确定如何有效地计算顶点的相对位置。我是否首先将其简化为二维问题(如果是,如何)还是有其他方法?

【问题讨论】:

  • 你如何定义“左”和“右”?您有外部观众职位吗?
  • 也许它不必是“左”和“右”,只要 v0 是序列中的第一个,v1 是最后一个。
  • 这仍然取决于您是从顶部还是底部查看三角形。您需要某种形式的参考框架才能判断序列中的顺序。
  • 嗯,我确实有一个外部查看器位置,但它可以围绕三角形旋转,所以我认为这不可靠。但是,三角形确实有一个法向量,所以这可能会有所帮助。

标签: c++ math graphics 3d


【解决方案1】:

求向量 v2-v3 和 v1-v2 的叉积。从产品的方向推导出方向。

向量是从平面向上还是向下。

如果我正确理解了您对左右的定义。

【讨论】:

    【解决方案2】:

    在 3d 中,“左”和“右”取决于观察者的位置(我们称这个位置为 P)。想象一下,您正在从另一侧查看该三角形,然后左右颠倒。因此,从位置 P 查看,您需要确定顶点是顺时针还是逆时针。

    为此,您可以计算:

    N = normalize( cross( v0 - v2, v1 - v2 ) );
    PV = normalzie( P - v2 );
    if( dot( PV, N ) > 0.0 )
    {
        //anticlockwise , so you are viewing the picture like in your drawing, then v0 is on the left of vector v3v2, and v1 is on the right
    }
    else
    {
        //clockwise, v0 is on the right
    }
    

    请注意,如果 dot 乘积几乎/或为 0,则 P 与您的三角形在同一平面上。

    【讨论】:

      【解决方案3】:

      正如 cmets 中所阐明的,“左”和“右”(或 v0v1 的任何其他顺序)取决于一些参考。你提到你知道三角形的法线向量(称之为N)——可以用作这样的参考。

      假设法线向量在您的示例图像中指向观察者。然后,计算v2 - v3v0 - v3 的向量积。这将指向与正常相同的半空间(意思是 v0 是“向左”),或指向相反的半空间(意思是 v0 是“向右”)。

      由于N垂直于三角形平面,如果vN之间的夹角小于90度,则向量v指向同一个半空间;换句话说,如果vN 的点积是正数。

      这些共同为您提供所需的排序标准。

      【讨论】:

      • 是的,这似乎是解决方案。在阅读了 Raxvan 的评论后,我认为可以这样做。
      猜你喜欢
      • 2010-12-03
      • 2015-05-27
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      相关资源
      最近更新 更多