MaxScript Matrix学习总结

环境:MAX2018

源于MaxScript的API和网络资料

 

NOTE:max的矩阵是3x4的矩阵

创建一个矩阵

matrix3 <row1_point3> <row2_point3> <row3_point3> <row4_point3>

例子:

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

<quat> as matrix3

<angleaxis> as matrix3

<eulerangles> as matrix3

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

rotateXMatrix <number>

rotateYMatriy <number>

rotateZMatriz <number>

这里写个?测试一下上面说的吧

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

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 <point3>

transMatrix [10,0,0]

返回:(matrix3 [1,0,0] [0,1,0] [0,0,1] [10,0,0])

浅显易懂,就不必多言了

再说一下缩放矩阵

scaleMatrix <point3>

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 <yaw_number> <pitch_number> <roll_number>

rotateYPRMatrix 0 10 0

如果想要根据法线去new一个矩阵的:

matrixFromNormal <point3>

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

简单个做一个测试:

normalMatrix = matrixFromNormal [1,0,0]

返回:(matrix3 [0,1,0] [0,0,1] [1,0,0] [0,0,0])

(我的理解是:这个api会构建了一个法线空间下的转换矩阵)

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

矩阵的基本(部分)操作

<matrix3> + <matrix3>

<matrix3> - <matrix3>

<matrix3> * <matrix3>

<matrix3> as <class>

获取矩阵的某一行

<matrix3>[<integer>]

或者

<matrix3>.row1: Point3

<matrix3>.row2: Point3

<matrix3>.row3: Point3

<matrix3>.row4: Point3

<matrix3>.translation: Point3

其中row4跟translation是一样的。

拆分矩阵:

<matrix3>.rotationpart: Quat, read-only

<matrix3>.translationpart: Point3, read-only

<matrix3>.scalerotationpart: Quat, read-only

<matrix3>.scalepart: Point3, read-only

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

<matrix3>.determinantsign: Integer, read-only

复制一个矩阵:

copy <matrix3>

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

判断矩阵是否是单位矩阵

isIdentity <matrix3>

求矩阵的逆

inverse <matrix3>

将矩阵转换到另一个空间

xformMat <transform_matrix3> <space_matrix3>

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

单位化矩阵:identity <matrix3>

零化矩阵:zero <matrix3>

正交化矩阵:orthogonalize <matrix3>

修改矩阵的位移旋转缩放部分
translate <matrix3> <point3>

rotateX <matrix3> <number>

rotateY <matrix3> <number>

rotateZ <matrix3> <number>

rotate <matrix3> <quat>

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

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

preTranslate <matrix3> <point3>

preRotateX<matrix3> <number>

preRotateY<matrix3> <number>

preRotateZ<matrix3> <number>

preRotate<matrix3> <quat>

preScale <matrix3> <point3> [ <boolean> ]

 

还有几个是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
---上面两种方式都可以

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

 

 

 

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值