Unity 四元数

【Unity中的数学】—— 四元数 四元数总忘 得看看嗷 阅读详情

 

2011-03-23

1,Quaterion 四元数

四元数可理解为一个旋转轴向量和一个旋转角度。注意:这里不是点绕轴旋转,而是一个矢量绕轴旋转。旋转后得到的也是一个矢量。因此,如果想要计算某个点P绕着某个固定的轴旋转一个角度后的点的坐标,那么首先需要在轴上固定一点S, 连接SP组成矢量。用四元数计算旋转后的矢量,再加上S点坐标,就得到了旋转后的坐标。

例:计算某点绕某一轴旋转一定的角度后的点的坐标

static function RotateAroundPoint(point : Vector3, pivot : Vector3, angle : Quaternion) : Vector3

{

     var finalPos : Vector3 = point - pivot;

     //Center the point around the origin

     finalPos = angle * finalPos;

     //Rotate the point.

     finalPos += pivot;

     //Move the point back to its original offset.

     return finalPos;

}

var newPos = SomeClass.RotateAroundPoint(Vector3.forward, Vector3.zero, Quaternion.Euler(0, 90, 0) );

Debug.Log(newPos);

//Prints (1, 0, 0) or is it (-1, 0, 0 )?  Something like 2.html

四元数其他网址

http://hi.baidu.com/czx_main/blog/item/71468e3690f438390a55a992.html

http://oulehui.blog.163.com/blog/static/796146982011273184592/

http://www.cnblogs.com/softimagewht/archive/2010/11/16.html

一般来说,三维空间上没有顺时针或者逆时针的概念。只有当我们确定了一个视线方向时,才区分顺时针和逆时针。大部分四元数规定都是,从旋转轴的反方向看过去,逆时针的角度为正。比如你的旋转轴为z轴正方向(例如从屏幕伸出来的那个轴),那么我向屏幕望去(也就是z轴反方向)看去,逆时针旋转的角度为正,顺时针为负。除非你用的四元数做了特殊规定,否则大部分都是这样的。

2,Gimbal Lock万向锁和EulerAngle欧拉角

Gimbal Lock 视频:http://www.cnblogs.com/mavaL/articles/1860354.html

 

2011-03-24

Transform

1,.transform.forward 物体在世界坐标系下z轴的方向,如下图所示

transform.forward = (1,0,0)而Vector3.forward则表示世界坐标系z轴的方向,即:(0,0,1)

测试实例:

transform.Translate(transform.forward*Time.deltaTime);//

物体每秒钟将相对自身坐标系移动(1,0,0)个单位,即:向下移动。

transform.Translate(Vector3.forward*Time.deltaTime);//

物体每秒钟将相对自身坐标系移动(0,0,1)个单位,即:向右移动。

2,transform. Rotate (eulerAngles : Vector3, relativeTo : Space = Space.Self)

       注意eulerAngle的旋转是有顺序的。Unity中是按照z-x-y的顺序旋转的。

3,transform.RoateAround (point : Vector3, axis : Vector3, angle : float)

可以实现一个物体绕另一个物体旋转. 例:

transform.RotateAround(_target.transform.position,Vector3.up,Time.deltaTime*_speed);// 绕_target物体旋转,旋转轴为y轴

(Vector3.up, Time.deltaTime*_speed);//绕y轴旋转,注意区分:

transform.RotateAround(transform.up, Time.deltaTime*_speed);

4,function TransformDirection (direction : Vector3) : Vector3

//将局部坐标转换为世界坐标,例:

Vector3 vecRet = transform.TransformDirection(Vector3.right);//将局部坐标系下(1,0,0)点转换为世界坐标系下的点。vecRet的值为(0,0,-1).该值和transform.right的值等价,

5,InverseTransformDirection(Vector3.right)返回值为(0,0,-1),如下图所示:

例:

relativePosition = cameraTransform.InverseTransformDirection(transform.position - cameraTransform.position);

6,transform.TransformPoint(2,0,0);//

Let's say that if you hold your right arm straight out to the side, the local-space coordinate (2, 0, 0) is at the tips of your fingers. No matter where you go or how you orient yourself, as long as you keep your arm straight out, the tips of your fingers will still be at exactly the same location in local space.

However, as you move and re-orient yourself, the world-space position of the tips of your fingers is constantly changing. This is what TransformPoint() does; it takes the local-space coordinate ((2, 0, 0) in this case) and converts it to a world-space coordinate based on the current transform for the object (the object being you in our example).

例:在距离当前物体的右侧2个单位的距离的位置处创建一个_target物体。

Instantiate(_target, transform.TransformPoint(Vector3.right*2), transform.rotation);

.InverseTransformPoint()将世界坐标系下的点转化成相对坐标系下的点,如:在Inspector面板上显示的物体的坐标为世界坐标系下的点,如果调用该函数的话,则返回值为(0,0,0)

transform.InverseTransformPoint(new Vector3(2630.192f, 763.5179f,1161.068f));

7, static function FromToRotation (fromDirection : Vector3, toDirection : Vector3)

将物体的fromDirection方向旋转到toDirection方向,例:将物体x、z的角平分线的方向(1,0,1)旋转至世纪坐标系z轴的方向。

public Vector3 _fromDir;

public Vector3 _toDir;

Quaternion q = Quaternion.identity;

q.SetFromToRotation(_fromDir, _toDir);

//等价于 q = Quaternion.FromToRotation(_fromDir, _toDir);

transform.rotation = q;

print(transform.right.ToString());

旋 转 前

旋 转 后

8,Quaternion.()

         建立一个旋转使z轴朝向view  y轴朝向up.其功能与LookRotation一样

9,Quaternion.AngleAxis(angle : float, axis:Vector3)

Create a rotation which rotates angle degrees around axis

创建一个绕着axis旋转angle度的旋转,例:

transform.rotation = Quaternion.AngleAxis(30.0f, Vector3.up);//将物体的旋转角度设置成绕Y轴旋转30度。无论物体以前的旋转如何,最终的旋转就是上面代码所设置的旋转。如图所示:

转 前

旋 转 后

10,Quaternion.Angle()

计算两个旋转之间的夹角。跟Vector3.Angle(a : Quaternion, b : Quaternion) 作用一样。

参考网址:http://www.cnblogs.com/softimagewht/archive/2010/11/16.html

 

11,Unity3D 使用的是左手坐标系,即:Z轴方向),握向右方(X轴方向),

大拇指的方向即为Y轴方向。

 

【Unity编程】四元数(Quaternion)与欧拉角 四元数是高阶复数的数学,它用在游戏中的作用主要是计算三维矢量的旋转,它使用先将矢量映射到纯虚四元数,再应用旋转四元数的方式进行映射。最后可以达成旋转目的。 阅读详情

相关推荐

【Unity编程】Unity中关于四元数的API详解

Unity中关于四元数的API详解Quaternion类Quaternion(四元数)用于计算Unity旋转。它们计算紧凑高效,不受万向节锁的困扰,并且可以很方便快速地进行球面插值。 Unity内部使用四元数来表示所有的旋转。

Andrew的游戏世界 1万+

Unity-四元数

0.0

qq_42705793的博客 1445

【Unity技巧】四元数(Quaternion)和旋转

四元数介绍旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的一种了。大家应该都听过,有一种旋转的表示方法叫四元数。按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转。矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉选择则是按照一定的坐标轴顺序(例如先x、再y、最后z)、每个轴旋转一定角度来变换坐标或向量,它实际上是一系列坐标轴旋转的组合。那...

weixin_34367257的博客 1万+

Unity——四元数

万向节死锁 可以理解为有两个轴重合在了起,导致只能对物体两个方向进行旋转 实数:有理数和无理数 虚数:I^2 = -1 复数:实数+虚数 四元数<x,y,z>theta 超复数:(x,y,z,w) X = n x * sin(theta/2) Y = n y * sin(theta/2) Z = n z * sin(theta/2) W = cos(theta/2) //通过四元数,让cu...

m0_51743362的博客 3456

Unity 四元数与欧拉角的相互转换及推导

懒惰的我终于也要写第一篇博客啦~由于需求需要在控制台中对unity的四元数与欧拉角进行相互转换 而网上的文章大多没有推导过程 并且坐标系或欧拉角的旋转顺序与unity不一致 所以自己动笔算了算 在此记录一下~ 首先感谢这个小姐姐的这篇文章。以及文章中的以下四个链接给予我的启发 1. Euler To Quaternion 2.Quaternion To Euler 3.AngleAxis T

qq1545372477的博客 6574

unity四元数学习总结--FromToRotation

上节介绍了,算是LookRotation的内部实现,这一节来介绍下unity的FromToRotation函数。 FromToRotation(from,to)这个函数主要的作用是计算将物体从一个旋转态转移到另一个旋转态的四元数,即将from旋转至to需要的四元数,与上一节不同的时,此时旋转对应欧拉角Z分量不一定为0了。 (1)FromToRotation 计算公式 主要计算思路是分别将两...

weixin_42275416的博客 5613

unity3d————四元数概念

四元数也可以表示为q = [w, v],其中v = (x, y, z)是矢量,w是标量。虽然v是矢量,但它不能简单地理解为3D空间的矢量,而是在4维空间中的矢量。综上所述,四元数是一种在三维空间中表示旋转的数学结构,由实数部分和三个虚数部分组成。它们具有独特的性质和运算规则,并广泛应用于计算机图形学、机器人学等领域。四元数的引入为三维旋转的表示和处理提供了新的思路和方法。

2401_82978699的博客 2571

【Unity每日一记】Unity中的计时器——4种方法的实现

实现计时的四个简单方法

秩沅 4008

Unity四元数总结

四元素用法总结

lichoueve的博客 2161

【Unity每日一记】Unity中的四元数(Quaternion)

Quaternion

秩沅 2611

Hypermesh到Abaqus CEL网格转换全攻略:解决欧拉体导入难题

本文详细解析了Hypermesh到Abaqus CEL网格转换的全流程,重点解决欧拉体导入难题。通过单元类型转换、INP文件编辑和多组件合并技术,实现流固耦合仿真的高效前处理。文章包含实用脚本和工程案例,帮助工程师突破ABAQUS CEL分析中的网格转换瓶颈。

weixin_30832143的博客 192

关于Unity 中的四元数

表示一个三维旋转有N中方法

dragonchow123的专栏 1472

LVGL开发新选择:深度对比NXP GUI Guider与SquareLine Studio,免费版够用吗?

本文深度对比了LVGL开发中两款主流工具NXP GUI Guider与SquareLine Studio的核心差异,包括功能定位、设计能力、代码生成质量和硬件适配等方面。针对不同项目需求,分析了免费版工具的适用性,帮助开发者根据预算和功能需求做出明智选择。特别关注了GUI设计工具在嵌入式开发中的实际应用效果。

weixin_26976635的博客 434

unity 中的数学 之 四元数

四元数得多看看 ,很容易忘

咩咩的博客 705

“基于车载车机 ADB 的安卓自动化测试”以及“类似智谱 AutoGLM 的 AI 安卓自动化项目”的整理和选型建议。

本文系统梳理了安卓自动化测试两大路线。传统ADB框架中,**Appium**适用于企业级测试,**AndroidViewClient**和**Airtest**适合脚本化与图像识别场景。AI驱动的方案里,**智谱Open-AutoGLM**擅长中文场景的视觉理解与操作,**DroidRun**支持多模型与跨平台,而**Android-MCP**则适合将安卓能力作为工具集成到现有AI平台。选型需根据稳定性、技术栈与AI集成需求决定。

weixin_39072720的博客 903

FPGA笔试题知识点汇总(21~40)

FPGA笔试题知识点汇总(21~40)

weixin_52487896的博客 5891

Unity中的四元数和旋转

文章目录四元数 四元数 四元数用来表示一个物体的位置,或者旋转。这两种其实是等价的。我们可以说一个三维向量(x,y,z)(x,y,z)(x,y,z)可以表示一个物体的空间位置,也可以表示位移。因为任何一个三维向量可以表示原物体相对于位置(0,0,0)(0,0,0)(0,0,0)的位移。同样,一个四元数表示的物体位置也可以看作是一个物体相对于初始四元数(0,0,0,0)(0,0,0,0)(0,0,0...

Terie的博客 1609

生物信息学名词解释 | K-mer (长度为k的短序列)

K-mer 何谓K-mer 所谓Kmer,即为一段长度为k的DNA片段,是由测序reads剪切一部分得到的。k为一个奇数,k=几,就为几mer。 比如:我的测序reads长度为100bp,我将这100bp打断成17bp的短片段,打断后的17bp段片段就叫17mer,可以获得(100-17+1)条k-mer序列。 Table1 k-mers for GTAGAGCTGT. k k-mers 1 G,T,A,G,A,G,C,T,G,T 3 GTA,TAG,AGA,GAG,AGC,GCT,CT

qq_50637636的博客 2万+

Unity中的四元数

Q=[cos(β/2),sin(β/2)x,sin(β/2)y,sin(β/2)z](四元数是简单的超复数,主要在三维空间中表示旋转,四元数Q则表示绕着轴n旋转β度的旋转量)当某个特定轴达到某个特殊值时,绕一个轴旋转可能会覆盖住另外一个轴旋转,从而失去一维自由度,在Unity中,X轴达到90度时会产生万向节死锁。表示没有旋转量(角位移),当角度为0或者360度时对于给定轴就会得到单位四元数。(轴-角对:在3D空间中,任意旋转都可以表示绕着某一个轴旋转一个旋转角得到,两个四元数相乘得到一个新的四元数。

2303_76354097的博客 590

systrace分析 之 问题初步定位

如下surfaceflinger空缺点,上面对应的bufferTX 中有buffer,但VSYNC-SF 过来后,SurfaceFlinger却没有去取,检查测试app “android.settings”, 也没有GPU completion 时间长的问题,所以该部分可以请SurfaceFlinger的owner 进一步确认为何不取buffer。. GPU拿的是acquireFence HWC拿的是releaseFence, GPU是绘图,HWC是合成显示,这两个是互相等待的关系,

yangzex的专栏 3197

出现 has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the 解决方法

Access to XMLHttpRequest at 'http://127.0.0.1:5000/api/data' from origin 'http://10.197.0.79:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

码农研究僧的博客 1万+

Unity四元数,欧拉角

欧拉角 优点:三个角度组成,直观,容易理解。 优点:可以进行从一个方向到另一个方向旋转大于180度的角度。 优点:由三个数字实现旋转效率相比要高。 弱点:死锁问题。 四元数 内部由四个数字(在Unity中称为x,y,z和w)组成,然而这些数字不表示角度或轴,并且通常不需要直接访问它们。除非你特别有兴趣深入了解四元数学,你只需要知道四元数表示三维空间中的旋转,你通常不需要知道或修改x,y和z属性。 优点:四元旋转不存在万向节锁问题。 优点:存储空间小,

weixin_45223588的博客 3933

把 SAP BTP Destination 写进 MTA:一段 com.sap.application.content 配置背后的部署编排学

MTA内容模块解析:SAP BTP中的声明式部署机制 本文详细解析了mta.yaml中com.sap.application.content模块在SAP BTP云环境中的作用。该模块通过声明式配置实现内容投递,无需编译或部署代码。核心功能包括: Destination创建:通过content-target:true标识将配置投递到Destination服务 HTML5应用部署:将静态资源投递到HTML5 Application Repository 安全集成:配置XSUAA服务实现OAuth2用户令牌交换

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 166
上一篇: 如何判断全角半角
下一篇: 线线相交 (Unity代码)
Yanger_xy
博客等级 码龄18年 60粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值