文档章节

D3D编程必备的数学知识(3)

rise-worlds
 rise-worlds
发布于 2016/06/20 13:42
字数 1054
阅读 1
收藏 0

矩阵

在这一部分我们关注的焦点是数学中的矩阵。它们在3D图形学中的应用将在下一部分讲解。

一个m×n的矩阵是由m行和n列的数字组成的矩阵列。行和列的数字就是这个矩阵的维数。我们通过写在下方的数字识别矩阵清单,数字中的第一个表示行第二个表示列。例如下边的M是3×3矩阵,B是2×4矩阵, C是3×2矩阵。

我们使用加粗的大写字母表示矩阵。有时一个矩阵只包含一行或者一列。我们用行矩阵和列矩阵这个特殊的名称来称呼。例如下边就是行和列矩阵:

当使用行或列矩阵时,我们只用一个下标,有时我们还用字母表示。

D3DX 矩阵

当设计Direct3D应用程序时,使用4×4矩阵和1×4行矩阵(向量)是有代表性的。注意使用这两种矩阵意味着可以进行下列定义的矩阵乘法。

n       向量-矩阵乘法。即,假如1×4的单行矩阵V,和4×4的矩阵T,那么积VT可计算并且返回的结果是一个1×4的单行矩阵(向量)。

n       矩阵-矩阵乘法。即,假如4×4的矩阵T,和4×4的矩阵R,那么积TRRT可计算并且两者返回的结果都是一个4×4的矩阵。注意因为矩阵乘法不满足交换律所以TRRT不一定相等。

在D3DX中表示1×4的行矩阵(向量),我们用D3DXVECTOR3和D3DXVECTOR4向量类。当然D3DXVECTOR3只有3个成员,不是4个。然而,第4个成员缺省是1或0(在下一部分有更多信息)。

在D3DX中表示4×4的矩阵,我们用D3DXMATRIX类,定义如下:

typedef struct D3DXMATRIX : public D3DMATRIX
{
public:
D3DXMATRIX() {};
D3DXMATRIX(CONST FLOAT*);
D3DXMATRIX(CONST D3DMATRIX&);
D3DXMATRIX(FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14,
FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24,
FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34,
FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44);
// access grants
FLOAT& operator () (UINT Row, UINT Col);
FLOAT operator () (UINT Row, UINT Col) const;

// casting operators
operator FLOAT* ();
operator CONST FLOAT* () const;

// assignment operators
D3DXMATRIX& operator *= (CONST D3DXMATRIX&);
D3DXMATRIX& operator += (CONST D3DXMATRIX&);
D3DXMATRIX& operator -= (CONST D3DXMATRIX&);
D3DXMATRIX& operator *= (FLOAT);
D3DXMATRIX& operator /= (FLOAT);

// unary operators
D3DXMATRIX operator + () const;
D3DXMATRIX operator - () const;

// binary operators
D3DXMATRIX operator * (CONST D3DXMATRIX&) const;
D3DXMATRIX operator + (CONST D3DXMATRIX&) const;
D3DXMATRIX operator - (CONST D3DXMATRIX&) const;
D3DXMATRIX operator * (FLOAT) const;
D3DXMATRIX operator / (FLOAT) const;

friend D3DXMATRIX operator * (FLOAT, CONST D3DXMATRIX&);

BOOL operator == (CONST D3DXMATRIX&) const;
BOOL operator != (CONST D3DXMATRIX&) const;

} D3DXMATRIX, *LPD3DXMATRIX;

The D3DXMATRIX class inherits its data entries from the simpler D3DMATRIX structure, which is defined as:

typedef struct _D3DMATRIX {
union {
struct {
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
float m[4][4];
};
} D3DMATRIX;

观察D3DXMATRIX类发现有很多有用的运算符,比如对矩阵检测相等,矩阵相加和矩阵相减,标量与矩阵相乘,类型转换(casting),以及非常重要的两个D3DXMATRIXs相乘。因为矩阵相乘是非常重要的,我们给出一段实例代码:

D3DXMATRIX A(…); // initialize A

D3DXMATRIX B(…); // initialize B

D3DXMATRIX C = A * B; // C = AB

D3DXMATRIX类另一个重要的运算符是小括号,它允许我们非常方便的为矩阵成员赋值。注意当使用小括号时我们的下标就象C语言数组下标一样是从0开始的。例如,为一个矩阵的ij = 11 赋值,我们写成:

D3DXMATRIX M;

M(0, 0) = 5.0f; // Set entry ij = 11 to 5.0f.

D3DX库也提供下列有用的函数:将D3DXMATRIX转化为单位矩阵,转置D3DXMATRIX矩阵以及求逆矩阵。

D3DXMATRIX *D3DXMatrixIdentity(

              D3DXMATRIX *pout // 将矩阵转换为单位矩阵

);

D3DXMATRIX M;

D3DXMatrixIdentity( &M ); // M = 单位矩阵

D3DXMATRIX *D3DXMatrixTranspose(

       D3DXMATRIX *pOut, // 输出的转置矩阵

       CONST D3DXMATRIX *pM // 原矩阵

);

D3DXMATRIX A(...); // 初始化矩阵A

D3DXMATRIX B;

D3DXMatrixTranspose( &B, &A ); // B = 输出的转置矩阵

假如我们将不能求逆的矩阵用求逆函数,那么函数将会返回null.同样的,这本书我们忽视第二个参数,并且总是把它设置为0。

D3DXMATRIX *D3DXMatrixInverse(

       D3DXMATRIX *pOut, // 输出的逆矩阵

       FLOAT *pDeterminant, // 除非是必需的,一般设为0

       CONST D3DXMATRIX *pM // 原矩阵

);

D3DXMATRIX A(...); // 初始化矩阵

D3DXMATRIX B;

D3DXMatrixInverse( &B, 0, &A ); // B = A的逆矩阵

本文转载自:http://www.cnblogs.com/flying_bat/archive/2008/03/16/1108355.html

rise-worlds

rise-worlds

粉丝 2
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
盈趣上海众多游戏技术岗位火热招募中

职位一:C/C++客户端开发工程师 工作职责: 1.负责MTK平台游戏客户端主要模块的开发 2.负责游戏客户端与服务器端的交互 3.负责客户端代码的整合及优化 职位要求: 1. 1年以上MTK平台游戏开发...

yuer150
2011/04/26
366
3
盈趣信息技术上海有限公司众多技术岗位招募中

职位一:C/C++客户端开发工程师 工作职责: 1.负责MTK平台游戏客户端主要模块的开发 2.负责游戏客户端与服务器端的交互 3.负责客户端代码的整合及优化 职位要求: 1. 1年以上MTK平台游戏开发经验...

yuer150
2011/05/02
1K
0
如何学好游戏3D引擎编程

注:本文是网上看到的一篇文章,感觉写的很好,因此收藏了下来 《如何学好游戏3D引擎编程》 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我...

loving_forever_
2016/07/28
0
0
机器学习中的数学:一份新鲜出炉的热门草稿

来源:机器之心; 本文约1500字,建议阅读5分钟。 本文为你分享近日《Mathematics for Machine Learning》的全部草稿已放出,我们整理了这本书的简要概述。 近日,Marc Peter Deisenroth、A...

数据分析v
2018/11/08
0
0
数学老师装逼技巧,你绝对不会!

依稀记得,在小学到高中的学习生涯中,印象最深刻的就是数学老师了,总是觉得数学老师是最牛掰的,什么难题都能解,什么图都会画,好像就没有什么是能难倒他的。那么作为一名数学老师,你怎样...

学术研究软件
2016/04/25
399
0

没有更多内容

加载失败,请刷新页面

加载更多

rsync工具常用选项以及同步的两种方式

rsync -av /etc/passwd /tmp/1.txt #rsync的本机传输写法 rsync -av /tmp/1.txt 192.168.188.128:/tmp/2.txt #rsync的远程传输rsync格式rsync [OPTION] … SRC ......

林怡丰
今天
3
0
GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238

GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238 (Address already in use) 官方文档虽然有相同的问题,但是对我的问题没起作用…… 后面发现自己手贱...

wenzhizhong
昨天
3
0
REST接口

文章来源 https://zhuanlan.zhihu.com/p/28674721?group_id=886181549958119424 http://www.ruanyifeng.com/blog/2014/05/restful_api.html REST 对请求的约定 REST 用来规范应用如何在 HTTP......

Airship
昨天
6
0
Spring Cloud Config 统一配置中心

Spring Cloud Config 统一配置中心 一、统一配置中心 统一管理配置 通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如...

非摩尔根
昨天
6
0
android ------ AAPT2 error: check logs for details解决方法

AAPT 是全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。我们在 Android SDK 目录...

切切歆语
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部