zoukankan      html  css  js  c++  java
  • 四元数,齐次坐标(转)

    http://blog.sina.com.cn/s/blog_6e521a600100nigy.html

    最简单的想法是:在有点和向量混合的情况下,给定一个(x, y, z),我们不知道这个是向量还是点,所以引入齐次坐标(所谓齐次坐标就是用N+1表示N维量),最后一维用1就是点,0就是向量
     
    在<<Focus on 3D models>>中,四元数主要是用来做rotation的。用四元数在此书中说有三点好处:
    a, 能解决Gimbal Lock;
    b, 能平滑的进行插值;
    c,处理旋转比矩阵需要的空间小(旋转还可以用矩阵来表示,需要9个slot);
     
    注意:四元数只有在是unit length的时候才能表示旋转
     
    在3D中我们常用4x4的矩阵,来配合3维空间的点的缩放、旋转、平移运算。因此是3维运算,但是用了4x4,所以我们称之为Homogeneous Matrix,更精确的说是Homogeneous Transformation Matrix。
     
    有网友总结的齐次坐标的如下,个人觉得很容易理解,为防止链接失效,原文拷贝如下(下划线所示):
     
    4D向量是由3D坐标(x,y,z)和齐次坐标w组成,写作(x,y,z,w)。

    在3D世界中为什么需要3D的齐次坐标呢?简单地说明一下,在一维空间中的一条线段上取一点x,然后我们想转移x的位置,那我们应该是x'=x+k,但我们能使用一维的矩阵来表示这变换吗?不能,因为此时一维的矩阵只能让x点伸缩。但如果变成了一维的齐次空间[k 1]就很容易地做到。同样地,在二维空间中,某一图形如果不使用二维的齐次坐标,则只能旋转和伸缩,确不能平移。

         因此,我们在3D坐标中使用齐次坐标,是为了物体在矩阵变换中,除了伸缩旋转,还能够平移,如下运算:

     

    既然了解了使用齐次坐标的意义,我们下一步就要了解一下齐次坐标w是什么意义。设w=1,此时相当于我们把3D的坐标平移搬去了w=1的平面上,4D空间的点投影到w=1平面上,齐次坐标映射的3D坐标是(x/w,y/w,z/w),也就是(x,y,z)。(x,y,z)在齐次空间中有无数多个点与之对应。所有点的形式是(kx,ky,kz,k),其轨迹是通过齐次空间原点的“直线”(其实每个点相当于3D的坐标世界)。

     

    当w=0时,有很大的意义,可解释为无穷远的“点”,其意义是描述方向。这也是平移变换的开关,当w=0时,

    此时不能平移变换了。这个现象是非常有用的,因为有些向量代表“位置”,应当平移,而有些向量代表“方向”,如表面的法向量,不应该平移。从几何意义上说,能将第一类数据当作"点",第二类数据当作"向量"。可以通过设置w的值来控制向量的意义
     

    3D中有很多地方都会提到四元数(Quaternion),其实是一个4D形式的向量。在《DirectX 9.0 3D游戏开发必成基础》(清华大学出版社),第一部分的“基本变换”一节中,有这么提到

     
    前面我们提到讲某一点的坐标或某一向量的各分量放入一个1x4的行向量v中。但是我们所关心的点和向量都是3D的!为什么我们要使用1x4的行向量?为了使向量-矩阵乘积有意义,我们必须将3D的点或向量扩展为4D行向量,因为一个1x3的行向量和一个4x4矩阵是无法定义乘法运算的。
     
    接下来的一段这么说,
     
    “那么我们应该如何使用第4个分量(用w表示)?将点放入一个1x4的行向量时,我们将w分量设为1。这能够保证点的平移变换正确进行。因为向量不含位置信息,所以没有对向量定义平移变换,任何企图对向量实施平移变换的运算只能产生一个毫无意义的向量。为了防止对向量进行平移变换,当我们将1x3向量置入1x4行向量时,将w分量置为0。”
     
    上面的一段说明了最后一个分量什么时候该用0。
     
    后面更有这么一段文字说明,很有启发性,
     
    “当我们将点(x,y,z)写作(x,y,z,1)的形式时,从技术角度,我们实际上在4D空间中用一个4D平面(w=1)来描述3D空间。(注意:4D空间中的平面是3D的,就像3D中的平面式一个2D空间一样)。所以,当我们将w设为某个值时,我们便偏离了平面w=1。为了重新映射回该平面(对于我们熟悉的3D空间),我们只需将齐次向量的每个分量除以w。”
     
    对于上面的4D到3D的所谓映射,正是齐次坐标的功力所在。
     
    在<<Character Animation With Direct3D>>中, P117对四元数的解释相当的容易理解和实用
     
    In the example of rotating a-radians around Axis A (x, y, z), the quaternion for
    this would be:
     
    q = cox(a/2), x•sin(a/2), y•sin(a/2), z*sin(a/2)
     
    所谓齐次坐标表示法就是用n+1维向量表示一个n维向量。
     
    这个概念是射影几何需要解决问题的时候引出来的,在射影学里,如下定义:
     

    为了能用代数方法来处理射影(或扩大)空间的几何问题,需要引进齐次坐标(有时还引进射影坐标)。 仍从欧氏(或仿射)平面开始。设在平面上已经建立了以O为原点的直角(或仿射)坐标系,(xy)为一点p 的坐标。令射影几何学则比值x0:x1:x2完全确定p 的位置,(x0x1x2)就叫做p的齐次(笛氏)坐标。原点的齐次坐标显然可以写成(1,0,0)。设p不是原点O,则x1x2不同时等于零;再令x1x2固定,而令x0向0接近,则p点沿一条经过O而斜率为x2:x1的直线l向远方移动。设射影几何学表示扩大直线l上的无穷远点,则可以认为,当x0趋于O 时,p趋于射影几何学。因此,可以把(0,x1x2)作为射影几何学齐次坐标,特殊地,(0,1,0)和(0,0,1)依次是x轴和y 轴上无穷远点的齐次坐标。这样,每一组不同时为零的三个数x0x1x2 都是扩大平面上一点的齐次坐标,而若ρ 为不等于零的数,则(ρx0ρx1ρx2)和(x0x1x2)代表同一点,下面引进记号(x)=(x0x1x2),ρ(x)=(ρx0ρx1ρx2)。

    射影几何学 (u1u2不都是0)是欧氏(或仿射)平面上一条直线的方程。在用齐次坐标表示时,它可以写成

    射影几何学, (1)

    这也就是扩大直线的齐次方程,这直线上的无穷远点是(0,u2,-u1)。扩大平面上的无穷远直线方程显然可以写成x0=0。这样,每一个齐次线性方程都代表扩大平面上一条直线。由于比值u0:u1:u2完全确定直线,(u)=(u0u1u2)就叫做(齐次)线坐标。为了区别两种齐次坐标,上面引进的(x)=(x0x1x2)就叫做(齐次)点坐标。方程(1)叫做点(x)和线(u)的关联条件或接合(即(x)在(u)上,或(u)经过(x))条件。 当不区别无穷远元素和非无穷远元素,使扩大平面成为射影平面时,(x)和(u)就依次成为射影平面上的齐次点坐标和线坐标,它们都可以看作射影坐标的特款。与此类似,可以得到扩大或射影直线上的点坐标(x)=(x0x1)以及扩大或射影空间的点坐标(x)=(x0x1x2x3)和面坐标(u)=(u0u1u2u3)。在扩大或射影空间中,点(x)和面(u)的关联条件是射影几何学 下面,除非特别指明,所讨论的空间,就是三维射影空间,所讨论的点、线、面都是射影空间里的点,射影直线和射影平面。在射影空间,指定一个平面x0=0作为无穷远面,就得到扩大空间(见射影坐标)。

    对于最后一个量取1或者取0的含义,有文字描述如下(参考资料3中摘录):

    取三维射影空间为例,此时坐标形如 四元数,齐次坐标无穷远平面通常被定为子集 四元数,齐次坐标,在此平面之外总是可以同除以 四元数,齐次坐标,因而无穷远平面的补集透过映射 四元数,齐次坐标 等同于我们熟悉的三维仿射空间。

    若我们试图考虑平面 四元数,齐次坐标 与 四元数,齐次坐标 的交集,则显然可先后导出 四元数,齐次坐标 与 四元数,齐次坐标,这告诉我们交集落在无穷远平面,其坐标形如 四元数,齐次坐标,它事实上是连接 四元数,齐次坐标 与 四元数,齐次坐标 的直线。

    也说明了我们在3D中用4D运算的时候,对点的变换需要用w=1,得到的点才是仿射空间中的坐标。

    参考资料:

    1、http://www.hudong.com/wiki/射影几何学

    2、http://www.songho.ca/math/homogeneous/homogeneous.html

    为防止2的链接丢失,原文复制如下(这幅图片非常好,说明了仿射/射影几何的研究对象):

    Homogeneous Coordinates

    Problem: Two parallel lines can intercept.

     
    Railroad gets narrower and meets at horizon.

    In Euclidean space (geometry), two parallel lines on the same plane cannot intercept, or cannot meet each other forever. It is a common sense that everyone is familiar with. 

    However, it is not true any more in projective space, for example, the train railroad on the side picture becomes narrower while it moves far away from eyes. Finally, the two parallel rails meet at the horizon, which is a point at infinity. 

    Euclidean space (or Cartesian space) describe our 2D/3D geometry so well, but they are not sufficient to handle the projective space (Actually, Euclidean geometry is a subset of projective geometry). The Cartesian coordinates of a 2D point can be expressed as (x, y). 

    What if this point goes far away to infinity? The point at infinity would be (∞,∞), and it becomes meaningless in Euclidean space. The parallel lines should meet at infinity in projective space, but cannot do in Euclidean space. Mathematicians have discoverd a way to solve this issue.

    Solution: Homogeneous Coordinates

    Homogeneous coordinates, introduced by August Ferdinand Möbius, make calculations of graphics and geometry possible in projective space. Homogeneous coordinates are a way of representing N-dimensional coordinates with N+1 numbers. 

    To make 2D Homogeneous coordinates, we simply add an additional variable, w, into existing coordinates. Therefore, a point in Cartesian coordinates, (X, Y) becomes (x, y, w) in Homogeneous coordinates. And X and Y in Cartesian are re-expressed with x, y and w in Homogeneous as; 
    X = x/w 
    Y = y/w 

    For instance, a point in Cartesian (1, 2) becomes (1, 2, 1) in Homogeneous. If a point, (1, 2), moves toward infinity, it becomes (∞,∞) in Cartesian coordinates. And it becomes (1, 2, 0) in Homogeneous coordinates, because of (1/0, 2/0) = (∞,∞). Notice that we can express the point at infinity without using "∞".

    Why is it called "homogeneous"?

    As mentioned before, in order to convert from Homogeneous coordinates (x, y, w) to Cartesian coordinates, we simply divide x and y by w; 
      

    Converting Homogeneous to Cartesian, we can find an important fact. Let's see the following example; 
      
    As you can see, the points (1, 2, 3), (2, 4, 6) and (4, 8, 12) correspond to the same Euclidean point (1/3, 2/3). And any scalar product, (1a, 2a, 3a) is the same point as (1/3, 2/3) in Euclidean space. Therefore, these points are "homogeneous" because they represent the same point in Euclidean space (or Cartesian space). In other words, Homogeneous coordinates are scale invariant.

    Proof: Two parallel lines can intercept.

    Consider the following linear system in Euclidean space; 
      
    And we know that there is no solution for above equations because of C ≠ D. 
    If C = D, then two lines are identical (overlapped).

    Let's rewrite the equations for projective space by replacing x and y to x/w, y/w respectively. 
      
    Now, we have a solution, (x, y, 0) since (C - D)w = 0, ∴ w = 0. Therefore, two parallel lines meet at (x, y, 0), which is the point at infinity. 

    Homogeneous coordinates are very useful and fundamental concept in computer graphics, such as projecting a 3D scene onto a 2D plane.

    3、http://wapedia.mobi/zh/齐次坐标

    1. 定义

     四元数,齐次坐标 上的 四元数,齐次坐标 维射影空间中一点的齐次坐标通常写作 四元数,齐次坐标,其中 四元数,齐次坐标 不全为零。两组成比例的表法 四元数,齐次坐标四元数,齐次坐标 (四元数,齐次坐标)被视为同一个坐标。

    齐次坐标系可作如下解释:考虑一个 四元数,齐次坐标 维的向量空间 四元数,齐次坐标,透过选定 四元数,齐次坐标 的基底引入坐标,则 四元数,齐次坐标 中所有非零向量在等价关系 四元数,齐次坐标 下形成的商集 四元数,齐次坐标 由上述齐次坐标刻划;而这个商集无非就是射影空间。

    2. 性质

    射影空间 四元数,齐次坐标 可以写成联集 四元数,齐次坐标,其中

    四元数,齐次坐标

    在任一 四元数,齐次坐标 上,齐次坐标透过下述映射

    四元数,齐次坐标

    化约为一般的 n 维仿射坐标。因此 四元数,齐次坐标

    3. 例子

    取三维射影空间为例,此时坐标形如 四元数,齐次坐标无穷远平面通常被定为子集 四元数,齐次坐标,在此平面之外总是可以同除以 四元数,齐次坐标,因而无穷远平面的补集透过映射 四元数,齐次坐标 等同于我们熟悉的三维仿射空间。

    若我们试图考虑平面 四元数,齐次坐标 与 四元数,齐次坐标 的交集,则显然可先后导出 四元数,齐次坐标 与 四元数,齐次坐标,这告诉我们交集落在无穷远平面,其坐标形如 四元数,齐次坐标,它事实上是连接 四元数,齐次坐标 与 四元数,齐次坐标 的直线。

    4. 方括号和圆括号

    考虑 2 维投影空间: 在投影面上的点是在 3 维空间中点的投影。设符号

    四元数,齐次坐标

    提及一个 3 维点。设

    四元数,齐次坐标

    提及另一个 3 维点。则

    四元数,齐次坐标

    在另一方面,设符号

    四元数,齐次坐标

    提及 3 维点 (x : y : z) 的在投影面上的投影。点 [x : y : z] 可被认为等于属于穿过点 (x : y : z) 和 (0 : 0 : 0) 的 3 维直线的 3 维点的等价类。如果

    四元数,齐次坐标

    是另一个投影点,则

    四元数,齐次坐标

    两个 3 维点是等价的,如果它们在投影面上的投影是等同的:

    四元数,齐次坐标

    所以,

    四元数,齐次坐标

    注意: 在某些欧洲国家 (x:y:z) 通常表示为 (x,y,z);而 [u:v:w] 表示为 [u,v,w]。

    5. 齐次坐标的加法

    在方括号和圆括号之间的区别意味着齐次坐标的点的加法将以两种不同的方式来定义,依据坐标使用的是方括号还是圆括号。

    再次考虑投影面的情况。一对 3 维点的加法同于普通坐标:

    四元数,齐次坐标

    在另一方面,一对投影点的加法被定义为:

    四元数,齐次坐标

    对于投影 3 维空间,类似考虑也适用。一对未投影的点的加法是

    四元数,齐次坐标

    而一对投影点的加法是

    四元数,齐次坐标

    6. 齐次坐标的标量乘法

    有两类标量乘法: 分别给未投影点和投影点。

    考虑标量 a 和未投影 3 维点 (x : y : z)。则

    四元数,齐次坐标

    注意

    四元数,齐次坐标

    即使

    四元数,齐次坐标

    现在考虑标量 a 和投影点 [x : y : z]。则

    四元数,齐次坐标

    所以

    四元数,齐次坐标

    注意特殊情况 四元数,齐次坐标,上述公式给出 [0:0:0] 作为结果。而它不表示任何点。实际上 四元数,齐次坐标 是未定义的,所以它是定义中的瑕疵。

    7. 用齐次坐标描述的点的线性组合

    设 A 和 B 是投影 3 维空间中的一对点,它们的齐次坐标为

    四元数,齐次坐标
    四元数,齐次坐标

    想要找到它们的线性组合 四元数,齐次坐标,这里的 a 和 b 是可随意调整的系数,带有条件 四元数,齐次坐标,或者(更精确的) 四元数,齐次坐标,来避免退化点。有三种情况要考虑:

    • 两点都属于仿射 3 维空间,
    • 两点都属于在无穷远的平面,
    • 一个点属于仿射另一个点在无穷远。

    XYZ 坐标可以被认为是分子,而 W 坐标可以被认为是分母。要做齐次坐标的加法必须有公共分母。否则必须重新缩放坐标直到所有分母都是共同的。齐次坐标差任何一致重新缩放是等价的。

    7. 1. 两点都是仿射的

    如果两个点都在仿射 3 维空间中,则 四元数,齐次坐标 且 四元数,齐次坐标。它们的线性组合是

    四元数,齐次坐标
    四元数,齐次坐标
    四元数,齐次坐标
    四元数,齐次坐标
    四元数,齐次坐标

    7. 2. 两点都在无穷远

    如果两个点都在无穷远面上。则 WA = 0 且 WB = 0。它们的线性组合是

    四元数,齐次坐标
    四元数,齐次坐标

    7. 3. 一个点是仿射另一个在无穷远

    设第一个点是仿射,因此 四元数,齐次坐标。则

    四元数,齐次坐标
    四元数,齐次坐标
    四元数,齐次坐标

    这意味在无穷处的点是支配者。

    7. 4. 一般情况

    还可以不区分情况的进行计算,类似于两个点的加法:

    四元数,齐次坐标
    四元数,齐次坐标

    以此为起点,你可以得到上述情况的公式。

    特别是在退化情况下应用这个公式再次给出 四元数,齐次坐标 与任何非 四元数,齐次坐标 其他结果的求和。

  • 相关阅读:
    Linux 命令二
    配置文件加载
    线程 wait 等待与notify 唤醒 使用 java 代码
    maven setting.xml
    Spring Boot入门——文件上传与下载
    写入txt 、读取csv、读取txt
    Java使用HttpClient上传文件
    kafka实战
    文本去除html标签
    sprig aop事务配置
  • 原文地址:https://www.cnblogs.com/hjlweilong/p/6018580.html
Copyright © 2011-2022 走看看