目录
一,四元数相关概念
四元数
欧拉角
常用四元数相关函数
相互转换
二,案例
案例:沿面中心翻转
案例:路径导弹
一,四元数相关概念
四元数
- 在vex内四元数为((x,y,z),w);
如绕某向量 K=(, , ) 旋转,则四元数为:
- (x,y,z) = (, , ) *
- w =
- 且满足条件:+++=1
欧拉角
由环绕三个轴旋转的角度组成的矢量表示
- 绕著x轴的旋转(Roll),绕著交点线的旋转(Pitch),绕著z轴的旋转(Yaw);
- 任何旋转矩阵都是由三个基本旋转矩阵复合而成的;
- 绕固定(参考)坐标轴旋、绕自身坐标轴旋转,这两种方式的所获得的旋转矩阵转是一样的;
常用四元数相关函数
quaternion()
qrotate()
dihedral()
qmultiply()
qinvert()
qdistance()
eulertoquaternion()
quaterniontoeuler()
qconvert()
相互转换
//矩阵转四元数 matrix m = detail(1, 'xform'); vector4 q = quaternion(matrix3(m));
//四元数转矩阵 vector4 q = quaternion(ch('ang'), chv('axis')); matrix3 m = qconvert(q);
//欧拉角转矩阵或四元数 v@euler_angle = degrees(chv('ang')); vector4 q = eulertoquaternion(@euler_angle); matrix3 m = qconvert(q);
//四元数或矩阵,获取欧拉角 matrix m = detail(1, 'xform'); vector4 q = quaternion(matrix3(m)); v@euler_angle = degrees(quaterniontoeuler(q, 0));
二,案例
案例:沿面中心翻转
//point层级
int pts[] = primpoints(0, @primnum);
vector pos0 = point(0, 'P', pts[0]);
vector pos1 = point(0, 'P', pts[1]);
vector pos2 = point(0, 'P', pts[2]);
vector pos3 = point(0, 'P', pts[3]);
vector center = (pos0+pos1+pos2+pos3)/4;
vector axis = normalize(pos1-pos0);
@P -= center;
float ang = @Time;
vector4 q = quaternion(ang, axis);
@P = qrotate(q,@P);
@P += center;
案例:路径导弹
//方法一
vector tangentu = -primuv(1, 'tangentu', 0, ch('u'));
vector tangentv = primuv(1, 'tangentv', 0, ch('u'));
vector pos = primuv(1, 'P', 0, ch('u'));
vector4 rot1 = dihedral(set(1,0,0), tangentu);
vector4 rot2 = quaternion(@Time*10, set(1,0,0));
vector4 rot = qmultiply(rot1, rot2);
//如不是pack物体
@P = qrotate(rot, @P) + pos;
//如是pack物体,使用以下代码
@P = pos;
matrix3 m = qconvert(rot);
setprimintrinsic(0, "transform", 0, m);
//方法二
vector x_axis = -primuv(1, 'tangentu', 0, ch('u'));
vector y_axis = primuv(1, 'tangentv', 0, ch('u'));
vector z_axis = cross(x_axis, y_axis);
vector pos = primuv(1, 'P', 0, ch('u'));
matrix m = set(normalize(x_axis), normalize(y_axis), normalize(z_axis), pos);
vector4 q = quaternion(@Time*10, set(1,0,0));
@P = qrotate(q, @P);
@P *= m;