本文主要是介绍VEX —— Quaternion|Euler Angle,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
一,四元数相关概念
四元数
欧拉角
常用四元数相关函数
相互转换
二,案例
案例:沿面中心翻转
案例:路径导弹
一,四元数相关概念
四元数
- 在vex内四元数为((x,y,z),w);
//VEX内获得四元数 vector4 quaternion(matrix3 rotations) //仅应用矩阵的旋转信息 vector4 quaternion(float angle, vector axis) vector4 quaternion(vector angleaxis) //方向为旋转轴,大小为旋转角度vector4 eulertoquaternion(vector rotations, int order)
注,数学运算,如绕某向量 K=(, , ) 旋转,则四元数为:
- (x,y,z) = (, , ) *
- w =
- 且满足条件:+++=1
欧拉角
由环绕三个轴旋转的角度组成的矢量表示
- 绕著x轴的旋转(Roll),绕著交点线的旋转(Pitch),绕著z轴的旋转(Yaw);
- 任何旋转矩阵都是由三个基本旋转矩阵复合而成的;
- 不同旋转顺序,结果不同,默认旋转顺序XYZ;
//VEX内获得欧拉角 vector quaterniontoeuler(vector4 orient, int order)
常用四元数相关函数
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;
这篇关于VEX —— Quaternion|Euler Angle的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!