VEX —— Quaternion|Euler Angle

目录

一,四元数相关概念

四元数

欧拉角

常用四元数相关函数

相互转换

二,案例

案例:沿面中心翻转

案例:路径导弹

案例:RBD刚体还原过渡


一,四元数相关概念

四元数

  • 在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)

注,可使用Transform节点应用欧拉角;

常用四元数相关函数

dihedral()

quaternion()

qrotate()

qmultiply()

qinvert()

qdistance()

qconvert()

eulertoquaternion()

quaterniontoeuler()

slerp()

相互转换

//矩阵转四元数
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));

二,案例

  • 设置旋转,dihedral,quaternion,orient(可用于copy);
  • 合并旋转,qmultiply
  • 应用旋转,qrotate

案例:沿面中心翻转

//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;
//方法二,使用maketransform
vector pivot = (pos0+pos1+pos2+pos3)/4;
vector axis = normalize(pos1-pos0);//直接绕axis旋转
float ang = @Time;
vector4 q_r = quaternion(ang, axis);
vector r = degrees(quaterniontoeuler(q_r, 0));@P *= maketransform(0,0,0,r,1,pivot,0);//绕x轴旋转,中心点旋转偏移到axis
float ang = @Time;
vector dir = set(1,0,0);
vector r = dir * degrees(ang);
vector4 q_pr = dihedral(dir, axis);
vector pr = degrees(quaterniontoeuler(q_pr, 0));@P *= maketransform(0,0,0,r,1,pivot,pr);
//方法三,使用函数instance
vector pivot = (pos0+pos1+pos2+pos3)/4;
vector axis = normalize(pos1-pos0);float ang = @Time;
vector4 orient = quaternion(ang, axis);
@P *= instance(pivot,0,1,0,orient,pivot);
//方法二,手搓矩阵(即将本身或局部坐标系恢复到世界坐标系,旋转后,在还原到原坐标系)
vector center = (pos0+pos1+pos2+pos3)/4;
vector xaxis = normalize(pos1-pos0);
vector yaxis = normalize(prim(0,'N',@primnum));
vector zaxis = normalize(cross(xaxis, yaxis));matrix m = set(xaxis, yaxis, zaxis, center);
m.xa = m.ya = m.za = 0;
@P *= invert(m);float ang = @Time;
vector4 q = quaternion(ang, set(1,0,0));
@P = qrotate(q, @P);@P *= m;

案例:路径导弹

//方法一
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;

案例:RBD刚体还原过渡

  • RBD刚体的中心和质心(rest信息)的区别;

注,pack对象intrinsic属性

  • transform,存储旋转信息,使用setprimintrinsic函数设置;
  • packedfulltransform,存储所有的变换信息(只读);
//DOP内部还原的原始位置为rest,注意设置input端口
//直接用rbdbulletsolver(SOP),原始位置还是originP
float bias = chramp('bias', fit(@Frame-@offset*10,75,125,0,1));
matrix3 cm = primintrinsic(0, 'transform', @ptnum);
matrix3 blend = slerp(cm, 3@m, pow(bias,2));
setprimintrinsic(0, 'transform', @ptnum, blend);
v@P = lerp(@P, v@rest, bias);
float bias = chramp('bias', fit(@Frame-@offset*10,75,125,0,1));
matrix fm = getpackedtransform(0, @ptnum);
vector t = cracktransform(0, 0, 0, 0, 4@fm);
translate(4@fm, -t);
translate(4@fm, v@rest);
matrix blend = slerp(fm, 4@fm, bias);
setpackedtransform(0, @ptnum, blend);

案例:拉直螺旋线

  • 原理1:以0号点为中心旋转1号点及后续所有点到Y轴上,在以1号点为中心旋转2号点及后续所有点到Y轴上,依次类推;可使用solver或循环(在旋转一次的基础在旋转,容易理解);
  • 原理2,每层循环记录上次循环的上一个拉直点(prepos);每层循环先移动到原点旋转Y轴,在加上prepos;
  • for等循环体内的point()始终都是读取输入端口的属性,setpointattrib始终会在输出时设置;
//solver节点内,detail层级
int i = @Frame;
vector pos0 = point(0, 'P', i-1);
vector pos1 = point(0, 'P', i);
vector4 rot = dihedral(pos1-pos0, set(0,1,0));vector pos = qrotate(rot, pos1-pos0);
setpointattrib(0, 'P', i, pos+pos0);for(int j=i+1; j<npoints(0); j++){vector pos2 = point(0, 'P', j);pos2 = qrotate(rot, pos2-pos0);setpointattrib(0, 'P', j, pos2+pos0);
} 
//point层级,每层循环互不关联
vector prepos = 0;for(int i=1; i< @Frame; i++){vector pivot  = point(0, 'P', i-1);vector pos = point(0, 'P', i);    vector4 rot = dihedral(pos-pivot, set(0,1,0));    if(@ptnum>=i){vector mpos = qrotate(rot, @P-pivot);//@P=mpos+prepos; //会对下一循环影响setpointattrib(0, 'P', @ptnum, mpos+prepos);}prepos = qrotate(rot, pos-pivot)+prepos;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BigDecimal 类型的累加操作

BigDecimal 累加操作 .add操作

C语言:深入浅出qsort方法,编写自己的qsort完成冒泡排序

目录 什么是qsort&#xff1f; 函数原型 比较函数 compar 排序整型数组 排序结构体数组 根据成员字符排序 strcmp函数 根据成员整型排序 自定义qsort实现冒泡排序 qsort的实现原理 具体步骤 快速排序示例代码&#xff1a; 什么是qsort&#xff1f; qsort是 C …

geoserver发布同一字段的多值渲染

Geoserver之同一字段的多值渲染 有时候我们需要对一个shp的某一字段值中的不同值进行区分展示&#xff0c;但是一般的渲染都是按照统一图层展示的&#xff0c;因此为了更好的效果&#xff0c;我们选择使用uDig等工具处理。 文章目录 Geoserver之同一字段的多值渲染前言一共是分…

休眠和睡眠有哪些区别?如何让电脑一键休眠?

电脑中有休眠和睡眠&#xff0c;那么它们有什么区别呢&#xff1f;下面我们就通过本文来了解一下。 休眠和睡眠的区别 电脑在睡眠状态时&#xff0c;会切断内存之外的设备电源&#xff0c;电脑会进入睡眠状态&#xff0c;当再次唤醒电脑后&#xff0c;不会影响睡眠前保存好的工…

机器学习练习1

线性回归 数据集模型,第一列代表人口,第二列代表利润 此处的线性回归 与 常规的 y wx b 不同的是 将b换成了w的一部分 故需要在数据集x前面加个1, 求出b . 可以简化计算,只需要一个乘法就可以

网络安全入门必学内容

网络安全入门 必/学/内/容/ 随着时代的发展&#xff0c;经济、社会、生产、生活越来越依赖网络。而随着万物互联的物联网技术的兴起&#xff0c;线上线下已经打通&#xff0c;虚拟世界和现实世界的边界正变得模糊。这使得来自网络空间的攻击能够穿透虚拟世界的边界&#xff0…

vscode中 vue3+ts 项目的提示失效,volar插件失效问题解决方案

文章目录 前情提要bug回顾解决方案最后 前情提要 说起来很耻辱&#xff0c;从mac环境换到window环境&#xff0c;vscode的配置都是云端更新过来的&#xff0c;应该是一切正常才对&#xff0c;奇怪的是我的项目环境出现问题了&#xff0c;关于组件的ts和追踪都没有效果&#xff…

vscode设置pycharm中的项目路径和debug方法

真大佬在这 真大佬在这 必须给大佬star 命令行运行&#xff1a; export PYTHONPATH:pwd:/home/bennie/bennie/bennie_project/AI_Lab python main.py 当关闭此命令行时&#xff0c;临时路径会清除&#xff0c;可以将上述export的整条语句&#xff0c;加入~/.bashrc中 该命令中…

重磅发布 OpenAI 推出用户自定义版 ChatGPT

文章目录 重磅发布 OpenAI 推出用户自定义版 ChatGPT个人简介 重磅发布 OpenAI 推出用户自定义版 ChatGPT OpenAI 首届开发者大会 (OpenAI DevDay) 于北京时间 11 月 7 日凌晨 02:00 开始&#xff0c;大会上宣布了一系列平台更新。其中一个重要更新是用户可以创建他们自己的自定…

从零开始的C++(十四)

继承&#xff1a; 作用&#xff1a;减少重复代码&#xff0c;简化程序。 用法&#xff1a; class b&#xff1a;public a {//...b中成员 } 在如上代码中&#xff0c;b类以public的方式继承了a类。规定a类是父类、基类&#xff0c;b类是子类、派生类。 关于继承方式&#xf…

Qt::WindowFlags

Qt::WindowFlags 文章目录 Qt::WindowFlags摘要窗口&部件Qt::WindowFlags&WindowType窗口类型窗口提示 关键字&#xff1a; Qt、 Qt::WindowFlags、 Qt::WindowType、 关键字4、 关键字5 摘要 今天在公司解决自己的Bugs的时候&#xff0c;发现一个以前可以用的功…

在Kotlin中设置User-Agent以模拟搜索引擎爬虫

前言 随着双十一电商活动的临近&#xff0c;电商平台成为了狂欢的中心。对于商家和消费者来说&#xff0c;了解市场趋势和竞争对手的信息至关重要。在这个数字时代&#xff0c;爬虫技术成为了获取电商数据的有力工具之一。本文将以亚马逊为例&#xff0c;介绍如何使用Kotlin编…

软件测试面试题【2023最新合集】

收集了各大公司的面试经验&#xff0c;现整理出来&#xff0c;希望能给正在找工作的志同道合的小伙伴一些指引&#xff0c;本文会持续更新的哦。 1、 CPU 和 GPU的区别 一个是通用计算&#xff0c;一个是专用计算。 CPU主要负责操作系统和应用程序&#xff0c;GPU主要负责跟…

【BUG解决】服务器没报警但是应用接口崩了....

最近遇到一个突发问题&#xff1a;服务器没报警但是应用接口崩了… 为其他业务系统提供一个接口&#xff0c;平时好好的&#xff0c;突然就嚷嚷反馈说访问不了了&#xff0c;吓得我赶紧跳起来&#xff01; 正常情况下在系统崩溃前&#xff0c;我会收到很多系统报警&#xff0…

【AI编程】ai编程插件汇总iFlyCode、codegeex

1、iFlyCode 开发公司&#xff1a;讯飞 支持IDE: VS Code、IntelliJ IDEA、CLion、PyCharm、WebStorm 支持语言: Python、JavaScript、C、Java 下载地址&#xff1a;https://iflycode.xfyun.cn/ iFlyCode 快捷键列表&#xff1a;  Tab 采纳建议  Esc 拒绝建议  Alt\ 主动…

CSDN每日一题学习训练——Java版(对给定的两个日期之间的日期进行遍历、子集 II、填充每个节点的下一个右侧节点指针)

版本说明 当前版本号[20231107]。 版本修改说明20231107初版 目录 文章目录 版本说明目录对给定的两个日期之间的日期进行遍历题目解题思路代码思路参考代码 子集 II题目解题思路代码思路参考代码 填充每个节点的下一个右侧节点指针题目解题思路代码思路参考代码 对给定的两…

Flink架构

1、Apache Flink集群的核心架构&#xff1a; 1、client&#xff08;作业客户端&#xff09;&#xff1a;提交任务的地方叫做客户端 2、JobManager&#xff08;作业管理器&#xff09;&#xff1a;作用是用于管理集群中任务 3、TaskManager&#xff08;任务管理器&#xff09;&a…

WPF布局与控件分类

Refer&#xff1a;WPF从假入门到真的入门 - 知乎 (zhihu.com) Refer&#xff1a;WPF从假入门到真的入门 - 知乎 (zhihu.com) https://www.zhihu.com/column/c_1397867519101755392 https://blog.csdn.net/qq_44034384/article/details/106154954 https://www.cnblogs.com/mq0…

unittest 统计测试执行case总数,成功数量,失败数量,输出至文件,生成一个简易的html报告带饼图

这是一个Python的单元测试框架的示例代码&#xff0c;主要用于执行测试用例并生成测试报告。其中&#xff0c;通过unittest模块创建主测试类MainTestCase&#xff0c;并加载其他文件中的测试用例&#xff0c;统计用例的执行结果并将结果写入文件&#xff0c;最后生成一个简单的…

无人机航迹规划:五种最新智能优化算法(KOA、COA、LSO、GRO、LO)求解无人机路径规划MATLAB

一、五种算法&#xff08;KOA、COA、LSO、GRO、LO&#xff09;简介 1、开普勒优化算法KOA 开普勒优化算法&#xff08;Kepler optimization algorithm&#xff0c;KOA&#xff09;由Mohamed Abdel-Basset等人于2023年提出。五种最新优化算法&#xff08;SWO、ZOA、EVO、KOA、…