MaxScript Matrix学习总结

环境: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转换为旋转矩阵的方法

as matrix3

as matrix3

as matrix3

如果想获得一个绕某一个轴旋转的矩阵的话:

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])

MaxScript Matrix学习总结_第1张图片

上图来自: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会构建了一个法线空间下的转换矩阵)

-----------------------------------------------------------------

矩阵的基本(部分)操作

+

-

*

as

获取矩阵的某一行

[]

或者

.row1: Point3

.row2: Point3

.row3: Point3

.row4: Point3

.translation: Point3

其中row4跟translation是一样的。

拆分矩阵:

.rotationpart: Quat, read-only

.translationpart: Point3, read-only

.scalerotationpart: Quat, read-only

.scalepart: Point3, read-only

获得矩阵的行列式的符号:

.determinantsign: Integer, read-only

复制一个矩阵:

copy

如果直接赋值的话,是引用。

判断矩阵是否是单位矩阵

isIdentity

求矩阵的逆

inverse

将矩阵转换到另一个空间

xformMat

其实上面这个方法的执行命令就是:space_matrix3 * transform_matrix3 * inverse(space_matrix3).

单位化矩阵:identity

零化矩阵:zero

正交化矩阵:orthogonalize

修改矩阵的位移旋转缩放部分
translate

rotateX

rotateY

rotateZ

rotate

scale [ ]   只说一下这个的最后一个boolean参数,如果为True,位移部分会被缩放;false,不缩放位移部分。

上面这一串都是右乘,下面这一串都是左乘

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
---上面两种方式都可以

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

你可能感兴趣的:(Max.ms)