如何找到四边形的旋转? (它是平面的) 让我们说有一个未知的随机旋转四边形像这样:
我找到了第一个矢量(y),但不知道如何完成这个...
vec1 = pt2 - pt1
vec2 = pt3 - pt1
cross1 = vec1.cross(vec2).normal()
angle = pm.angleBetween(euler=1, v1=(0,-1,0), v2=cross1)
获得代表该方向的矩阵很容易;你可以从那个向后工作到轮换。
如果您确定四边形是平面的,则可以使用面法线(应该等于任何顶点面法线)。如果没有,您可以像在示例中尝试的那样从交叉向量派生它。如果几何图形实际上是平面的,则结果将是相同的。
要组装矩阵,您只需要三个彼此正常的向量。使用图像隐含的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()