DirectX12 3D 游戏开发与实战第二章内容
矩阵代数
学习目标
- 理解矩阵及其相关运算的定义
- 探究为何能把向量和矩阵的乘法视为一种线性组合
- 学习单位矩阵、转置矩阵、行列式以及矩阵的逆等概念
- 逐步熟悉DirectXMath库中提供的关于矩阵计算的类与函数的子集
2.1矩阵的定义
一个规模为m x n的矩阵,是由m行n列实数构成的矩阵阵列,行数和列数的乘积表示了矩阵的维度,矩阵中的数字则称为元素或元。理解矩阵相等、加法运算,标量乘法和减法运算。
2.2矩阵乘法
如果A是一个m x n矩阵,B是一个n x p矩阵,那么AB的乘积是一个规模为m x p的矩阵C,矩阵C中第i行、第j列的元素,有矩阵A的第i个行向量与矩阵B的第j个列向量的点积求得。要注意的是,矩阵A的行向量的维数(可认为是分量的个数)必须和矩阵B的列向量的维数相等才可以使矩阵乘积AB有意义。而且矩阵乘积一般不满足交换律
2.2.2向量和矩阵的乘法
向量与矩阵的乘积uA相当于:向量u给定的标量系数(x,y,z)与矩阵A中各行向量的线性组合。这个结论有一个一般性,对于一个1 x n行向量u和一个n x m矩阵A的乘积为:u1A1 + u2A2 + …… unAn
2.2.3结合律
矩阵乘法对矩阵加法的分配律:A(B + C) = AB + AC和(A + B)C = AC + BC。
矩阵乘法结合律:(AB)C = A(BC)
2.3转置矩阵
转置矩阵指的是将原矩阵的行与列进行互换所得到的新矩阵,转置矩阵具有一些性质,这里不列举
2.4单位矩阵
单位矩阵I是一种主对角线的元素均为1,其他元素都为0的方阵。单位矩阵是矩阵的乘法单位元,即任何矩阵和单位矩阵相乘,得到的原矩阵,如果M是一个方阵M,则MI = IM,满足乘法交换律
2.5矩阵的行列式
行列式是一种特殊的函数,它以一个方阵作为输入,并输出一个实数,方阵A的行列式通常表示为det A。行列式推导出求逆矩阵的公示,此外,行列式也可以用来证明:方阵A是可逆的,当且仅当det A 不为0。
2.5.1余子阵
指定一个n x n的矩阵,余子阵Aij(A上有一横线)即从A中取出第i行和第j列的(n - 1) x (n - 2)矩阵
2.5.2行列式的定义
略
2.6伴随矩阵
略
2.7逆矩阵
略
2.8用DirectXMath库处理矩阵
为了对点和向量进行变换,我们要借助1 x 4行向量以及4 x 4矩阵
2.8.1矩阵类型
DirectXMath库用定义在DirectXMath.h头文件中的XMMATRIX类来表示4 x 4矩阵,XMMATRIX由4个XMVECTOR实例构成,借此来使用SIMD技术。XMMATRIX类为矩阵运算提供了多种重载运算符。除了各种构造方法之外,我们还可以使用XMMatrixSet函数来创建XMMATRIX实例。
和XMVECTOR一样,我们建议用XMFLOAT4X4来存储类中的矩阵类型数据成员,而不是直接使用XMMATRIX.
我们可以用加载方法和存储方法来实现XMMATRIX和XMFLOAT4X4类型之间的相互转换
加载方法:
XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource)
存储方法:
void XM_CALLCONV XMStoreFloat4x4(XMFloat4x4 * pDestination,FXMMATRIX M)
2.8.2矩阵函数
DirectXMath库包含了一些和矩阵相关的函数
//返回单位矩阵
XMMATRIX XM_CALLCONV XMMatrixIdentity();
//如果M是单位矩阵则返回true
bool XM_CALLCONV XMMatrixIsIdentity(FXMMATRXI M);
//返回矩阵乘积AB
XMMATRIX XM_CALLCONV XMMatrixMultiply(FXMMATRIX A,CXMMATRIX B);
//返回矩阵M的转置
XMMATRIX XM_CALLCONVE XMMatrixTranspose(FXMMATRIX M);
//返回(det M,det M,det M,det M,)
XMVECTOR XM_CALLCONV XMMatrixDeteminant(FXMMATRIX M);
//返回矩阵M的逆矩阵
XMMATRIX XM_CALLCONV XMMatrixInverse(XMVECTOR* pDeteminant,FXMMATRIX M);
在声明具有XMMATRIX参数的函数时,除了要注意一个XMMATRIX类型相当于4个XMVECTOR类型之外,还要注意,第一个参数应该为FXMMATRIX类型,其余都应该为CXMMATRIX类型。不过有一个特例,在构造函数中的参数应该都使用CXMMATRIX类型,而且对于构造函数,也不能使用XM_CALLCONV约定注解
2.8.3DirectXMath矩阵实例程序
主要是一些XMMATRIX类的使用范例,如果想要看示例代码可以自行百度,以后可能会更新。
DirectX12 3D 游戏开发与实战第二章内容的更多相关文章
- DirectX12 3D 游戏开发与实战第九章内容(上)
仅供个人学习使用,请勿转载. 9.纹理贴图 学习目标: 学习如何将局部纹理映射到网格三角形上 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次纹理贴图 ...
- DirectX12 3D 游戏开发与实战第一章内容
DirectX12 3D 第一章内容 学习目标 1.学习向量在几何学和数学中的表示方法 2.了解向量的运算定义以及它在几何学中的应用 3.熟悉DirectXMath库中与向量有关的类和方法 1.1 向 ...
- DirectX12 3D 游戏开发与实战第九章内容(下)
仅供个人学习使用,请勿转载.谢谢! 9.纹理贴图 学习目标 学习如何将局部纹理映射到网格三角形中 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次贴图 ...
- DirectX12 3D 游戏开发与实战第八章内容(下)
DirectX12 3D 游戏开发与实战第八章内容(下) 8.9.材质的实现 下面是材质结构体的部分代码: // 简单的结构体来表示我们所演示的材料 struct Material { // 材质唯一 ...
- DirectX12 3D 游戏开发与实战第八章内容(上)
8.光照 学习目标 对光照和材质的交互有基本的了解 了解局部光照和全局光照的区别 探究如何用数学来描述位于物体表面上某一点的"朝向",以此来确定入射光照射到表面的角度 学习如何正确 ...
- DirectX12 3D 游戏开发与实战第十章内容(下)
仅供个人学习使用,请勿转载.谢谢! 10.混合 本章将研究混合技术,混合技术可以让我们将当前需要光栅化的像素(也称为源像素)和之前已经光栅化到后台缓冲区的像素(也称为目标像素)进行融合.因此,该技术可 ...
- DirectX12 3D 游戏开发与实战第十章内容(上)
仅供个人学习使用,请勿转载.谢谢! 10.混合 本章将研究混合技术,混合技术可以让我们将当前需要光栅化的像素(也称为源像素)和之前已经光栅化到后台缓冲区的像素(也称为目标像素)进行融合.因此,该技术可 ...
- DirectX12 3D 游戏开发与实战第五章内容
渲染流水线 学习目标: 了解用于在2D图像中表现出场景立体感和空间深度感等真实效果的关键因素 探索如何用Direct3D表示3D对象 学习如何建立虚拟摄像机 理解渲染流水线,根据给定的3D场景的几何描 ...
- DirectX12 3D 游戏开发与实战第四章内容(上)
Direct3D的初始化(上) 学习目标 了解Direct3D在3D编程中相对于硬件所扮演的角色 理解组件对象模型COM在Direct3D中的作用 掌握基础的图像学概念,例如2D图像的存储方式,页面翻 ...
随机推荐
- Laya 中缩放的实现
Laya 缩放功能的实现 在 laya 中实现滚轮对选中对象的缩放,涉及到以下两个模块: 事件 容器坐标 1. 事件 在 Laya 中, Event 是事件类型的集合.包含了常见的鼠标事件.键盘事件. ...
- PL/SQL 调用JAVA使用UDP发送数据
步骤如下 1.直接在SQL命令中写入JAVA代码(用SYS帐号执行,不然权限等太麻烦) create or replace and resolve java source named udp as i ...
- 集成 Spring Boot 常用组件的后台快速开发框架 spring-boot-plus 国
spring-boot-plus是一套集成spring boot常用开发组件的后台快速开发框架 Purpose 每个人都可以独立.快速.高效地开发项目! Everyone can develop pr ...
- Python 创建目录 and 删除目录
import os import shutil #删除并创建目录 def rmdir(path): try: shutil.rmtree(path) print(path+':删除成功') os.ma ...
- 百度地图获取定位,实现拖动marker定位,返回具体的位置名
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 11_for语句的使用
for是一种循环结构 go语言中,for语句结构: for 初始语句; 条件语句; 迭代后语句 { 代码体 } 例子: package main import "fmt" impo ...
- Contour 学习笔记(二):使用级联功能实现蓝绿部署和金丝雀发布
上篇文章介绍了 Contour 分布式架构的工作原理,顺便简单介绍了下 IngressRoute 的使用方式.本文将探讨 IngressRoute 更高级的用法,其中级联功能是重点. 1. Ingre ...
- CodeForces 1107 - G Vasya and Maximum Profit 线段树
题目传送门 题解: 枚举 r 的位置. 线段树每个叶子节点存的是对应的位置到当前位置的价值. 每次往右边移动一个r的话,那么改变的信息有2个信息: 1. sum(a-ci) 2.gap(l, r) 对 ...
- JOBDU 1140 八皇后
题目1140:八皇后 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1064 解决:665 题目描述: 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个 ...
- 基于C-W节约算法的车辆路径规划问题的Java实现
VRP问题概述 解决算法分类 项目描述 算法结果 车辆路线问题(VRP)最早是由Dantzig和Ramser于1959年首次提出,它是指一定数量的客户,各自有不同数量的货物需求,配送中心向客户提供货物 ...