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
的法线和切线来做同样的事情
我对矩阵数学很生疏,对于如何使用来自曲线信息节点上的 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
的法线和切线来做同样的事情