《DirectX 9.0 3D游戏开发编程基础》必备的数学知识 读书笔记

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

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

必备的数学知识

3D空间中的向量

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

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

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

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

image

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

向量的表示: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)

向量的相加

几何学上的向量相加

image
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)

向量减法:

image


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)

点积(两个向量的乘积)

image

如果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.
);

叉积

image

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

矩阵

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

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

image

矩阵相等、数乘、加法

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

矩阵乘法

前提条件: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,而且是方阵。

image

单位矩阵可以作为一个乘法单位: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’

平移矩阵

旋转矩阵

比例变换矩阵

几何变换的组合

相关文章
|
存储 程序员 C++
《高质量C/C++编程》读书笔记三
《高质量C/C++编程》读书笔记三
60 0
|
前端开发 Java 程序员
《高质量C/C++编程》读书笔记一
《高质量C/C++编程》读书笔记一
50 0
|
存储 人工智能 算法
C++ Primer Plus 第6版 读书笔记(7)第 7 章 函数——C++的编程模块
乐趣在于发现。仔细研究,读者将在函数中找到乐趣。C++自带了一个包含函数的大型库(标准 ANSI 库加上多个 C++类),但真正的编程乐趣在于编写自己的函数;另一方面,要提高编程效率,本章和第 8 章介绍如何定义函数、给函数传递信息以及从函数那里获得信息。
132 0
|
存储 编解码 JSON
Python编程从入门到实践-读书笔记(下)
基础知识重点摘录 字符串 在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号。这种灵活性让你能够在字符串中包含引号和撇号:
|
存储 JSON 测试技术
Python编程从入门到实践-读书笔记(上)
基础知识重点摘录 字符串 在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号。这种灵活性让你能够在字符串中包含引号和撇号:
|
6月前
|
存储 安全 编译器
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
|
6月前
|
存储 算法 Java
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)
|
6月前
|
安全 Java C++
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(上)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计