您的位置:首页 > 其它

龙书笔记(1)

2014-04-07 09:17 155 查看
1.下载 DirectX 9.0 和 DirectX 9.0 SDK,前者的安装很简单,后者要记住安装的目录

SDK/Documentation有chm的查阅工具
SDK/Samples/C++有非常多的东西可以学习
SDK/Lib/x86/是很多会用到的库,主要是d3d9.lib d3dx9.lib winmm.lib
SDK/Include是要包含的头文件

2.在vs2005下:
1.工具 -> 选项 -> 项目和解决方案 -> VC++目录 -> 库文件 -> 添加...SDK/Lib/x86
2.工具 -> 选项 -> 项目和解决方案 -> VC++目录 -> 包含文件 -> 添加 ...SDK/Include
 在vs2010下:
视图 -> 其他窗口 -> 属性管理器 -> debug | win32 -> microsoft.cpp.win32.user -> 像vs05那样添加 ...SDK/Lib/x86 和 ...SDK/Include
(好像要随便开启一个项目后才可看见debug | win32,否则里面是空的,至少我的是这样的)

3.在解决方案里面,右击项目 -> 属性 -> 链接器 -> 输入 —> 附加项 中写入d3d9.lib d3dx9.lib winmm.lib
  剩下的就是写代码 和 运行了。当然也可以使用下面的办法直接添加在文件里面:

#pragma comment( lib, "d3d9.lib" );


4.命名约定:
所有 成员变量 以 下划线 为 前缀
全局变量 和 函数名 都以 大写 字母开头
局部变量 和 方法(类里面的那种,当然也可能是结构体) 都以 小写 字母开头

第一部分:数学基础

1.向量2个重要信息: 长度 和 方向

2.几何学中,只要 长度 和 方向 相同,无论 起点 是否相同,那么这些向量就相等。(平行也相等)

3.左手左边系: x水平方向,y竖直方向,z的方向是穿进纸面。

4.标准位置: 某向量的 起始端 和 原点 重合,则该向量在标准位置

5.零向量: 所有分量都为零

6.标准基向量: (1,0,0) (0,1,0) (0,0,1)

7.单位向量: 长度为1的向量

8.在D3DX库中,D3DXVECTOR3表示3D空间中的向量
eg:

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


9.代数学中,只有在维度相同且相应分量也相同的情况下,才说两个向量相同。也就是 (Ux,Uy,Uz) = (Vx,Vy,Vz)
eg:if(U == V)
return true;

10.向量的长度,就是模,也叫范数,在D3DX中的描述如下,

D3DXVECTOR3 v(1.0f, 2.0f, 3.0f);
float magnitude = D3DXVec3Length( &v );

11.向量的规范化:就是使向量的模变为1,即变为单位向量,也就是U=U/|U|
在D3DX中,可以使用D3DXVec3Normalize()
其原型如下: 

D3DXVECTOR3* D3DXVec3Normalize( D3DXVECTOR3* pout, CONST D3DXVECTOR3* pv1 );


12.向量加法:D3DX的描述如下:

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

13.向量减法:D3DX的描述如下:
D3DXVECTOR3 dif = u - v;

14.数乘:D3DX的描述如下:
D3DXVECTOR3 sc = u * 10.0f;

15.点积:对应项乘积再求和,首先说明一点,点积的结果是一个数而不是向量,然后点积还可以用 模乘模乘cos夹角来算。
 点积为0,则两向量垂直;点积大于0,则两向量夹角小于90;点积小于0.则夹角大于90
  在D3DX中就是这样:
float dot = D3DXVec3Dot(&u, &v);


16.叉乘:这返回的是一个向量, (a1,b1,c1)x(a2,b2,c2)=(b1*c2-c1*b2,-(a1*c2-c1*a2),a1*b2-b1*a2)

注意中间的负号,可以用左手来判断乘积结果的方向

在D3DX中pv1叉乘pv2描述为:

D3DXVECTOR3* D3DXVec3Cross( D3DXVECTOR3* pout, CONST D3DXVECTOR3* pv1, CONST D3DXVECTOR3* pv2);


17. 矩阵,m行,n列。 注意,若一个矩阵包含 单行 或 单列,则称为 行向量 或 列向量

18. 矩阵 相等:
维数相同,且对应项也一样
  矩阵 数乘:与每一个元素相乘
 矩阵 加法:维数得一样,对应项相加

19. 矩阵乘法:
若计算 矩阵A 乘 矩阵B, 则先决条件是 :"A 的列数 等于 B 的行数"
运算规则很重要,但是描述起来很麻烦(用起来很简单),所以不细说。
注意:由于矩阵乘法的特殊性质,所以 一般 矩阵的乘法不满足 交换率

20. 单位矩阵,更准确的说是 矩阵单位化: 主对角线上元素均为1(左上到右下), 其余元素均为0, 而且是一个方阵(行数列数一致)。
注意:某个矩阵和单位矩阵相乘 可以 进行 交换率(这是一个特例), 而且其结果还是原矩阵(完全可以把他理解为实数集里的"1")

21. 逆矩阵 (主要是关于 矩阵的 "除法"):
(1)方阵才有逆矩阵,但不是所有方阵都有逆矩阵。 

(2)一个n*n的矩阵的逆矩阵也是n*n。
(3)矩阵和他的逆矩阵 乘积 为 单位矩阵(这里也可以用交换率)
一个有用的法则:
(AB)的逆 = B的逆 乘 A的逆(注意顺序)

22. 矩阵的转置 : 简单的说就是,第一行变为第一列,第二行变为第二列....(矩阵的转置记为T)

23. D3DX矩阵描述:
1. 定义矩阵:

D3DXMATRIX A(...);

D3DXMATRIX B(...);
2. 矩阵相乘:

D3DXMATRIX C = A * B;

3. 查找矩阵某个位置的元素:M(0,0);//返回的是m(11),因为下标是从0开始的

4. 单位矩阵:

D3DXMATRIX M;
D3DXMatrixIdentity( &M );


5. 转置矩阵:

D3DXMatrixTranspose( &B, &A );

6. 逆矩阵:

D3DXMatrixInverse( &B, 0, &A );


24. 基本变换: 设置的是4 * 4 的矩阵, 行向量是 1*4 的。对于第四个分量w, 
若w=1, 保证平移变换;
若w=0, 防止实施平移变换。
对于w既不为1,也不为0 的情况, 称向量 处于 齐次空间。
w=0表示的是向量; w=1表示的是点。
齐次空间映射回3D空间的办法是: 4 个元素全部除以 w(是第四个分量变为1)

25. 平移矩阵: 数学描述:
(x,y,z,1) 沿x平移px, y平移py,z平移pz,只需将此向量 乘一个矩阵:1 0 0 0
0 1 0 0
0 0 1 0
px py pz 1
D3DX描述为:
D3DXMATRIX * D3DXMatrixTranslation( D3DXMATRIX * pout, FLOAT x, FLOAT y, FLOAT z);


26. 旋转矩阵: 
(1)沿x轴
D3DXMATRIX * D3DXMatrixRotationX( D3DXMATRIX * pout, FLOAT Angel );

(2)沿y轴
D3DXMATRIX * D3DXMatrixRotationY( D3DXMATRIX * pout, FLOAT Angel );

(3)沿z轴
D3DXMATRIX * D3DXMatrixRotationZ( D3DXMATRIX * pout, FLOAT Angel );

一个矩阵的 逆矩阵 和 转置矩阵 相等,这样的矩阵称为 正交矩阵

27.比例变换矩阵:把一个向量沿指定方向伸缩一定的倍数

D3DXMATRIX * D3DXMatrixScaling( D3DXMATRIX * pout, FLOAT sx, FLOAT sy, FLOAT sz );


28. D3DX对 点 和 向量 进行变换:
点的:
D3DXMATRIX T(...);
D3DXVECTOR3 p(...);
D3DXVec3TransformCoord( &p, &p, &T);

向量的:
D3DXMATRIX T(...);
D3DXVECTOR3 v(...);
D3DXVec3TransformNormal( &v, &v, &T);


29. 判断一个点在平面的前面还是后面

D3DXPLANE p(0.0f, 1.0f, 0.0f, 0.0f);
D3DXVECTOR3 v(3.0f, 5.0f, 2.0f);
float x = D3DXPlaneDotCoord( &p, &v );
if(x>0)	//在平面前方
if(x<0) //在平面后方


30.  平面的创建
方式1:

D3DXPLANE *D3DXPlaneFromPointNormal(
D3DXPLANE *pOut,
CONST D3DXVECTOR3 *pPoint,		//平面上的点
CONST D3DXVECTOR3 *pNormal		//法向量
);

方式2:

D3DXPLANE *D3DXPlaneFromPoints(
D3DXPLANE *pOut,
CONST D3DXVECTOR3 *pV1;
CONST D3DXVECTOR3 *pV2;
CONST D3DXVECTOR3 *pV3;			//这些是点不是向量
);


31. 平面法向量的规范化:

D3DXPLANE * D3DXPlaneNormalize( D3DXPLANE * pout, CONST D3DXPLANE * pin);


32. 平面的变换(平面要规范化,矩阵要逆转置)

D3DXMATRIX T(...);
D3DXMATRIX inverseOfT;
D3DXMATRIX inverseTransposeOfT;

D3DXMatrixInverse( &inverseOfT, 0, &T );
D3DXMatrixTranspose( &inverseTransposeOfT, &inverseOfT);

D3DXPLANE p(...);
D3DXPlaneNormalize( &p, &p );

D3DXPlaneTransform( &p, &p, &inverseTransposeOfT);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: