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

Maya python从曲线上的点获得正确的矩阵分解,python,matrix,rotation,maya,Python,Matrix,Rotation,Maya,我对我的矩阵数学非常生疏,对于如何使用曲线信息节点上maya点的向量正确计算3x3旋转矩阵,我有点迷茫。我能够很容易地得到4x4矩阵中的位置,因为这只是简单地将位置向量放入正确的矩阵值中 我在谷歌上读过很多关于它的文章,但不同的来源似乎对如何正确构建它有不同的看法 目前,我想我想构建一个这样的矩阵,但不确定这是否正确: 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

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

我在谷歌上读过很多关于它的文章,但不同的来源似乎对如何正确构建它有不同的看法

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

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
从曲线节点上的点开始,我有以下向量: 位置 正常的 切线

我不知道如何获得切线U和切线V。当计算网格法线时,是否认为这是基于u和v空间

我试图得到与本页底部示例相似的结果,只是为了开始,但一旦开始工作,我就可以使用一个正确的4x4矩阵,这将帮助我解决很多问题:

不幸的是,在这个例子中,你看不到我真正需要的是什么连接到交叉积上


非常感谢您的任何建议或帮助

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

假设有法线和切线:

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

如果你像Chris的例子那样做,你需要一个叉积节点连接到
PointOnSurveInfo
的法线和切线来做同样的事情如果你有曲线上点的法线和切线,你只需要这两个点的交叉向量作为第三个向量。这些向量的顺序是由惯例决定的,不是一成不变的——但是要得到一个好的矩阵,你需要三个彼此成直角的向量

假设有法线和切线:

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

如果你像Chris的例子那样做,你需要一个连接到
PointOnSurveInfo
的法线和切线的叉积节点来做同样的事情!我试过了,它似乎奏效了。但是比例值似乎没有正确传递?我不需要这个例子的刻度,所以一切都很好。谢谢你澄清了这一点,我想我现在对它的工作原理有了更好的理解。因为这些是标准化的,所以它应该始终是1,1,1。看起来好像有个打字错误,我现在正在修。太棒了!我试过了,它似乎奏效了。但是比例值似乎没有正确传递?我不需要这个例子的刻度,所以一切都很好。谢谢你澄清了这一点,我想我现在对它的工作原理有了更好的理解。因为这些是标准化的,所以它应该始终是1,1,1。看起来有个打字错误,我正在修