3D Maths

浏览量:2,998

三维旋转

本篇文章谢绝转载,也禁止用于任何商业目的。 代码的下载地址为:https://github.com/twinklingstar20/orientation 本篇文章主要介绍三维空间下旋转的三种表示形式:四元数、矩阵和欧拉角,阐述了四元数、矩阵的数学原理和实现,在附录中描述了与四元数类和矩阵类相关的向量类的实现策略。三种旋转表示形式的优缺点对比,参见文章《欧拉角、四元数和矩阵的对比》。 特别说明:向量类、四元数类、矩阵类的实现,是由NVIDIA公司Physx物理引擎开源部分的源码修改而来的。 1. 四元数 四元数(Quaternion)是由爱尔兰数学家威廉•卢云•哈密顿在1843年发现的数学概念,在图形学中有重要的应用。在3D程序中,通常用四元数来计算3D物体的旋转角度,与矩阵相比,四元数更加高效,占用的储存空间更小,此外也更便于插值。 任意一个四元数可以表示为: \ = xi + yj + zk + w \tag{1}\] 其中,\({{i}^{2}}={{j}^{2}}={{k}^{2}}=ijk=-1,ij=k,jk=i,ki=j\),注意\(ij=k\),但是\(ji\ne k\)。四元数的长度(模长)表示为\(\left\| q \right\|=\sqrt{{{x}^{2}}+{{y}^{2}}+{{z}^{2}}+{{w}^{2}}}\),通常将四元数规一化(Normalized),即: \ \tag{2}\]

spacer
浏览量:1,449

坐标系统的变换

本文主要介绍图形学中坐标系统变换的理论基础。 图1. 坐标系统的变换 以二维为例,如图1所示。设坐标系统\({{\Gamma }_{1}}\),原点在\({{\theta }_{1}}=\left( 0,0,1 \right)\),两条坐标轴分别为\({{\vec{i}}_{1}}=\left( 1,0,0 \right),{{\vec{j}}_{1}}=\left( 0,1,0 \right)\),点\(P\)在坐标系统\({{\Gamma }_{1}}\)上的坐标为\(\left( {{a}_{1}},{{b}_{1}} \right)\);类似的,点\(P\)在坐标系统\({{\Gamma }_{2}}\)上的坐标为\(\left( {{a}_{2}},{{b}_{2}} \right)\)。设坐标轴\({{\vec{i}}_{1}},{{\vec{j}}_{1}}\),原点\({{\theta }_{1}}\)经过一个矩阵变换\(M\),得到坐标系统\({{\Gamma }_{2}}\)的坐标轴和原点,即有: \

spacer
浏览量:891

齐次表示

齐次表示在图形学中占有非常重要的位置。点表示三维空间中的一个位置,向量表示一个方向,没有具体的位置。使用\(3\times 3\)的矩阵,可以对坐标进行仿射变换,比如旋转、缩放以及错切变换等,然而使用这种矩阵并不能进行平移变换。点的平移是有意义的,但是向量的平移是没有意义的。 简单来说,在三维空间上,点和向量的表示都是3维的,把扩展1维,就得到齐次向量表示,即\(\vec{p}=\left( {{p}_{x}},{{p}_{y}},{{p}_{z}},{{p}_{w}} \right)\)。若\({{p}_{w}}\)为零,\(\vec{p}\)表示一个三维向量;若\({{p}_{w}}\)非零,则\(\vec{p}\)表示点\(\left( {{p}_{x}}/{{p}_{w}},{{p}_{y}}/{{p}_{w}},{{p}_{z}}/{{p}_{w}} \right)\)。 齐次向量扩展1维,那么原先由\(3\times 3\)的矩阵表示的变换也需要扩展1维,变成\(4\times 4\)的齐次矩阵。\(4\times 4\)的齐次矩阵可以实现旋转、缩放和错切变换,形式为: \ \(3\times 3\)矩阵不能表示的位移变换,也可以采用\(4\times 4\)的齐次矩阵来表示 \ 易知,若\(\vec{v}\)是一个向量\(\vec{v}=\left( {{v}_{x}},{{v}_{y}},{{v}_{z}},0 \right)\),则\(T\cdot \vec{v}\)得到的结果仍等于\(\vec{v}\),因为向量的位移是没有意义的。 图1. 点的透视投影 齐次表示除了能表表三维空间上所有的仿射变换(两条互相平面的直线,变换后,仍然互相平行),还可以表示透视变换,参见文章《OpenGL原理介绍》,如图1所示。一个点\(P=\left( {{p}_{x}},{{p}_{y}},{{p}_{z}} \right)\)投影到照相机的近平面上\(\left( {{x}^{*}},{{y}^{*}} \right)\),\({{p}_{z}}\)是在\(z\)轴的负方向上,\(N\)表示投影平面到源点的距离,则有\({{x}^{*}}/{{p}_{x}}=N/\left( -{{p}_{z}} \right)\),则\({{x}^{*}}=N{{p}_{x}}/\left( -{{p}_{z}} \right)\),同理,有\({{y}^{*}}=N{{p}_{y}}/\left( -{{p}_{z}}

spacer
浏览量:6,632

欧拉角、四元数和矩阵的对比

三维空间的旋转可以用欧拉角,旋转矩阵,轴-角,四元数,双四元数来表示,本文主要总结这些表示方法的优缺点。 一.  欧拉角(Euler-Angles) 1.1    介绍 欧拉角包括3个旋转,根据这3个旋转来指定一个刚体的朝向。这3个旋转分别绕x轴,y轴和z轴,分别称为Pitch,Yaw和Roll,如下图所示。欧拉角可以表示成z-x-z,x-y-x,z-y-z等形式,旋转的顺序影响结果。 Pitch Yaw Roll 图1. 欧拉角的表示 欧拉角很重要的一个优点就是直观,容易理解。 欧拉角主要有下面几个缺点: (1)       欧拉角是不可传递的,旋转的顺序影响旋转的结果,不同的应用又可能使用不同的旋转顺序,旋转顺序无法统一; (2)       3个旋转的角度可以不受限制,即可以是10000度,也可以是-1500度; (3)       可能造成万向节死锁(Gimbal Lock)。 1.2 平万向节死锁 当两个环发生重叠的时候,就有丢失了一个自由度,如图2所示。对万向节死锁可以参考【1】【2】【3】,特别是【1】提供的视频,对知识点的介绍非常的形象生动。也正是由于锁的存在,无法使用欧拉角实现球面平滑的插值。 图2. 万向节死锁 二. 旋转矩阵 用3*3的矩阵,可以表示三维空间中所有的旋转,设\(\theta \)表示沿着轴的方向望去时,方向是顺时针的旋转角度。则绕着X轴、Y轴、Z轴旋转\(\theta \)角,对应的旋转矩阵表示如下所示: \(X = \left( {\begin{array}{*{20}{c}}1&0&0\\0&{\cos \theta }&{ - \sin \theta }\\0&{\sin \theta }&{\cos

spacer
浏览量:937

任意点与平面的反射矩阵

  问题描述:设三维空间上,存在一个点\(V=\left( x,y,z \right)\),一个平面\(\Gamma :P\cdot \vec{n}+d=0\),求点\(V\)经过平面\(\Gamma \)的投影点\(V'\),其中,\(V'=\left( x',y',z' \right)\),\(\vec{n}=\left( {{n}_{x}},{{n}_{y}},{{n}_{z}} \right)\),如图1所示。 图1. 点\(V'\)是点\(V\)经过平面\(\Gamma \)的投影点 设\(l\)表示点\(V\)到平面\(\Gamma \)的有向距离,则有: \(l=\frac{V\cdot \vec{n}+d}{\left\| {\vec{n}} \right\|} \tag{1}\) 由于点\(V\)和点\(V'\)到平面\(\Gamma \)的距离大小相等,且\(\overline{VV'}\)垂直于平面\(\Gamma \),则有: \(V-V'=2l\cdot \frac{{\vec{n}}}{\left\| {\vec{n}} \right\|} \tag{2}\) 把(1)代入(2)式中,得到: \(V'=V-\frac{2\vec{n}\left( V\cdot \vec{n}+d \right)}{{{\left\| {\vec{n}} \right\|}^{2}}}=V-\frac{2\left( V\cdot \vec{n} \right)\vec{n}}{{{\left\| {\vec{n}}

spacer
浏览量:27,304

四元数

重新看了三年前写的文章,感觉很多叙述并不到位,重新更新了一篇博客《三维旋转》,里面有更加清晰的介绍。 对于四元数的概念也许大家不太熟悉,这里介绍下四元数概念,四元数、矩阵和欧拉角之间的关系,四元数球面插值的概念。 一. 四元数 1.1 四元数的概念 四元数是由爱尔兰数学家威廉•卢云•哈密顿在1843年发现的数学概念,在图形学中有重要的应用。在3D程序中,通常用四元数来计算3D物体的旋转角度,与矩阵相比,四元数更加高效,占用的储存空间更小,此外也更便于插值。 可以把四元数看做一个标量和一个3D向量的组合。实部w表示标量,虚部表示向量标记为V或三个单独的分量(x,y,z),则四元数可以记为或。正规化四元数可以表示为: 在三维中,可以用四元数表示绕着某个轴的旋转,如下公式所示: α表示旋转的角度,cos(βx), cos(βy) 和cos(βz)表示定位旋转轴的方向余弦 根据欧拉旋转定理,任何两个坐标系的相对定向,可以由一组四个数字来设定;其中三个数字是方向余弦,用来设定特征矢量(固定轴);第四个数字是绕着固定轴旋转的角值。这样四个数字的一组称为四元数。上面这段话阐述了四元数的原理:三维空间内所有的旋转都可以用四个数来表示。在通过四元数方法来计算旋转,已经替代了方向余弦方法,这是因为它能减少所需的工作,和它能减小舍入误差。在电脑图形学里,四元数与四元数之间,简易执行插值的能力是很有价值的。 1.2 旋转矩阵 旋转矩阵(Rotation Matrix)与一个向量相乘,会改变向量的方向但不改变大小的效果。旋转可分为主动旋转与被动旋转。主动旋转是指将向量逆时针围绕旋转轴所做出的旋转。被动旋转是对坐标轴本身进行的逆时针旋转,它相当于主动旋转的逆操作。在三维空间中,旋转矩阵有一个等于单位1的实特征值。只用三个实数就可以指定一个 3 维旋转矩阵。生成旋转矩阵的一种简单方式是把它作为三个基本旋转的序列复合。关于右手笛卡尔坐标系的 x-, y- 和 z-轴的旋转分别叫做 roll, pitch 和 yaw 旋转。因为这些旋转被表达为关于一个轴的旋转,它们的生成元很容易表达。 1.2 欧拉角 图1 欧拉角表示 设定 xyz-轴为参考系的参考轴,称 xy-平面与 XY-平面的相交为交点线,用英文字母(N)代表。zxz 顺规的欧拉角可以静态地这样定义:(1)a 是 x-轴与交点线的夹角;(2)B是 z-轴与Z-轴的夹角;(3)r 是交点线与X-轴的夹角。 欧拉角来描述刚体在三维欧几里得空间的取向,如图1所示。对于任何一个参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。

spacer