找到四边形的旋转(4点,平面)

问题描述 投票:0回答:1

如何找到四边形的旋转? (它是平面的) 让我们说有一个未知的随机旋转四边形像这样:

enter image description here 最终的旋转值应该输出如下:enter image description here

我找到了第一个矢量(y),但不知道如何完成这个...

vec1 = pt2 - pt1
vec2 = pt3 - pt1

cross1 = vec1.cross(vec2).normal()
angle = pm.angleBetween(euler=1, v1=(0,-1,0), v2=cross1)
python 3d maya
1个回答
2
投票

获得代表该方向的矩阵很容易;你可以从那个向后工作到轮换。

如果您确定四边形是平面的,则可以使用面法线(应该等于任何顶点面法线)。如果没有,您可以像在示例中尝试的那样从交叉向量派生它。如果几何图形实际上是平面的,则结果将是相同的。

要组装矩阵,您只需要三个彼此正常的向量。使用图像隐含的XYZ顺序,它将如下工作:

import pymel.core as pm
from pymel.core.datatypes import Matrix, Vector, TransformationMatrix

points = [Vector(pm.xform('pPlane1.vtx[%i]' % i, q=True, t=True, ws=True))  for i in range(4)]

local_x = (points[1] - points[0]).normal()
local_z = (points[2] - points[0]).normal()
local_y = local_x.cross(local_z).normal()

为了更好的衡量,获得四边形的质心,以便我们可以使它成为我们将创建的矩阵的位置 - 它更容易调试:

centroid = sum(points) / 4.0

现在我们构建实际的矩阵。为了更清楚,这是一个稍微冗长的方式将它组合在一起:

 matrix = TransformationMatrix (
               local_x.x, local_x.y, local_x.z, 0,
               local_y.x, local_y.y, local_y.z, 0,
               local_z.x, local_z.y, local_z.z, 0,
               centroid.x, centroid.y, centroid.z, 1
     )

请注意,您需要pymel.datatypes.TransformationMatrix,这是Matrix类的特化,可以为您处理euler和四元数转换等内容。

为确保正确完成,您可以使用矩阵制作定位器并设置其位置。您应该在图像中得到相同的排列:

locator = pm.spaceLocator()
pm.xform(locator, m=matrix, ws=True)

如果你的工作在厘米以外的单位,你可能需要将centroid乘以转换因子;也就是说,如果你以米为单位,你将centroid乘以100.如果你的定位器看起来有偏差,你应该检查四边形上的点顺序,以确保它符合你的期望。

一旦你的矩阵是正确的,获得一个euler或四元数很简单:

eulers = matrix.getRotation()
quat = matrix.getRotationQuaternion()

再检查docs for TransformationMatrix

© www.soinside.com 2019 - 2024. All rights reserved.