最近在看游戏导航源码,但是看了几天感觉看不懂。里面全是一些几何运算,以及一些关于3d方面的知识。发现自己缺少3d这方面的知识,正好也想研究一下3d游戏开发的基本原理,于是决定买本书看看了,后来在opengl和directx要选择一个,感觉directX是微软的,就选了directx。

必备的数学知识

3D空间中的向量

几何学中一个有向线段表示,向量两个重要属性:长度、方向

向量不含有位置信息,如果向量的长度和方向相等即相等  。

左手直角坐标系和右手直角坐标系:左手直角坐标系z轴正方向穿进纸面,右手直角坐标系中z轴正方向穿出纸面。

向量处于标准位置:当某一向量起始端与坐标原点重合时。这样我们可以用向量的终点坐标来描述一个处于标准位置的向量。用于描述向量的坐标称为分量(component)

注意:由于标准位置中的向量都是用终点来表示的,因此点和向量很容易混淆。所以再次重申:点只是描述位置而向量描述了长度和方向

向量的表示:u=(ux,uy),N=(Nx,Ny,Nz) 通常用小写(有时也用大写)粗体字母来表示

四个特殊的3d向量:

  1. 零向量:其所有分量都为0用粗体0来表示 0 = (0,0,0)
  2. 其余三个向量称为R3的标准向量。这些向量分别为i,j,k方向,方向分别与x,y,z轴一致,且长度均为1:i=(1,0,0),j=(0,1,0),k=(0,0,1)

在D3DX库中,我们用类D3DXVECTOR3表示3d空间的向量。

向量相等

如果向量和长度方面相等,那么相等。

D3DXVECTOR u(1.0f,0.0f,1.0f);

D3DXVECTOR v(0.0f,1.0f,1.0f);

if(u == v) return true

向量计算长度

FLOATD3DXVec3Length(CONST D3DXVECTOR3 * pV);

向量的规范化

向量的规范化就是使向量的模变为1.即变为单位向量。可以通过将向量的每个分量都除向量的模来实现 。

D3DXVECTOR3 * D3DXVec3Normalize(D3DXVECTOR3 * pOut)

向量的相加

几何学上的向量相加


D3DXVECTOR3 u(2.0f, 0.0f, 1.0f);
D3DXVECTOR3 v(0.0f, -1.0f, 5.0f); // (2.0 + 0.0, 0.0 + (-1.0), 1.0 + 5.0)
D3DXVECTOR3 sum = u + v; // = (2.0f, -1.0f, 6.0f)

向量减法:

D3DXVECTOR3 u(2.0f, 0.0f, 1.0f);
D3DXVECTOR3 v(0.0f, -1.0f, 5.0f);
D3DXVECTOR3 difference = u - v; // = (2.0f, 1.0f, -4.0f)

数乘(标量与向量的乘积)

标量可以与向量相乘,顾名思义,该运算可对向量进行缩放。该运算不改变向量的方向,除非该向量与负数相乘,这是向量的方向与原来的方面相反 。

D3DXVECTOR3 u(1.0f, 1.0f, -1.0f);

D3DXVECTOR3 scaledVec = u * 10.0f; // = (10.0f, 10.0f, -10.0f)

点积(两个向量的乘积)

如果u和v都是单位向量则v*u就等于u,v夹角的余弦。

下面是点积的一些有用的性质:

  1. 若u*v=0 则u⊥v
  2. 若u*v>0 则两向量之间的夹角小于90度
  3. 若u*v<0 则两向量之间的夹角大于90度

FLOAT D3DXVec3Dot( // Returns the result.
CONST D3DXVECTOR3* pV1, // Left sided operand.
CONST D3DXVECTOR3* pV2 // Right sided operand.
);

叉积

与点积不同的是,叉积的结果是另一个向量。如果取向量 u和v的差积,运算所得的向量p与v、u彼此正交,也就是p与u正交,也行v正交。

矩阵

一个m*n的矩阵是一个m行,n列的矩形数组。行数和列数指定了矩阵的维数。我们用双下标来标识矩阵元素,其中第一个下标为元素所在行的索引,第二个下标不元素成在列的索引。

有时一个矩阵仅包含单行或单列。这样的矩阵称为行向量或列向量,下面是一人行向量和列向量的例子。

矩阵相等、数乘、加法

  • 相等:维数相同、对应元素相同。
  • 数乘:一个标量与矩阵每一个元素相乘
  • 相加:只有两个矩阵维数相同时,方可进行。加法就是对应元素相加所得的矩阵。
  • 减法:与加法相似

矩阵乘法

前提条件:A的列数等于B的行数,故乘积AB是有意义的。请注意,如果交换相乘的次序为BA 便无意义,因为B的列数和 A的行数不相等

由此说明:一般情况下矩阵乘法不满足乘法交换律(也就是, AB≠BA)

定义:若A为m*n的矩阵,B为n*p的矩阵,则乘积AB有意义,且等于一个m*p矩阵C,其中乘积C的第ij个元素的值等于A的第i个行向量与B的第j个列向量的点积。

单位矩阵:

有一种特殊的矩阵为单位矩阵,单位矩阵的特点是除主对角线上的元素为1外,其余元素均为0,而且是方阵。

单位矩阵可以作为一个乘法单位:MI=IM=M

即:用一个单位矩阵与某个矩阵相乘,不改变该矩阵。而且,某一矩阵与单位矩阵相乘,

逆矩阵:

逆矩阵的重要信息

  1. 只有方阵才能有逆矩阵,所以,当我们提到逆矩阵时,我们假定所关心的对象为方阵
  2. 一个m*n矩阵M的逆矩阵也是一个n*m矩阵,用符号M^-1表示。
  3. 并非所有方阵都有逆矩阵
  4. 一个矩阵与其逆矩阵的乘积为单位阵。

一个性质:(AB)^-1 = B^-1 A^-1

矩阵的转置

通过交换矩阵行和列来实现M的矩阵用M^T表示

D3DX矩阵

编写D3Dx应用程序时,我们通常只使用4*4的矩阵和1*4的行向量。注意这两种维数的矩阵,意味着如下矩阵乘法是有意义的。

  1. 向量矩阵乘法
  2. 矩阵矩阵乘法

基本变换

在Direct3D编程时,我们使用4*4的矩阵表示一个变换。其思路如下:

  1. 设置一个4*4矩阵中元素的值
  2. 然后我们将某一点的坐标或某一向量的分量放入一个1*4的行向量v中
  3. 乘积vX就生成了一个新的经过变化的向量v’

平移矩阵

旋转矩阵

比例变换矩阵

几何变换的组合

最新文章

  1. 一起来玩echarts系列(一)------箱线图的分析与绘制
  2. csv to splite db form
  3. mysql中变量赋值
  4. JustSniffer
  5. 文科生也能看懂的iptables教程(转载)
  6. wamp5.2 升级到wamp5.3 (转载)
  7. mongo export import
  8. python正则表达式练习篇2
  9. Python 第十三节 文件操作
  10. JavaScript变量存储浅析
  11. shiro权限框架(五)
  12. 结构体addrinfo, sockaddr, sockaddr_in的区别
  13. python 列表常用操作(二)
  14. oracle日志相关的表
  15. 思维+并查集 hdu5652
  16. python类里面使用装饰器
  17. pylot 学习笔记
  18. wait(),notify(),notifyAll()用来操作线程为什么定义在Object类中?
  19. LeetCode——Consecutive Numbers
  20. 【BZOJ4418】[Shoi2013]扇形面积并 扫描线+线段树

热门文章

  1. 【互动问答分享】第7期决胜云计算大数据时代Spark亚太研究院公益大讲堂
  2. 7/26 CSU-ACM2018暑期训练3-递归&amp;递推-选讲
  3. hihocoder1067 最近公共祖先&#183;二(tarjin算法)(并查集)
  4. 数据结构-二叉搜索树(BST binary search tree)
  5. luogu P4012 深海机器人问题
  6. 【动态规划】bzoj1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典
  7. 【树链剖分】【线段树】bzoj2157 旅游
  8. 1.1(学习笔记)JSP(Java Server Pages)基础(脚本元素、指令元素)
  9. C++类的复习
  10. fidder模拟post提交到PHP遇到的问题