本博文为博主原创,转载请注明出处:http://blog.csdn.net/xiemotongye/article/details/9052165

接触OpenGL和计算机图形学有一段时间了,一直想写一点东西,记录自己的学习历程,或许也能够为有意愿向计算机图形学发展的菜鸟们提供一条捷径。

闲话不多说,本章主要介绍计算机图形学中三维数学的一些基础知识,主要包括2D、3D笛卡尔坐标系,向量、矩阵的数学和几何意义以及公式。由于篇幅限制,其中的推导过程本文不作叙述,感兴趣的读者可以去看《3D数学基础+图形与游戏开发》,已上传,链接地址在本文末尾。

一、计算机图形学

计算机图形学(Computer Graphics)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。其广泛应用于游戏、动画、仿真、虚拟现实(VR)、增强现实(AR)等领域。

在数学之中,研究自然数和整数的领域称为离散数学,研究实数的领域称作连续数学。

在计算机图形学中,为虚拟世界选择度量单位的关键是选择离散的精度。一种错误的观点认为short、int是离散的,而float、double是连续的,而事实上,这些数据类型都是离散的。于是,计算机图形学有如下准则:

计算机图形学第一准则:近似原则——如果它看上去是对的,它就是对的。


二、笛卡尔坐标系

2D笛卡尔坐标系是一个精确定位点的框架。2D坐标的标准表示法是(x,y),相信大家初中都学过。一般,标准的笛卡尔坐标系是x轴向右,y轴向上。而计算机图形学中的屏幕坐标往往是x轴向右,y轴向下。如图1所示。

图1:2D笛卡尔坐标系和2D屏幕坐标系

3D笛卡尔坐标系类似,增加了第三个维度,z轴。3D坐标系分为完全不同的2种坐标系,左手坐标系和右手坐标系。判断方法为,左手坐标系:伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上,其余手指指向前方。此时,拇指、食指和其余三指分别代表x、y、z轴的正方向。右手坐标系,相同,只是把左手换成右手。如图2所示。

图2:左手坐标系与右手坐标系

其中左手坐标系广泛应用于计算机图形学、D3D之中,而右手坐标系广泛应用于OpenGL、线性代数、3DSMax之中。

三、多坐标系

任何一个3D坐标系都是可以无限延伸的,可以包含空间中所有的点,因此,只需要一个坐标系,就能描述所有的点。但是,人们发现,不同情况下使用不同的坐标系会更为方便。

1.世界坐标系

世界坐标系是一个特殊的坐标系,它描述了其他坐标系所需要的参考框架。它是一个坐标系系统中最大的、最外部的坐标系。“向东”、“向南”这些概念只有在世界坐标系中才有。

2.物体坐标系

物体坐标系是和特定物体相关的坐标系。每个物体都有独立的坐标系。“前”、“后”、“左”、“右”这些概念只有在物体坐标系中才有意义。

3.摄像机坐标系

摄像机坐标系是于观察者密切相关的坐标系,它是一种特殊的物体坐标系,被定义在摄像机的屏幕可视区域。摄像机坐标系中,摄像机在原点,x轴向右,z轴向前(朝向屏幕内或摄像机方向),y轴向上(不是世界的上方而是摄像机本身的上方)。

4.惯性坐标系

惯性坐标系简化了世界坐标系到物体坐标系的转换。其原点与物体坐标系重合,而坐标轴与世界坐标系平行。

引入惯性坐标系的意义在于:物体坐标系转换到惯性坐标系只需要旋转,从惯性坐标系转换到世界坐标系只需要平移。

四、向量

对程序猿而言,向量就是一个数组。数组包含的“数”的数目就是向量的维度。一般计算机图形学中的向量主要讨论2维、3维和4维向量。前两者一般用于2维、3维空间中位置和位移的表示,4维向量一般用于颜色(RGB和透明度alpha)。

任意一个点都可以用从原点开始的向量来表示。

下面就是本章重点之一,向量运算法则(示例皆为3维向量):

1.负向量

- [ x  y  z ] = [ -x  -y  -z ]

几何意义:向量变负,将得到一个与原向量大小相等,方向相反的向量。

2.向量的模

|| v || = sqrt( x ^ 2 + y ^ 2 + z ^ 2 )

上公式中sqrt表示开方。

几何意义:向量的长度

3.标量与向量的乘法

k [ x  y  z ] = [ kx  ky  kz ]

几何意义:以因子|k|缩放向量的长度,如果k < 0则向量的方向被倒转。


4.向量的加减法

[ x1  y1  z1 ] + [ x2  y2  z2 ] = [ x1+x2  y1+y2  z1+z2 ]

[ x1  y1  z1 ] - [ x2  y2  z2 ] = [ x1-x2  y1-y2  z1-z2 ]

几何意义:向量a和b相加的几何解释为:平移向量,使向量a的头连接向量b的尾,接着从a的尾向b的头画一个向量,这就是向量加法的“三角形法则”。减法与之类似。

5.向量点乘

术语“点乘”来自记法a·b中的点号,点乘中的点乘号不可省略。其优先级高于加法和减法。

[ x1  y1  z1 ] · [ x2  y2  z2 ] = x1x2 + y1y2 + z1z2

几何意义:点乘结果越大,2个向量越接近。

a·b = || a || || b || cosθ

θ为两向量夹角

6.向量叉乘

术语“叉乘”来自于记法aXb中的叉号。叉乘号不能省略。叉乘优先级高于点乘。

[ x1  y1  z1 ] X [ x2  y2  z2 ] = [ y1z2-z1y2  z1x2-x1z2  x1y2-y1x2 ]

叉乘不满足结合律。满足反交换律:aXb = -(bXa)

几何意义:aXb垂直于a、b,指向a、b所在平面的正上方,大小为以a、b为两边的平行四边形的面积,即为||a|| ||b|| sinθ。

五、矩阵

对程序猿来说,向量是一维数组,矩阵就是二维数组。向量是标量的数组,矩阵是向量的数组。

矩阵的运算法则如下:

1.标量与矩阵相乘

| m11  m12  m13 |     | km11  km12  km13 |

kM =  k | m21  m22  m23 | =  | km21  km22  km23 |

| m31  m32  m33 |     | km31  km32  km33 |

2.矩阵乘法

只有满足特定情况,两个矩阵才能相乘,一个rXn的矩阵A可以和nXc的矩阵B相乘,结果为一个rXc的矩阵,记为AB。矩阵乘法满足结合律,不满足交换律。

三维矩阵相乘的情况:

| a11  a12  a13 |    | b11  b12  b13 |

AB = | a21  a22  a23 |    | b21  b22  b23 |

| a31  a32  a33 |    | b31  b32  b33 |

| a11b11+a12b21+a13b31   a11b12+a12b22+a13b32   a11b13+a12b23+a13b33 |

=   | a21b11+a22b21+a23b31   a21b12+a22b22+a23b32   a21b13+a22b23+a23b33 |

| a31b11+a32b21+a33b31   a31b12+a32b22+a33b32   a31b13+a32b23+a33b33 |

矩阵的几何意义:矩阵很抽象,一般来说,方阵(行列数相等的矩阵)能描述任意线性变换。下面将具体讲述矩阵和线性变换的公式。

六、矩阵和线性变换

1.旋转

绕单位向量n旋转θ角度的旋转矩阵为:

| nx^2(1 - cosθ)+cosθ       nxny(1 - cosθ) + nzsinθ       nxnz(1 - cosθ) - nysinθ |

R(n,θ) = | nxny(1 - cosθ)-nzsinθ       ny^2(1 - cosθ) + cosθ       nynz(1 - cosθ) + nxsinθ |

| nxnz(1 - cosθ)+nysinθ      nynz(1 - cosθ) - nxsinθ       nz^2(1 - cosθ) + cosθ  |

2.缩放

以单位向量n为缩放方向,k为因子的缩放矩阵为:

| 1+(k - 1)nx^2     (k - 1)nxny      (k - 1)nxnz |

S(n, k) = | (k - 1)nxny      1+(k - 1)ny^2     (k - 1)nynz |

| (k - 1)nxnz        (k - 1)nzny    1+(k - 1)nz^2|

3.正交投影

向垂直于单位向量n的平面的投影矩阵为:

| 1-nx^2    -nxny    -nxnz |

P(n) = | -nxny    1-ny^2    -nynz |

| -nxnz     -nzny   1-nz^2 |

4.镜像

通过原点且垂直于n的平面的镜像变换矩阵为:

| 1-2nx^2    -2nxny    -2nxnz |

S(n, -1) = | -2nxny    1-2ny^2    -2nynz |

| -2nxnz     -2nzny   1-2nz^2 |

5.变换的组合

变换组合在渲染中非常普遍,设想世界中有一任意方向、任意位置的物体,我们要把他渲染到任意方向、任意位置的摄像机中。为了做到这一点,我们必须将物体的所有顶点从物体坐标系变换到世界坐标系,接着再从世界坐标系变换到摄像机坐标系。

其中数学变换如下:

P世界 =P物体M物体->世界

P相机 =P世界M世界->相机=(P物体 M物体->世界)M世界->相机=P物体(M物体->世界M世界->相机)

这样就能在渲染的循环外先将所有矩阵组合起来,使循环内作矩阵乘法时只需要和一个矩阵相乘即可(省一次矩阵乘法,效率可提高不少)。

三维图形学中的坐标系,向量、矩阵的数学和几何意义以及公式就到此为止,本文涵盖了《3D数学基础+图形与游戏开发》前八章的大部分内容。单纯的理论知识是枯燥乏味的,但三维虚拟世界是丰富多彩的,希望阅读本文的读者将其作为三维图形学基础知识的笔记来看待。

参考资料:《3D数学基础+图形与游戏开发》

资料地址:http://download.csdn.net/detail/xiemotongye/5306709

三维数学基础(一)坐标系、向量、矩阵相关推荐

  1. 三维数学基础之坐标系、向量、矩阵

    转载自:http://blog.csdn.net/iosevanhuang/article/details/9052165 一.计算机图形学 计算机图形学(Computer Graphics)是一种使 ...

  2. 三维数学基础2:矩阵、齐次坐标

    三维数学基础2:矩阵.齐次坐标 矩阵(matrix)是由 mxn 个标量组成的矩形数组.矩阵便于表示线性变换(transfromation),如平移(translation).旋转(rotation) ...

  3. 空间坐标系以及空间两三维坐标系转换矩阵解释

    空间坐标系以及空间两三维坐标系转换矩阵解释 因为工作的原因,需要进行不同坐标系的一个转换,在查阅了众多的网页之后,发现有用的没几个,而且众多都是抄的同一篇文章,而且都是罗列以下旋转的方式,几乎没有解释 ...

  4. 三维几何学基础(向量、点乘、叉乘、反对称矩阵)

    三维几何学基础(向量.点乘.叉乘.反对称矩阵) 载具,三个自由度的平移和三个自由度的旋转. 这6个自由度称为载具的姿态(pose) 姿态包含位置(position)和朝向(orientation) 文 ...

  5. Apollo进阶课程⑭ | Apollo自动定位技术——三维几何变换和坐标系介绍

    目录 1.三维几何变换---旋转 2.三维几何变换----平移 2.1刚体的位置和朝向 3. 坐标系 3.1 ECI地心惯性坐标系 3.2 ECFF地心地固坐标系 3.3当地水平坐标系 3.4 UTM ...

  6. 三维旋转矩阵_三维旋转矩阵与旋转向量

    欧拉角是用来表示三维坐标系中方向和方向变换的,我们平时说的欧拉角其实还可以细分为欧拉角(Eular-angles)和泰特布莱恩角(Tait-Bryan-angles),这两种方法都利用了笛卡尔坐标系的 ...

  7. 1.3 torch_向量/矩阵操作

    文章目录 1.3.1 标量/向量操作 1.3.2 矩阵 转置 & clone 求和 & 求平均 累进求和 & 向量点积 向量*矩阵 & 矩阵*矩阵 & 范数 1 ...

  8. 向量 矩阵 张量_张量,矩阵和向量有什么区别?

    向量 矩阵 张量 机器学习代数 (MACHINE LEARNING ALGEBRA) Algebra is an important element of mathematics and has a ...

  9. 向量余弦值python_向量/矩阵的余弦值打印(元素明智的操作) 使用Python的线性代数

    向量余弦值python Prerequisite: 先决条件: Defining a Vector 定义向量 Defining a Matrix 定义矩阵 Numpy is the library o ...

  10. 深度学习-数学-第一篇-标量,向量,矩阵,张量

    这记录一些我刚开始学习所用到的数学 基础从最基础的开始 小知识: 0 ∈ {0 1 {0 1}表示一个集合,里面有0,1两个元素.所以0属于这个集合,就用0 ∈ {0 1}表示了.∈代表属于. {0 ...

最新文章

  1. 安全工程师2017年真题_以下是2017年全球软件工程师的平均薪水
  2. 【FPGA】Buffer专题介绍(一)
  3. 如何:从 Windows 窗体 DataGridView 控件中移除自动生成的列
  4. linux查看指定用户的所有进程
  5. 如何恢复被破坏的PowerDesigner pdm文件
  6. win7系统设置开机自动联网的方法
  7. 【Pytorch】X.view(-1)操作
  8. Oracle随记笔记
  9. 毕业十年,你的收入是怎样的?
  10. linux zip unzip 命令
  11. GD32系列外部中断
  12. 使用Matlab绘制gif动图
  13. vb中怎么使图片适应框的大小_如何让放进框内的图片随框大小而变
  14. 他们做的通用人工智能,要让所有产品都具备“智能”大脑
  15. 微信支付及支付宝支付开发指南
  16. 20个免费下载PSD设计网站
  17. Spring JMS CLIENT_ACKNOWLEDGE
  18. cocos制作水滴粘连效果
  19. css_min-height、max-height、height详细讲解
  20. 对接百度api之银行卡识别

热门文章

  1. 设置go path_Go命令的PATH安全性
  2. java多线程【线程常用方法】
  3. php从头部添加,php如何向header头添加Authorization信息?
  4. c#读取solidworks文件_C#初学者教程系列20:Stream流读写
  5. 两个特征是独立好还是正相关好_stata速学|相关分析|主成分分析|因子分析
  6. 用python画玫瑰花脚本-python画一个玫瑰和一个爱心
  7. python列出文件夹所有文件_python列出文件夹下的所有文件的4种方法
  8. ping端口怎么ping_英雄联盟手游ping信号怎么发送 ping信号发送方法介绍_游戏攻略...
  9. linux mint 主题切换,详解如何在 Linux Mint 中更换主题
  10. SOCKET聊天室字符界面版