四元数 坐标变换表示物体的旋转角度二维数表示物体坐标,物体坐标向Z轴方向移动 求移动后的坐标,公式是什么啊

Unity3D 一行代码实现一个物体保持面向另一个物体(旋转)
我的图书馆
Unity3D 一行代码实现一个物体保持面向另一个物体(旋转)
今天准备学习和研究下unity3d的四元数 Quaternion
四元数在电脑图形学中用于表示物体的旋转,在unity中由x,y,z,w 表示四个值。
四元数是最简单的超复数。复数是由实数加上元素 i 组成,其中i^2 = -1 \,。 相似地,四元数都是由实数加上三个元素 i、j、k 组成,而且它们有如下的关系: i^2 = j^2 = k^2 = ijk = -1 \, 每个四元数都是 1、i、j 和 k 的线性组合,即是四元数一般可表示为a + bi + cj + dk \,。
具体的四元数知识可从百度、维基等网站了解。
/view/319754.htm
现在只说说在unity3D中如何使用Quaternion来表达物体的旋转。
基本的旋转我们可以用脚本内置旋转函数transform.Rotate()来实现。&
function Rotate (eulerAngles : Vector3, relativeTo : Space = Space.Self) : void
但是当我们希望对旋转角度进行一些计算的时候,就要用到四元数Quaternion了。我对高等数学来说就菜鸟一个,只能用最朴素的方法看效果了。
Quaternion的变量比较少也没什么可说的,大家一看都明白。唯一要说的就是x\y\z\w的取值范围是[-1,1],物体并不是旋转一周就所有数值回归初始值,而是两周。
初始值: (0,0,0,1)
沿着y轴旋转:180°(0,1,0,0) 360°(0,0,0,-1)540°(0,-1,0,0) 720°(0,0,0,1)&
沿着x轴旋转:180°(-1,0,0,0) 360°(0,0,0,-1)540°(1,0,0,0) 720°(0,0,0,1)
无旋转的写法是Quaternion.identify
现在开始研究Quaternion的函数都有什么用。
1)function ToAngleAxis (out angle : float, out axis : Vector3) : void
Description
Converts a rotation to angle-axis representation
这个函数的作用就是返回物体的旋转角度(物体的z轴和世界坐标z轴的夹角)和三维旋转轴的向量到变量out angle 和out axis
var a=0.0;
var b=Vector3.
transform.rotation.ToAngleAxis(a,b);
输入:transform.localEularAngles=(0,0,0);
输出: a=0, b=(1,0,0);
输入:transform.localEularAngles=(0,90,0);
输出:a=90, b=(0,1,0);
输入:transform.localEularAngles=(270,0,0);
输出:a=90, b=(-1,0,0)
2)function SetFromToRotation (fromDirection : Vector3, toDirection : Vector3) : void
Description
Creates a rotation which rotates from fromDirection to toDirection.
这个函数的作用是把物体的fromDirection旋转到toDirection
var a:Vector3;
var b:Vector3;
var headUpDir:Vector3;
q.SetFromToRotation(a,b);
transform.rotation=q;
headUpDir=transform.TransformDirection(Vector3.Forward);
输入:a=Vector3(0,0,1); b=Vector3(0,1,0)//把z轴朝向y轴
输出: q=(-0.7,0,0,0.7); headUpDir=(0,1,0)&
输入:a=Vector3(0,0,1); b=Vector3(1,0,0)//把z轴朝向x轴
输出: q=(0,0.7,0,0.7); headUpDir=(1,0,0)&
输入:a=Vector3(0,1,0); b=Vector3(1,0,0)//把y轴朝向x轴
输出: q=(0,0,-0.7,0.7); headUpDir=(0,0,1)&
3)function SetLookRotation (view : Vector3, up : Vector3 = Vector3.up) : void
Description
Creates a rotation that looks along forward with the the head upwards along upwards
Logs an error if the forward direction is zero.
这个函数建立一个旋转使z轴朝向view &y轴朝向up。这个功能让我想起了Maya里的一种摄像机lol,大家自己玩好了,很有趣。
var obj1: T
var obj2: T
q.SetLookRotation(obj1.position, obj2.position);
transform.rotation=q;
然后大家拖动obj1和obj2就可以看到物体永远保持z轴朝向obj1,并且以obj2的位置来保持y轴的倾斜度。
傻逗我玩了半天 哈哈^^ 这个功能挺实用的。
4)function ToString () : string
Description
Returns a nicely formatted string of the Quaternion
这个一般用不着吧?看不懂的一边查字典去~
Class Functions
1)四元数乘法 *
建议非特别了解的人群就不要用了。
作用很简单,c=a*b (c,a,b∈Quaternion)可以理解为 ∠c=∠a+∠b
但是a*b 和b*a效果不一样的。
&2) == 和 !=
3)static function Dot (a : Quaternion, b : Quaternion) : float
Description
The dot product between two rotations
点积,返回一个float. 感觉用处不大。Vector3.Angle()比较常用。
4)static function AngleAxis (angle : float, axis : Vector3) : Quaternion
Description
Creates a rotation which rotates angle degrees around axis.
物体沿指定轴向axis旋转角度angle, 很实用的一个函数也是。
var obj1: T
var obj2: T
//物体沿obj2的z轴旋转,角度等于obj1的z轴。
q=Quaternion.AngleAxis(obj1.localEularAngle.z, obj2.TransformDirection(Vector3.forward));
transform.rotation=q;
5)static function FromToRotation (fromDirection : Vector3, toDirection : Vector3) : Quaternion
Description
Creates a rotation which rotates from fromDirection to toDirection.
Usually you use this to rotate a transform so that one of its axes eg. the y-axis - follows a target direction toDirection in world space.
跟SetFromToRotation差不多,区别是可以返回一个Quaternion。通常用来让transform的一个轴向(例如 y轴)与toDirection在世界坐标中同步。
6)static function LookRotation (forward : Vector3, upwards : Vector3 = Vector3.up) : Quaternion
Description
Creates a rotation that looks along forward with the the head upwards along upwards
Logs an error if the forward direction is zero.
跟SetLootRotation差不多,区别是可以返回一个Quaternion。
7)static function Slerp (from : Quaternion, to : Quaternion, t : float) : Quaternion
Description
Spherically interpolates from towards to by t.
从from 转换到to,移动距离为t。也是很常用的一个函数,用法比较多,个人感觉比较难控制。当两个quaternion接近时,转换的速度会比较慢。
var obj1: T
var t=0.1;
//让物体旋转到与obj1相同的方向
q=Quaternion.Slerp(transform.rotation, obj1.rotation,t);
transform.rotation=q;
根据我个人推测,可能t 代表的是from 和to 之间距离的比例。为此我做了实验并证明了这一点即:
q=Quaternion.Slerp(a,b,t);
q,a,b∈Quaternion
q=a+(b-a)*t
并且t最大有效范围为0~1
var obj1: T
var obj2:Transform;
var t=0.1;
//让物体obj1和obj2 朝向不同的方向,然后改变t
q=Quaternion.Slerp(obj1.rotation, obj2.rotation,t);
transform.rotation=q;
t+=Input.GetAxis("horizontal")*0.1*Time.deltaTime;
7)static function Lerp (a : Quaternion, b : Quaternion, t : float) : Quaternion
Description
Interpolates from towards to by t and normalizes the result afterwards.
This is faster than Slerp but looks worse if the rotations are far apart
跟Slerp相似,且比Slerp快,.但是如果旋转角度相距很远则会看起来很差。
8)static function Inverse (rotation : Quaternion) : Quaternion
Description
Returns the Inverse of rotation.
返回与rotation相反的方向
9)static function Angle (a : Quaternion, b : Quaternion) : float
Description
Returns the angle in degrees between two rotations a and b.
计算两个旋转之间的夹角。跟Vector3.Angle() 作用一样。
10)static function Euler (x : float, y : float, z : float) : Quaternion
Description
Returns a rotation that rotates z degrees around the z axis, x degrees around the x axis, and y degrees around the y axis (in that order).
把旋转角度变成对应的Quaternion
以上就是Quaternion的所有函数了。
关于应用,就说一个,其他的有需要再补充。
Slerp 函数是非常常用的一个函数,用来产生旋转。
static function Slerp (from : Quaternion, to : Quaternion, t : float) : Quaternion
对于新手来说,最难的莫过于如何用它产生一个匀速的旋转。如果想用它产生匀速转动,最简单的办法就是把form和to固定,然后匀速增加t
var obj1: T
var obj2:Transform;
var speed:
var t=0.1;
q=Quaternion.Slerp(obj1.rotation, obj2.rotation,t);
transform.rotation=q;
t+=Time.deltaT
但是这并不能解决所有情况。 很多时候from 和to都不是固定的,而且上一个脚本也不能保证所有角度下的旋转速度一致。所以我写了这个脚本来保证可以应付大多数情况。
var target: T
var rotateSpeed=30.0;
var wantedRotation=Quaternion.FromToRotation(transform.position,target.position);
t=rotateSpeed/Quaternion.Angle(transform.rotation,wantedRotation)*Time.deltaT
q=Quaternion.Slerp(transform.rotation, target.rotation,t);
transform.rotation=q;
这个脚本可以保证物体的旋转速度永远是rotateSpeed。
第七行用旋转速度除以两者之间的夹角得到一个比例。
如果自身坐标和目标之间的夹角是X度,我们想以s=30度每秒的速度旋转到目标的方向,则每秒旋转的角度的比例为s/X。再乘以每次旋转的时间Time.deltaTime我们就得到了用来匀速旋转的t值
TA的最新馆藏
喜欢该文的人也喜欢Posts - 231,
Articles - 0,
Comments - 27
记录自己学习笔记和讨论技术的小窝。
17:51 by 阿诚de窝, ... 阅读,
该系列笔记基于Unity3D 5.x的版本学习,部分API使用和4.x不一致。
目前在Unity3D中,除了新的UGUI部分控件外,所有的物体(GameObject)都必带有Transform组件,而Transform组件主要是控制物体在3D空间中的位置、旋转以及缩放。
学习和掌握物体的变换是Unity3D开发者必备的基础知识。
最基础的变换就是通过脚本直接对物体的位置旋转缩放等进行变换。
我们下面实现一个匀速移动物体的效果,我们在场景中添加一个Cube物体,把下面的脚本绑定到摄像机上并把Cube拖拽赋予transfrom属性。
1 using UnityE
2 using System.C
4 public class Demo01Script : MonoBehaviour
public Transform myT
void Start()
void Update()
myTransform.position = new Vector3(myTransform.position.x, myTransform.position.y + 1.0f * Time.deltaTime, myTransform.position.z);
运行游戏,我们会发现Cube会匀速上升。我们回到编辑场景,对Cube进行任意的旋转后运行游戏该Cube仍然是向上上升,这是因为位置和旋转是相互独立的,我们直接操作位置的话程序是不会理会旋转属性的,更换为localPosition效果也是一致的。
根据物体方向匀速移动
我们发现如果使用上面的方法来按照物体面向的方向移动物体是不容易的,我们需要根据物体的朝向计算出x、y、z这3个分量的数值再应用回物体中才行,这需要扎实的3维运算功底,不过好在Unity已经给我们提供了大量的属性及方法,方便我们直接调用来达到我们需要的效果。
本地坐标系变量
transform.right:物体本地坐标的x轴正方向朝向,1米的单位。
transform.up:物体本地坐标的y轴正方向朝向,1米的单位。
transform.forward:物体本地坐标的z轴正方向朝向,1米的单位。
由于我们知道了物体本地坐标的信息,所以可以方便的通过这个来按照物体的朝向移动物体了,比如,下面的代码会朝着物体的y轴正方向每秒1米的速度匀速移动:
1 using UnityE
2 using System.C
4 public class Demo01Script : MonoBehaviour
public Transform myT
void Start()
void Update()
Vector3 pos = myTransform.
pos.x += myTransform.up.x * 1.0f * Time.deltaT
pos.y += myTransform.up.y * 1.0f * Time.deltaT
pos.z += myTransform.up.z * 1.0f * Time.deltaT
myTransform.position =
坐标系转换
由于坐标系存在本地坐标系和世界坐标系两种,那么就需要有方法可以对这两种坐标系进行转换。
transform.localToWorldMatrix:本地坐标转世界坐标的矩阵信息。
transform.worldToLocalMatrix:世界坐标转本地坐标的矩阵信息。
transform.TransformDirection:将方向从本地坐标转换为世界坐标,不受缩放影响。
transform.InverseTransformDirection:将方向从世界坐标转换为本地坐标,不受缩放影响。
transform.TransformPoint:将位置从本地坐标转换为世界坐标,受缩放影响。
transform.InverseTransformPoint:将位置从世界坐标转换为本地坐标,受缩放影响。
transform.TransformVector:将坐标点从本地坐标转换为世界坐标,不受位置影响但受缩放影响。
transform.InverseTransformVector:将坐标点从世界坐标转换为本地坐标,不受位置影响但受缩放影响。
TransformPoint和TransformVector的区别
下面我们看看这两个方法的区别,首先,我们添加一个空物体到舞台并设置该物体的坐标为(1,1,1),然后把Cube对象拖入该空物体成为其子项设定其坐标为(2,2,2),修改脚本如下:
1 using UnityE
2 using System.C
4 public class Demo01Script : MonoBehaviour
public Transform myT
void Start()
Vector3 pos = myTransform.TransformPoint(new Vector3(1, 1, 1));
Debug.Log(pos);
//(4.0, 4.0, 4.0)
Vector3 vec = myTransform.TransformVector(new Vector3(1, 1, 1));
Debug.Log(vec);
//(1.0, 1.0, 1.0)
void Update()
接下来我们把空物体的尺寸缩小一半看看结果会如何:
TransformPoint转变会受物体的位置和缩放影响转换,而TransformVector仅受物体的缩放影响转换。
这里做了一个示例,具体的功能是按下指定的键抓取到场景中的小盒子,使其始终位于屏幕前方,按下另一个键将这个小盒子抛出。
下面我们看核心的实现。
1 using UnityE
2 using System.C
4 public class Demo01Script : MonoBehaviour
void Start()
void Update()
//抓取小盒子
if (Input.GetKey(KeyCode.Q))
//设定小盒子的位置到屏幕前方
cube.transform.position = transform.TransformPoint(new Vector3(0, 0, 2));
//将小盒子设定为读取对象的子对象, 保证跟随运动
cube.transform.SetParent(transform);
//去掉物理交互
cube.GetComponent&Rigidbody&().isKinematic = true;
//扔出小盒子
if (Input.GetKey(KeyCode.E))
if (cube.transform.parent == transform)
//使用掉物理交互
cube.GetComponent&Rigidbody&().isKinematic = false;
//解除所有子物件的绑定关系
transform.DetachChildren();
//获取方向
Vector3 cameraDirect = transform.TransformDirection(0, 0, 5);
//添加缓冲的力
cube.GetComponent&Rigidbody&().AddForce(cameraDirect, ForceMode.Impulse);
我们先将摄像机前的一个点转换为世界坐标赋予给小盒子的世界坐标使其位于摄像机之前,抛出时把摄像机向前方向的一个向量转换为世界方向赋予小盒子抛出。
Unity3D里提供了方便控制物体位移的属性及方法。
本地和世界坐标
transform.position:设置和获取物件的世界坐标。
transform.localPosition:设置和获取物件的本地坐标,相对于父级的坐标。
注意,在Inspector面板中的Transform里显示的是本地坐标。
Transform的Translate方法可以更加方便的对物体的位移进行操作,该方法有四个重载:
1 public function Translate(translation: Vector3, relativeTo: Space = Space.Self): void;
2 public function Translate(x: float, y: float, z: float, relativeTo: Space = Space.Self): void;
相对于本地坐标系或世界坐标系对物体进行位移操作。
1 public function Translate(translation: Vector3, relativeTo: Transform): void;
2 public function Translate(x: float, y: float, z: float, relativeTo: Transform): void;
相对于指定物体的坐标进行位移操作。
注意:如果是相对于本地坐标系,则如果向上移动就是朝向物体本身的上方移动,如果是相对于世界坐标系则是向世界的上方向移动,如果是相对于其他物体则是向这指定的物体的上方向移动。
AnimationCurve
AnimationCurve可以用来定义自定义的动画轨迹,我们通过在脚本中声明一个该类型的对象,就可以在编辑器窗口对其进行编辑,然后使我们的物体按照编辑的轨迹进行移动等操作。
比如我们想要得到一个物体在X轴匀速移动,Y轴进行上下循环移动的时候,可以使用下面的脚本:
1 using UnityE
2 using System.C
4 public class Demo02Script : MonoBehaviour
public AnimationCurve myAnimationC
public Transform myT
void Start()
void Update()
myTransform.position = new Vector3(
myTransform.position.x + 1 * Time.deltaTime,
myAnimationCurve.Evaluate(Time.time * 0.5f) * 2,
myTransform.position.z);
编辑器编辑的曲线如下:
在游戏中都会有一个最基本的需求,就是移动到指定的点,下面我们来实现一下这个基本的功能,脚本如下:
2 using UnityE
3 using System.C
5 public class Demo02Script : MonoBehaviour
public Transform myT
public Transform myT
private bool _isArrived = true;
private Vector3 _
private Vector3 _
private float _
private Action _onA
private float _allT
private float _
void Start()
MoveTo(myTarget.position, 1, () =& Debug.Log("I am arrived!"));
void Update()
if (!_isArrived)
_time += Time.deltaT
//判断是否抵达终点
if (_time &= _allTime)
//校正位置
myTransform.position = _
//标记到达和调用回调
_isArrived = true;
if (_onArrived != null)
_onArrived();
//这里使用Lerp方法进行差值运算也可以得到相同的效果, 但是我们作为学习还是自己实现
//myTransform.position = Vector3.Lerp(_origin, _target, _time / _allTime);
//获取方向的单位向量
Vector3 dirction = _target - _
dirction.Normalize();
//朝方向运动
myTransform.Translate(dirction * Time.deltaTime);
/// &summary&
/// 移动到指定点.
/// &/summary&
/// &param name="targetPosition"&目标点.&/param&
/// &param name="speed"&移动速度, 米/秒.&/param&
/// &param name="onArrived"&到达后调用的方法.&/param&
private void MoveTo(Vector3 targetPosition, float speed, Action onArrived)
_isArrived = false;
_origin = myTransform.
_target = targetP
_onArrived = onA
//计算总共需要花费的时间
_allTime = Vector3.Distance(myTransform.position, _target) / _
//重置使用的时间
_time = 0;
运行后小盒子会想指定的物体进行匀速移动,到达后会输出&I am arrived!&的字符串。
旋转之欧拉角
欧拉角是由3个轴的旋转角度组成的旋转数据,比如我们在Inspector界面的Transform中看到的就是物体本地坐标系的欧拉角:
欧拉角每个轴数字都在0-360之间,表示其旋转的角度。
官方提供的旋转方法,其一共有三个重载方法:
1 public function Rotate(eulerAngles: Vector3, relativeTo: Space = Space.Self): void;
2 public function Rotate(xAngle: float, yAngle: float, zAngle: float, relativeTo: Space = Space.Self): void;
指定在本地坐标系或世界坐标系下旋转到指定的角度。
public function Rotate(axis: Vector3, angle: float, relativeTo: Space = Space.Self): void;
指定在本地坐标系或世界坐标系下基于轴axis进行旋转,旋转到angle角度。
RotateAround
我们先看看其参数:
public function RotateAround(point: Vector3, axis: Vector3, angle: float): void;
表示我们的物体围绕指定的点point在轴axis下旋转angle的角度。
可以使物体面向指定的点,我们看看其参数:
1 public void LookAt(Transform target, Vector3 worldUp = Vector3.up);
2 public void LookAt(Vector3 worldPosition, Vector3 worldUp = Vector3.up);
即使我们的物体面向指定的物体或点。
旋转之四元数
欧拉角理解和使用都相当的方便,但是在实际进行旋转时存在万向锁的问题,所以引入了比较抽象的四元数的概念,当然我们在Unity中只要直接使用即可,是非常方便的。
这里提供一个视频,可以让大家直观的了解什么是万向锁:
在Transform中,eulerAngles属性是使用欧拉角来表示旋转,而rotation属性则是使用四元数来表示旋转。
四元数提供了许多的静态方法来使我们完成特定需求的效果,点击可查看帮助。
如果我们想要实现一个效果,物体匀速旋转到指定角度时,使用欧拉角对每个轴进行变换是相当复杂的,同时如果两个轴重合了就会出现万向锁的问题,无法解决,而使用四元数则可以避免这些问题,下面是实现的脚本:
1 using UnityE
2 using System.C
4 public class Demo03Script : MonoBehaviour
public Transform myT
public Transform myT
void Start()
void Update()
RotateToTarget();
private void RotateToTarget()
//获取目标方向的单位向量
Vector3 dicetion = (myTarget.position - myTransform.position).
//获取目标方向的四元数对象
Quaternion targetDicetion = Quaternion.LookRotation(dicetion);
//按照每秒 45 度的速度旋转面向目标对象
myTransform.rotation = Quaternion.RotateTowards(myTransform.rotation, targetDicetion, 45 * Time.deltaTime);
这样我们就可以使我们的物体匀速的转向指定的目标对象了。
缩放与位置关系
缩放比较简单,没有提供更多的方法。
Transform.lossyScale:只读,获取本物体相对于世界坐标的缩放大小。
Transform.localScale:设置或获取本物体相对于父级IDE缩放大小。
在Unity3D中,所有3D对象是按照树形结构进行组合的,而操作物体之间的位置关系的所有API都存放在Transform对象中,下面我们看看常用的属性及方法。
Transform.parent:设置和获取父级对象。
Transform.root:获取层次最高的对象。
Transform.childCount:获取子级对象的数量。
Transform.Find:根据名字寻找子项。
Transform.IsChildOf:判断是否为指定Transform对象的子项。
Transform.DetachChildren:解除所有子项。
Transform.GetChild:根据索引获取子项。
Transform.GetSiblingIndex:获取同一级别的物体的索引。
Transform.SetAsFirstSibling:设置为同一级别的物体为第一个索引。
Transform.SetAsLastSibling:设置为同一级别的物体为最后一个索引。
Transform.SetSiblingIndex:设置同一级别的物体的索引。
工程文件下载求问物体从a位置到b位置,怎么求其沿x y z轴的旋转角度。? - 知乎30被浏览1405分享邀请回答7添加评论分享收藏感谢收起1215 条评论分享收藏感谢收起旋转表示方法
旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的一种了。大家应该都听过,有一种旋转的表示方法叫四元数。按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——方向余弦矩阵旋转和欧拉旋转。
方向余弦矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵;
欧拉旋转则是按照一定的坐标轴顺序(例如:先x、再y、最后z)、每个轴旋转一定角度来变换坐标或向量,它实际上是一系列坐标轴旋转的组合。
四元数本质上是一种高阶复数(听不懂了吧。。。),是一个四维空间,相对于复数的二维空间。我们高中的时候应该都学过复数,一个复数由实部和虚部组成,即x = a + bi,i是虚数单位,如果你还记得的话应该知道i^2 = -1。而四元数其实和我们学到的这种是类似的,不同的是,它的虚部包含了三个虚数单位,i、j、k,即一个四元数可以表示为x = a + bi + cj + dk。
方向余弦矩阵旋转
旋转轴可以是任意向量;
旋转其实只需要知道一个向量+一个角度,一共4个值的信息,但矩阵法却使用了16个元素;
而且在做乘法操作时也会增加计算量,造成了空间和时间上的一些浪费;
定义上面三个黑色字体角度分别为绕Z轴、Y轴、X轴的旋转角度,如果用Tait-Bryan angle表示,分别为Yaw、Pitch、Roll。
很容易理解,形象直观;
表示更方便,只需要3个值(分别对应x、y、z轴的旋转角度);但按我的理解,它还是转换到了3个3*3的矩阵做变换,效率不如四元数;
之前提到过这种方法是要按照一个固定的坐标轴的顺序旋转的,因此不同的顺序会造成不同的结果;
会造成的现象。这种现象的发生就是由于上述固定坐标轴旋转顺序造成的。理论上,欧拉旋转可以靠这种顺序让一个物体指到任何一个想要的方向,但如果在旋转中不幸让某些坐标轴重合了就会发生万向节锁,这时就会丢失一个方向上的旋转能力,也就是说在这种状态下我们无论怎么旋转(当然还是要原先的顺序)都不可能得到某些想要的旋转效果,除非我们打破原先的旋转顺序或者同时旋转3个坐标轴。这里有个视频可以直观的理解下;
由于万向节锁的存在,欧拉旋转无法实现球面平滑插值;
四元数旋转
可以避免万向节锁现象;
只需要一个4维的四元数就可以执行绕任意过原点的向量的旋转,方便快捷,在某些实现下比旋转矩阵效率更高;
可以提供平滑插值;
比欧拉旋转稍微复杂了一点点,因为多了一个维度;
理解更困难,不直观;
本文已收录于以下专栏:
相关文章推荐
四元数—姿态解算在前面我们介绍了旋转的表示方法:http://blog.csdn.net/qq_/article/details/
以及,四元数的定义与几何意义:ht...
旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的一种了。大家应该都听过,有一种旋转的表示方法叫四元数。按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转。矩阵旋转使用...
三维旋转矩阵的计算
旋转矩阵(Rotation matrix)是在乘以一个向量的时候有改变向量的方向但不改变大小的效果的矩阵。旋转矩阵不包括反演,它可以把右手坐标系改变成左手坐标系或反之。所有旋转加...
本文总结了包括旋转矩阵、旋转向量、欧拉角、四元数在内的四种旋转方式及他们之间的转换关系。如有错误,欢迎指正;如果哪里写的不清楚,欢迎留言。
本文主要描述了关于三维旋转的一种描述方式--欧拉角的概念以及应用以及使用它的一些缺陷
在一次数字图像处理课中,我接触到了图片旋转的一些原理,当时没完全想明白,课后通过一段时间的学习,终于完成了图片旋转的matlab程序。开始觉得应该挺简单的,但终究是纸上谈兵,在实现的过程中遇到很多问题...
控件移动,放大,缩小,旋转
1,代码添加控件
从一个坐标系到另一个坐标系的转换前面谈到有多种转换方法:欧拉角法、方向余弦矩阵法、四元数法等。
其中欧拉角法的核心思想是:一个坐标系可以用另一个参考坐标系的三次空间旋转来表达。旋转坐标系的方法又有两...
欧拉角是一种常用的描述方位的方法。这项技术是著名数学家Leonhard Euler()的名字命名的,他证明了角位移序列等价于单个角位移。想详细了解的请点击维基百科:http://zh...
相信大家使用多点对图片进行缩放,平移的操作很熟悉了,大部分大图的浏览都具有此功能,有些app还可以对图片进行旋转操作,QQ的大图浏览就可以对图片进行旋转操作,大家都知道对图片进行缩放,平移,旋转等操作...
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 四元数 角度 的文章

 

随机推荐