【问题标题】:Getting local 2D coordinates of vertices of a planar polygon in 3D space在 3D 空间中获取平面多边形顶点的局部 2D 坐标
【发布时间】:2021-03-29 03:22:45
【问题描述】:

我有几个平面多边形,它们是由它们在 3D 空间中的顶点定义的。这些多边形在 3 个维度上随机旋转。

现在我想在它们自己的本地 2D 空间中使用这些多边形顶点中的每一个。我真的不在乎这个本地空间的中心在哪里。我只需要 x & y 轴与多边形法线正交。

例如,如果我有一个多边形,它是一个宽度和高度为 1 的矩形,那么顶点可能如下所示:

v1 = [-0.558013, -0.0334937, -0.433013]
v2 = [0.308013, 0.466506, -0.433013]
v3 = [-0.308013, -0.466506, 0.433013]
v4 = [0.558013, 0.0334937, 0.433013]

但我希望它们看起来像这样:

v1 = [0, 0]
v2 = [0, 1]
v3 = [1, 1]
v4 = [1, 0]

所以我的问题是,如何将每个顶点的 3D 坐标转换为局部 2D 坐标?

【问题讨论】:

  • 似乎在示例情况下,您还希望局部 x 和 y 轴与多边形的某些边缘平行。否则,根据多边形相对于所选 2D 坐标系原点的旋转,可能有许多等效的 2D 坐标集。
  • @martineau 你是对的,但在我的情况下,围绕局部 z 轴的旋转并不重要。

标签: python 3d geometry


【解决方案1】:

首先考虑多边形p0p1p2 的三个非共线点,然后计算

loc0 = p0                       # local origin
locx = p1 - loc0                # local X axis
normal = cross(locx, p2 - loc0) # vector orthogonal to polygon plane
locy = cross(normal, locx)      # local Y axis

其中cross 是叉积运算符:

def cross(a, b):
    return P3d(a.y*b.z - a.z*b.y,
               a.z*b.x - a.x*b.z,
               a.x*b.y - a.y*b.x)

然后你对计算的局部轴 locxlocy 进行归一化

locx /= locx.length()
locy /= locy.length()

最后点的局部坐标很简单

local_coords = [(dot(p - loc0, locx),  # local X coordinate
                 dot(p - loc0, locy))  # local Y coordinate
                for p in points]

dot 是标量乘积运算符:

def dot(a, b):
    return a.x*b.x + a.y*b.y + a.z*b.z

要从局部坐标 (Lx, Ly) 返回到 3D,变换是

p = loc0 + Lx*locx + Ly*locy

【讨论】:

  • 我发现这是一个非常简洁易懂的解释。这个过程有什么名字吗?
【解决方案2】:

对于一个多边形,需要在多边形的平面上找到一个局部的2D基,在这个2D基上投影多边形每个顶点的3D坐标,得到2D坐标。在下文中,我还假设您正在寻找正交的 2D 基(多边形平面上的单位长度和正交 2D 基向量)。

一步一步:

  1. 计算多边形的(单位)法线n,假设顶点确实共面,

  2. 取多边形的第一条边,用它来定义二维基的第一轴u(单位向量),

  3. 使用 u 和 n (v = n x u) 用另一个轴 v 完成二维基础

  4. 在 (u, v, n) 3D 基础上投影每个顶点,这将给出其在多边形平面中的 2D 坐标。

例如,下面有五个顶点的多边形:

   M1 +----+ M3
      |      \
      |       + M4
      |      /
   M2 +----+ M5

其中M1 具有3D 坐标v1 = (x1, y1, z1)M2 具有3D 坐标v2 = (x2, y2, z2),等等...

  1. 平面法线单位为:n = (v2 - v1) x (v3 - v1) / |(v2 - v1) x (v3 - v1)|

  2. 二维基的第一轴为:u = (v2 - v1) / |(v2 - v1)|

  3. 二维基的第二个轴为:v = n x u

  4. 取多边形的一个顶点(或多边形平面中的任何点),例如M5

    那么它的3D坐标可以写在(u, v, n)的基础上,原点v1

      v5 = v1 + r5 * u + s5 * v + t5 * n
    
    
                (           ) ( r5 )   (  xu  xv  xn ) ( r5 )   (     ) ( r5 ) 
      v5 - v1 = (  u  v  n  ) ( s5 ) = (  yu  yv  yn ) ( s5 ) = (  B  ) ( s5 ) 
                (           ) ( t5 )   (  zu  zv  zn ) ( t5 )   (     ) ( t5 ) 
    

    其中t5应该为0(它是该点沿平面法线的坐标,所以如果该点位于多边形的平面上,则为0)。

    所以,求解(r5, s5, t5) 产生:

      ( r5 )                                    (  u  )
      ( s5 ) = B^-1 (v5 - v1) = B^T (v5 - v1) = (  v  ) ( v5 - v1 )
      ( t5 )                                    (  n  )
    

    因为B是正交矩阵(所以B^-1 = B^T)。

    最后,一个简单的:

      r5 = u . (v5 - v1)
      s5 = v . (v5 - v1)
    

    其中. 是向量点积。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2011-06-18
    • 2020-11-01
    • 2022-01-07
    相关资源
    最近更新 更多