Maya python 从曲线上的点得到正确的矩阵分解

Maya python get correct matrix decomposition from point on curve

我对矩阵数学很生疏,对于如何使用来自曲线信息节点上的 Maya 点的向量正确计算 3x3 旋转矩阵,我有点迷茫。我能够轻松获得 4x4 矩阵中的位置,因为这只是简单地将位置向量放入正确的矩阵值中。

我在 google 上读了很多关于它的内容,但不同的来源似乎对如何正确构建它有不同的说法。

目前我想构建一个这样的矩阵,但不确定这是否正确:

TanU.x  TanU.y  TanU.z 0
Norm.x  Norm.y  Norm.z 0
TanV.x  TanV.y  TanV.z 0
pos.x   pos.y   pos.z  1

从我在曲线节点上的观点来看,我有以下向量: 位置 普通的 切线

我不确定如何获得 tangentu 和 tangentv。认为这是在计算网格法线时基于 u 和 v space?

我正在尝试获得与此处页面底部的示例类似的结果,只是为了开始,但是一旦我开始使用它,我就有了一堆正确的 4x4 矩阵的用途,它将帮我解决问题:http://www.chrisevans3d.com/pub_blog/maya-python-vector-math-primer/#comment-191332

不幸的是,在示例中您看不到连接到交叉产品的内容,而这正是我真正需要的。

非常感谢任何建议或帮助!

如果你有曲线上点的法线和切线,你只需要这两个的交叉向量作为你的第三个向量。这些向量的顺序是约定俗成的,不是一成不变的——但要得到一个好的矩阵,你需要三个向量彼此成直角。

假设您有一条法线和一条切线:

from maya.api.OpenMaya import MVector, MMatrix
import maya.cmds as cmds

normal_vector = MVector(*cmds.getAttr('pointOnCurveInfo1.result.normal')).normal()
tangent_vector = MVector(*cmds.getAttr('pointOnCurveInfo1.result.tangent')).normal()
cross_vector = normal_vector ^ tangent_vector
position = MVector(*cmds.getAttr('pointOnCurveInfo1.result.position'))
matrix = (
 tangent_vector[0], tangent_vector[1], tangent_vector[2], 0,
     normal_vector [0], normal_vector [1], normal_vector[2],  0,
     cross_vector[0],   cross_vector[1],   cross_vector[2],   0,
     position[0],       position[1],       position[2],       1
)

 # if you want it in api form so you can do multiplies, etc:
api_matrix = MMatrix(matrix)

api_matrix

如果你像克里斯的例子那样做,你需要一个 CrossProduct 节点连接到 pointOnCurveInfo 的法线和切线来做同样的事情