获取3D空间中平面多边形顶点的局部2D坐标

Bos*_*ash 1 python 3d geometry

我有几个平面多边形,由它们在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]
Run Code Online (Sandbox Code Playgroud)

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

v1 = [0, 0]
v2 = [0, 1]
v3 = [1, 1]
v4 = [1, 0]
Run Code Online (Sandbox Code Playgroud)

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

650*_*502 7

你首先考虑的多边形的三个非共线点开始p0,p1p2,然后你计算

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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

然后你规范化计算的局部轴locxlocy

locx /= locx.length()
locy /= locy.length()
Run Code Online (Sandbox Code Playgroud)

最后点的本地坐标很简单

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

dot标量乘积运算符在哪里:

def dot(a, b):
    return a.x*b.x + a.y*b.y + a.z*b.z
Run Code Online (Sandbox Code Playgroud)

要从本地坐标(Lx, Ly)返回3D,转换是

p = loc0 + Lx*locx + Ly*locy
Run Code Online (Sandbox Code Playgroud)