环境:MAX2018
源于MaxScript的API和网络资料
NOTE:max的矩阵是3x4的矩阵
创建一个矩阵:
matrix3
例子:
matrix3 [0,0,0] [0,0,0] [0,0,0] [0,0,0]
如果只想创建一个0矩阵的话:matrix3 0 (matrix3 [0,0,0] [0,0,0] [0,0,0] [0,0,0])
如果只想创建一个单位矩阵的话: matrix3 1 (matrix3 [1,0,0] [0,1,0] [0,0,1] [0,0,0])
将quat,angleaxis,eulerangles转换为旋转矩阵的方法
如果想获得一个绕某一个轴旋转的矩阵的话:
rotateXMatrix
rotateYMatriy
rotateZMatriz
这里写个?测试一下上面说的吧
---------------------------------------------
rotateXMatrix 10
(matrix3 [1,0,0] [0,0.984808,0.173648] [0,-0.173648,0.984808] [0,0,0])
这里的意思是得到一个绕着X轴选择10度的选择矩阵。怎么验证呢?
这里修改一下上面的测试:
tmp = rotateXMatrix 10
这样tmp就拿到了返回值
tmp.rotationpart
返回:(quat -0.0871556 0 0 0.996195)
tmp.translationpart
返回:[0,0,0]
tmp.scalepart
返回:[1,1,1]
这样就看出来这个矩阵里只有rotation部分是变化的。
rotation部分返回了一个四元数。
tmp.rotationpart as angleaxis
返回:(angleAxis 9.99999 [-1,0,0]),这里看的出来是绕着x轴旋转了9.9999999999999999999度
tmp.rotationpart as eulerangles
返回:(eulerAngles 9.99999 0 0) 这里也看的出来x轴的值是9.999999999999999999999度
---------------------------------------------
上面说了旋转矩阵的介绍,接下来说一下位移矩阵的介绍
transMatrix
transMatrix [10,0,0]
返回:(matrix3 [1,0,0] [0,1,0] [0,0,1] [10,0,0])
浅显易懂,就不必多言了
再说一下缩放矩阵
scaleMatrix
scaleMatrix [2,3,4]
返回 : (matrix3 [2,0,0] [0,3,0] [0,0,4] [0,0,0])
上图来自:http://www.chrobotics.com/library/understanding-euler-angles
如果想根据yaw pitch roll去做一个矩阵呢:
下面下个方法要注意左右手坐标系。上图只是个演示图,不要用上图去考虑。
rotateYPRMatrix
rotateYPRMatrix 0 10 0
如果想要根据法线去new一个矩阵的:
matrixFromNormal
-----------------------------------------------------------------
简单个做一个测试:
normalMatrix = matrixFromNormal [1,0,0]
返回:(matrix3 [0,1,0] [0,0,1] [1,0,0] [0,0,0])
(我的理解是:这个api会构建了一个法线空间下的转换矩阵)
-----------------------------------------------------------------
矩阵的基本(部分)操作
获取矩阵的某一行
或者
其中row4跟translation是一样的。
拆分矩阵:
获得矩阵的行列式的符号:
复制一个矩阵:
copy
如果直接赋值的话,是引用。
判断矩阵是否是单位矩阵
isIdentity
求矩阵的逆
inverse
将矩阵转换到另一个空间
xformMat
其实上面这个方法的执行命令就是:space_matrix3 * transform_matrix3 * inverse(space_matrix3).
单位化矩阵:identity
零化矩阵:zero
正交化矩阵:orthogonalize
修改矩阵的位移旋转缩放部分
translate
rotateX
rotateY
rotateZ
rotate
scale
上面这一串都是右乘,下面这一串都是左乘
preTranslate
preRotateX
preRotateY
preRotateZ
preRotate
preScale
还有几个是GetEulerMatAngleRatio,等有时间写欧拉的时候在一起把
-----------------------------------------------------------------------------------------------------也是基本都是API-------------------------
####################################以上基本都不需要看####################################
放一个源码,调整物体的pivot
思路:把物体的transform用目标的transform代替,然后再去做objectoffsetXXX,矫正回原来的位置
fn SetPivotOnly obj target =
(
with redraw off
(
ResetPivot obj
local preTrans = copy obj.transform
local curTrans = target
if classof target != matrix3 then curTrans = target.transform
--排除目标物体(目标矩阵)中的scale
local row1_new = normalize(curTrans.row1)
local row2_new = normalize(curTrans.row2)
local row3_new = normalize(curTrans.row3)
--添加自身矩阵的scale
local preScalePart = preTrans.scalePart
curTrans.row1 = row1_new * preScalePart[1]
curTrans.row2 = row2_new * preScalePart[2]
curTrans.row3 = row3_new * preScalePart[3]
obj.transform = curTrans
--计算旋转变换矩阵
local deltaMat = preTrans * (inverse curTrans)
obj.objectOffsetRot = deltaMat as quat
local pos_world = preTrans.row4 - curTrans.row4
local pos_new = (xformMat (transMatrix pos_world) curTrans).row4
obj.objectOffsetPos = pos_new
)
)
--------------------------------------------------------------下面要来源于网络了---------------------------------------------------------------------------
max or maya Transform Matrix
将max的矩阵转到maya的空间中
mayaMatrix = (matrix3 [1,0,0] [0,0,1] [0,-1,0] [0,0,0])
mat3 = $.transform
resultmat3 = xformmat mat3 mayaMatrix
获得物体的local矩阵
$.transform * (inverse $.parent.transform)
$.transform.controller.value
---上面两种方式都可以
--------------------------------------------------------------------------------------------------------------------------------------------------------------------