VEX —— Quaternion|Euler Angle

2023-11-05 14:20
文章标签 angle vex euler quaternion

本文主要是介绍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=(K_{x}K_{y}K_{z}) 旋转\theta,则四元数为:

  • (x,y,z)  =  (K_{x}K_{y}K_{z}) *  \sin \frac{\theta }{2} 
  • w =  \cos \frac{\theta }{2} 
  • 且满足条件:x^{2}+y^{2}+z^{2}+w^{2}=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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/350426

相关文章

【UVa】 10735 Euler Circuit 混合图的欧拉回路 最大流

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1676 题目要求:求混合图的欧拉回路+输出路径。 题目分析: 先看一段比较流行的说法吧~: -----------------------------------------

Angle Between Hands of a Clock

Given two numbers, hour and minutes, return the smaller angle (in degrees) formed between the hour and the minute hand. Answers within 10-5 of the actual value will be accepted as correct. Example 1

BCLinux Euler 21.10 安装mysql 8.0.37 (二进制安装)

下载mysql安装包 #根据ldd --version的信息, 下载的是glic 2.28的包。下载地址:https://downloads.mysql.com/archives/community/包名:mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz #root用户操作#系统环境:BigCloud Enterprise Linux For E

Unity3D - 详解Quaternion类(二)

转自:http://www.cnblogs.com/tgycoder/p/5106463.html 四、Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法、Dot方法、Euler方法、FromToRotation方法、Inverse方法、Lerp方法、LookRotation方法、RotateToWards方法和Slerp方法。关于静态的方法的使

Unity3D - 详解Quaternion类(一)

转自:http://www.cnblogs.com/tgycoder/p/5103966.html 一、简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念。四元数的乘法不符合交换律。从明确地角度而言,四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话,四元数就代表着一个四维空间,相对于复数为二维

UnityEngine.Quaternion.LookRotation详解

首先, 处于3D空间中的每个对象, 实际上都有自己的局部坐标系, 而旋转某个对象时, 其局部坐标系也会跟着旋转。 所以, 如果可以描述某个对象的局部坐标系(每根轴的朝向), 就可以表示该对象的旋转程度。 Quaternion LookRotation(Vector3 forward, Vector3 upwards); 这个函数就是根据对局部坐标轴的描述, 构造对应的代表旋转

车辆姿态角(Euler角)Pitch、Yaw、Roll 的设定

首先申明:此坐标系是针对车辆而设定的,对于无人机来说是不同的。 pitch():俯仰角,pitchAngleC2W (orientation radian Y) yaw():航向角,yawAngleC2W (orientation radian Z) roll():横滚角,rollAngleC2W (orientation radian X)

Project Euler 92

Square digit chains Problem 92 A number chain is created by continuously adding the square of the digits in a number to form a new number until it has been seen before. For example, 44 → 32

project euler problem 35求一个数的所有循环数都是素数的总共有多少个

这题刚开始想到的是怎么求出这些循环数,然后求出来以后判断就容易多了。但是刚开始想的是用取模和相除的求出的循环数,但是有点麻烦,而且程序总有点问题,所以我就想了另外的一个思路。以前记得做题的时候有道题也是关于循环数的,而循环数可以先把它变成字符串,然后这个字符串再连接自己的字符串,如:15234,连接后为:1523415234,然后就可以知道这些循环数了,即第二个数为从第二位取5个数为:52341,

求解常微分方程初值问题之多步Euler预报-校正法

//实现多步Euler法 #include <iostream> #include <math.h> #include <iomanip> using namespace std; class multi_euler { private:  int i, n;  double f, h, x, x_last, yc, yc_old, yp; public:  double func(doub