Houdini中vex 矩阵变换
vector xform=chv('transform') , rot=chv('rot') , scale=chv('scale') ;
float tx=xform.x , ty=xform.y , tz=xform.z ;
float rx=radians(rot.x) , ry=radians(rot.y) , rz=radians(rot.z) ;
float sx=scale.x , sy=scale.y , sz=scale.z ;
vector4 r1 , r2 , r3 , r4 ;
r1 = set( sx*cos(ry)*cos(rz) , sx*cos(ry)*sin(rz) , -sx*sin(ry) , 0 ) ;
r2 = set( sy*(cos(rz)*sin(rx)*sin(ry)-cos(rx)*sin(rz)) , sy*(cos(rx)*cos(rz)+sin(rx)*sin(ry)*sin(rz)) , sy*cos(ry)*sin(rx) , 0 ) ;
r3 = set( sz*(sin(rx)*sin(rz)+cos(rx)*cos(rz)*sin(ry)) , sz*(cos(rx)*sin(ry)*sin(rz)-cos(rz)*sin(rx)) , sz*cos(rx)*cos(ry) , 0 ) ;
r4 = set( tx , ty , tz , 0 ) ;
//matrix m=set(r1,r2,r3,r4) ;
@P *= set(r1,r2,r3,r4) ;
能够实现基本的变换功能 ;
另外,根据矩阵求旋转向量的方法:
接着上面的代码
@x = atan2(r2.z/sy,r3.z/sz) ;
@y = asin(-r1.z/sx) ;
@z = atan2(r1.y/sx,r1.x/sx) ;
x,y,z分别对应绕各轴向的旋转角度 ;其中sx,sy,sz可由对应r1,r2,r3各个分量的平方和再开根号求得 ;