我有几个平面多边形,它们由 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 坐标?
请您参考如下方法:
首先考虑多边形的三个非共线点 p0、p1 和 p2,然后计算
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)
然后将计算出的局部轴 locx 和 locy 归一化
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]
其中点是标量乘积运算符:
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
