提炼总结之——3D数学基础:图形与游戏开发

前言

这篇文章仅为了方便于自己查找一些3d 的数学公式。
DirectX使用的是行向量 ,即矩阵的乘法是左乘
OpenGL使用的是列向量 ,即矩阵的乘法是右乘
Unity的Shader中, 使用的是列向量 ,即矩阵的乘法是右乘

请注意,下面的矩阵向量如果没有特别说明,都是使用行向量(与Unity的有所区别)

一、向量类

向量的点积

  • 公式1:
    a ⃗ ⋅ b ⃗ = ∣ a ⃗ ∣ ⋅ ∣ b ⃗ ∣ c o s θ \vec{a}·\vec{b} = |\vec{a}|·|\vec{b}|cos\theta a b =a b cosθ
  • 公式2:
    a ⃗ ⋅ b ⃗ = ( a ⃗ x , a ⃗ y , a ⃗ z ) ⋅ ( b ⃗ x , b ⃗ y , b ⃗ z ) = a ⃗ x b ⃗ x + a ⃗ y b ⃗ y + a ⃗ z b ⃗ z \vec{a}·\vec{b} = (\vec{a}_{x},\vec{a}_{y},\vec{a}_{z})·(\vec{b}_{x},\vec{b}_{y},\vec{b}_{z})\\ = \vec{a}_{x}\vec{b}_{x}+\vec{a}_{y}\vec{b}_{y}+\vec{a}_{z}\vec{b}_{z} a b =(a x,a y,a z)(b x,b y,b z)=a xb x+a yb y+a zb z
  • 几何意义:
    点积是描述两个向量的"相似程度",点积结果越大,两向量越接近;
    结果等于0,代表两向量垂直;
    结果大于0,代表两向量的夹角大于90度;
    结果小于0,代表两向量的夹角小于90度。

向量的叉积

  • 公式
    a ⃗ × b ⃗ = [ a ⃗ x a ⃗ y a ⃗ z ] × [ b ⃗ x b ⃗ y b ⃗ z ] = [ a ⃗ y × b ⃗ z − a ⃗ z × b ⃗ y a ⃗ z × b ⃗ x − a ⃗ x × b ⃗ z a ⃗ x × b ⃗ y − a ⃗ y × b ⃗ x ] \vec{a}× \vec{b} = \begin{bmatrix} \vec{a}_{x} \\ \vec{a}_{y} \\ \vec{a}_{z} \\ \end{bmatrix} × \begin{bmatrix} \vec{b}_{x} \\ \vec{b}_{y} \\ \vec{b}_{z} \\ \end{bmatrix}= \begin{bmatrix} \vec{a}_{y}×\vec{b}_{z}- \vec{a}_{z}×\vec{b}_{y}\\ \vec{a}_{z}×\vec{b}_{x}- \vec{a}_{x}×\vec{b}_{z} \\ \vec{a}_{x}×\vec{b}_{y}- \vec{a}_{y}×\vec{b}_{x}\\ \end{bmatrix} a ×b = a xa ya z × b xb yb z = a y×b za z×b ya z×b xa x×b za x×b ya y×b x
  • 几何意义:
    叉积得到的向量垂直于原来的两个向量

二、矩阵

2.1 方阵

定义:行数和列数相同的矩阵称为方阵,如2×2矩阵,3×3矩阵,4×4矩阵等;

  • 对角矩阵
    定义:如果所有非对角线元素都为0,则这种矩阵称为对角矩阵,如下:
    [ M 11 0 0 0 0 M 22 0 0 0 0 M 33 0 0 0 0 M 44 ] \begin{bmatrix} M_{11}&0&0&0\\ 0&M_{22}&0&0\\ 0&0&M_{33}&0\\ 0&0&0&M_{44}\\ \end{bmatrix} M110000M220000M330000M44

  • 单位矩阵
    定义:对角线元素为1,其他元素为0的矩阵称为单位矩阵, 单位矩阵是一种特殊的对角矩阵,如下:
    [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] \begin{bmatrix} 1&0&0&0\\ 0&1&0&0\\ 0&0&1&0\\ 0&0&0&1\\ \end{bmatrix} 1000010000100001

任意一个矩阵乘以单位矩阵,都将得到原来的矩阵

2.2 矩阵乘法的注意事项

  • 矩阵乘法不满足交换律,即: AB≠ BA

  • 矩阵乘法满足结合律,即: (AB)C= A(BC) (假设A, B, C的维数使其乘法有意义,要注意如果(AB)C有意义,那么A(BC)- -定也有意义)
    矩阵乘法结合律可以扩展到多个矩阵的情况下,如:
    ABCDEF=(((AB)C)D)E)F= (((BC)D)E)F)=(AB)(CD)(EF)

  • 矩阵乘法也满足与标量或向量的结合律,即:
    (kA)B=k(AB)= A(kB)  (vA)B=v(AB)

  • 矩阵积的转置相当于先转置矩阵然后以相反的顺序乘:
    ( A B ) T = B T A T ( M 1 M 2 M 3 . . . M n − 1 M n ) T = M n T M n − 1 T . . . M 3 T M 2 T M 1 T (AB)^{T} = B^{T}A^{T}\\ ({M}_{1}{M}_{2}{M}_{3}...{M}_{n-1}{M}_{n})^{T} = {M}_{n}^{T}{M}_{n-1}^{T}...{M}_{3}^{T}{M}_{2}^{T}{M}_{1}^{T} (AB)T=BTAT(M1M2M3...Mn1Mn)T=MnTMn1T...M3TM2TM1T

  • 矩阵一向量乘法满足对向量加法的分配律。对于向量v、w和矩阵M,有:
    ( v ⃗ + w ⃗ ) M = v ⃗ M + w ⃗ M (\vec{v}+\vec{w})M = \vec{v}M+\vec{w}M (v +w )M=v M+w M

2.3 矩阵的转置

定义:
一个 r ∗ c 的矩阵 M , M 的转置记作 M T , M T 是一个 c ∗ r 的矩阵 一个r * c的矩阵M,M的转置记作 M^{T},M^{T}是一个c * r的矩阵 一个rc的矩阵MM的转置记作MT,MT是一个cr的矩阵
从另一方面理解, M i j T = M j i , 即沿着矩阵的对角线翻折 从另一方面理解,M_ij^{T} = M_ji,即沿着矩阵的对角线翻折 从另一方面理解,MijT=Mji,即沿着矩阵的对角线翻折

如下例子:
[ a b c d e f g h i ] T = [ a d g b e h c f i ] \begin{bmatrix} a&b&c\\ d&e&f\\ g&h&i\\ \end{bmatrix}^{T} = \begin{bmatrix} a&d&g\\ b&e&h\\ c&f&i\\ \end{bmatrix} adgbehcfi T= abcdefghi

2.4 矩阵的几何解析

2.4.1 矩阵怎样变换向量的

以 p ⃗ 、 q ⃗ 、 r ⃗ 为行构建一个 3 × 3 矩阵 M ,可以得到下面的形式: 以\vec{p}、\vec{q}、\vec{r}为行构建一个3×3矩阵M,可以得到下面的形式: p q r 为行构建一个3×3矩阵M,可以得到下面的形式:
M = [ p ⃗ q ⃗ r ⃗ ] = [ p ⃗ x p ⃗ y p ⃗ z q ⃗ x q ⃗ y q ⃗ z r ⃗ x r ⃗ y r ⃗ z ] M = \begin{bmatrix} \vec{p}\\ \vec{q}\\ \vec{r}\\ \end{bmatrix} = \begin{bmatrix} {\vec{p}}_{x}&{\vec{p}}_{y}&{\vec{p}}_{z}\\ {\vec{q}}_{x}&{\vec{q}}_{y}&{\vec{q}}_{z}\\ {\vec{r}}_{x}&{\vec{r}}_{y}&{\vec{r}}_{z}\\ \end{bmatrix} M= p q r = p xq xr xp yq yr yp zq zr z
如果用一个向量乘以该矩阵,得到:
[ x y z ] × [ p ⃗ x p ⃗ y p ⃗ z q ⃗ x q ⃗ y q ⃗ z r ⃗ x r ⃗ y r ⃗ z ] = x ⋅ p ⃗ + y ⋅ q ⃗ + z ⋅ r ⃗ \begin{bmatrix} x&y&z\\ \end{bmatrix} × \begin{bmatrix} {\vec{p}}_{x}&{\vec{p}}_{y}&{\vec{p}}_{z}\\ {\vec{q}}_{x}&{\vec{q}}_{y}&{\vec{q}}_{z}\\ {\vec{r}}_{x}&{\vec{r}}_{y}&{\vec{r}}_{z}\\ \end{bmatrix} = x·\vec{p} + y·\vec{q} + z·\vec{r} [xyz]× p xq xr xp yq yr yp zq zr z =xp +yq +zr

如果把矩阵的行解释为坐标系的基向量,那么乘以该矩阵就相当于执行了一次坐标转换。若有aM-如果把矩阵的行解释为坐标系的基向量,那么乘以该矩阵就相当于执行了一次坐标转换。若有aM = b,我们就可以说,M将a转换到b。

2.4.2 矩阵的形式

矩阵每一行都能解析为转换后的基向量。(大家可以用转换前的基向量乘该矩阵就可以得出结论,具体过程不再推导)

2.5 旋转矩阵

下面所说的角度都是以逆时针为正方形

2.5.1 2D的旋转矩阵

R ( θ ) = [ p ′ q ′ ] = [ c o s θ s i n θ − s i n θ c o s θ ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ \end{bmatrix} = \begin{bmatrix} cos\theta&sin\theta\\ -sin\theta&cos\theta\\ \end{bmatrix} R(θ)=[pq]=[cosθsinθsinθcosθ]

2.5.2 3D中绕坐标轴旋转

绕轴旋转θ时,必须知道哪个方向为正,哪个方向为负。
-------这个后面补充-------

  • 绕X轴旋转
    R ( θ ) = [ p ′ q ′ r ′ ] = [ 1 0 0 0 c o s θ s i n θ 0 − s i n θ c o s θ ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} 1&0&0\\ 0&cos\theta&sin\theta\\ 0&-sin\theta&cos\theta\\ \end{bmatrix} R(θ)= pqr = 1000cosθsinθ0sinθcosθ
  • 绕Y轴旋转
    R ( θ ) = [ p ′ q ′ r ′ ] = [ c o s θ 0 − s i n θ 0 1 0 s i n θ 0 c o s θ ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} cos\theta&0&-sin\theta\\ 0&1&0\\ sin\theta&0&cos\theta\\ \end{bmatrix} R(θ)= pqr = cosθ0sinθ010sinθ0cosθ
  • 绕Z轴旋转
    R ( θ ) = [ p ′ q ′ r ′ ] = [ c o s θ s i n θ 0 − s i n θ c o s θ 0 0 0 1 ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} cos\theta&sin\theta&0\\ -sin\theta&cos\theta&0\\ 0&0&1\\ \end{bmatrix} R(θ)= pqr = cosθsinθ0sinθcosθ0001

2.5.3 3D中绕任意轴旋转

R ( n , θ ) = [ p ′ q ′ r ′ ] = [ n x 2 ( 1 − c o s θ ) + c o s θ n x n y ( 1 − c o s θ ) + n z s i n θ n x n z ( 1 − c o s θ ) − n y s i n θ n x n y ( 1 − c o s θ ) − n z s i n θ n y 2 ( 1 − c o s θ ) + c o s θ n y n z ( 1 − c o s θ ) + n x s i n θ n x n z ( 1 − c o s θ ) + n y s i n θ n y n z ( 1 − c o s θ ) − n x s i n θ n z 2 ( 1 − c o s θ ) + c o s θ ] R(n,\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} n_x^{2}(1-cos\theta)+cos\theta&n_xn_y(1-cos\theta)+n_zsin\theta&n_xn_z(1-cos\theta)-n_ysin\theta\\ n_xn_y(1-cos\theta)-n_zsin\theta&n_y^{2}(1-cos\theta)+cos\theta&n_yn_z(1-cos\theta)+n_xsin\theta\\ n_xn_z(1-cos\theta)+n_ysin\theta&n_yn_z(1-cos\theta)-n_xsin\theta&n_z^{2}(1-cos\theta)+cos\theta\\ \end{bmatrix} R(n,θ)= pqr = nx2(1cosθ)+cosθnxny(1cosθ)nzsinθnxnz(1cosθ)+nysinθnxny(1cosθ)+nzsinθny2(1cosθ)+cosθnynz(1cosθ)nxsinθnxnz(1cosθ)nysinθnynz(1cosθ)+nxsinθnz2(1cosθ)+cosθ

2.6 缩放矩阵

2.6.1 2D的缩放矩阵

S ( k x , k y ) = [ k x 0 0 k y ] S(k_x,k_y) = \begin{bmatrix} k_x&0\\ 0&k_y\\ \end{bmatrix} S(kx,ky)=[kx00ky]

2.6.2 3D的缩放矩阵

S ( k x , k y , , k z ) = [ k x 0 0 0 k y 0 0 0 k z ] S(k_x,k_y,,k_z) = \begin{bmatrix} k_x&0&0\\ 0&k_y&0\\ 0&0&k_z\\ \end{bmatrix} S(kx,ky,,kz)= kx000ky000kz

2.6.3 2D沿任意方向的缩放矩阵

通过基向量构造矩阵,得到以单位向量n为缩放方向,k为因子的缩放矩阵,如下面公式所示
S ( n ⃗ , k ) = [ 1 + ( k − 1 ) n ⃗ x 2 ( k − 1 ) n ⃗ x n ⃗ y ( k − 1 ) n ⃗ x n ⃗ y 1 + ( k − 1 ) n ⃗ y 2 ] S(\vec{n},k) = \begin{bmatrix} 1+(k-1)\vec{n}_x^{2}&(k-1)\vec{n}_x\vec{n}_y\\ (k-1)\vec{n}_x\vec{n}_y&1+(k-1)\vec{n}_y^{2}\\ \end{bmatrix} S(n ,k)=[1+(k1)n x2(k1)n xn y(k1)n xn y1+(k1)n y2]

2.6.4 3D沿任意方向的缩放矩阵

以单位向量n为缩放方向,k为因子的3D缩放矩阵如下面公式所示
S ( n ⃗ , k ) = [ 1 + ( k − 1 ) n ⃗ x 2 ( k − 1 ) n ⃗ x n ⃗ y ( k − 1 ) n ⃗ x n ⃗ z ( k − 1 ) n ⃗ x n ⃗ y 1 + ( k − 1 ) n ⃗ y 2 ( k − 1 ) n ⃗ y n ⃗ z ( k − 1 ) n ⃗ x n ⃗ z ( k − 1 ) n ⃗ z n ⃗ y 1 + ( k − 1 ) n ⃗ z 2 ] S(\vec{n},k) = \begin{bmatrix} 1+(k-1)\vec{n}_x^{2}&(k-1)\vec{n}_x\vec{n}_y&(k-1)\vec{n}_x\vec{n}_z\\ (k-1)\vec{n}_x\vec{n}_y&1+(k-1)\vec{n}_y^{2}&(k-1)\vec{n}_y\vec{n}_z\\ (k-1)\vec{n}_x\vec{n}_z&(k-1)\vec{n}_z\vec{n}_y&1+(k-1)\vec{n}_z^{2}\\ \end{bmatrix} S(n ,k)= 1+(k1)n x2(k1)n xn y(k1)n xn z(k1)n xn y1+(k1)n y2(k1)n zn y(k1)n xn z(k1)n yn z1+(k1)n z2

-------没完待续。。。。。。后期会继续补充-------

本人资源全部免费,更多资源请查看我的上传资源 ====================================================== 书 名:3D数学基础图形游戏开发 作 者:[美] 邓恩(Dunn F.),[美] 帕贝利(Parberry I.) 著;史银雪,陈洪,王荣静 译 出 版 社: 清华大学出版社 出版时间:2005-07-01 ISBN:9787302109464 纸书页数:380页 定 价:¥ 42.00 内容简介:《3D数学基础图形游戏开发》专业培训机构指定教学参考书,多家游戏开发企业共同推荐,游戏业界,探索游戏开发背后的核心秘密。《3D数学基础图形游戏开发》主要介绍了基本的3D数学概念,这对电脑游戏开发人员和编程人员来说尤为重要。作者详尽地讨论了数学理论,并在必要时提供几何说明,帮助读者形成直观的3D感。书中还提供了将理论应用于实践的C++类,并且在每章结尾处提供练习。《3D数学基础图形游戏开发》介绍了基础概念,如向量、坐标空间、矩阵、变换、欧拉角、齐次坐标空间、几何图元、相交性检测和三角网格。 作者简介:Fletcher Dunn,是著名游戏开发公司Terminal Reality的主要开发人员,所参与开发游戏包括《4×4DVO 2)、《夜曲》(Noturne),并且是《吸血莱恩》(BloodRayne)的主要负责人。他所开发游戏遍及家用PC机的Windows、Machintosh、Dreamcast、PSⅡ、Xbox和GameCube几种主流平台。   Ian Parberry,是北德克萨斯大学计算机科学系的教授,在国际上被公认为是教授DirectX游戏开发的专家之一。 编辑推荐:《3D数学基础图形游戏开发》主要研究隐藏在3D几何世界背后的数学问题。涵盖了理论知识和C++实现代码。理论部分解释3D数学和几何之间的关系,列出的技巧与公式可以当做参考手册以方便查找。实现部分演示了怎样用代码来实现这些理论概念。读者论论了3D中的方位,包括四元数和对不同表示技术之间的优劣比较。   描述了数学和几何的实际应用示例,提供了一些C++类和不同的矩阵类,每个类都完成特定的几何任务。   所有基本变换矩阵的完整来历。      专门用Python讲解计算机视觉编程 目录 第1章 简介 1.1 什么是3D数学 1.2 为什么选择本书 1.3 阅读本书需要的基础知识 1.4 概览 第2章 笛卡尔坐标系统 2.1 1D数学 2.2 2D笛卡尔数学 2.3 从2D到3D 2.4 练习 第3章 多坐标系 3.1 为什么要使用多坐标系 3.2 一些有用的坐标系 3.3 嵌套式坐标系 3.4 描述坐标系 3.5 坐标系转换 3.6 练习 第4章 向量 4.1 向量——数学定义 4.2 向量——几何定义 4.3 向量与点 4.4 练习 第5章 向量运算 5.1 线性代数与几何 5.2 符号约定 5.3 零向量 5.4 负向量 5.5 向量大小(长度或模) 5.6 标量与向量的乘法 5.7 标准化向量 5.8 向量的加法和减法 5.9 距离公式 5.10 向量点乘 5.11 向量叉乘 5.12 线性代数公式 5.13 练习 第6章 3D向量类 …… 第7章 矩阵 第8章 矩阵和线性变换 第9章 矩阵的更多知识 第10章 3D中的方位与角位移 第11章 C++实现 第12章 几何图元 第13章 几何检测 第14章 三角网络 第15章 图形数学 第16章 可见性检测 第17章 后记 附录A 简单的数学概念 附录B 参考文献
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值