我的博客和笔记我的博客和笔记
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
  • 我的文章

    • 从抛币协议到智能合约

      • Part1
      • Part2
    • JPEG算法解密

      • Part1
      • Part2
      • Part3
      • Part4
      • Part5
      • Github
    • SPH算法简介

      • Part1
      • Part2
      • Part3
      • Part4
      • Github
    • 赌博中的数学:Martingle策略
    • 如何生成一个随机的圆形
    • 一个简单的DH密钥协商算法的实现
    • 如何计算线段和圆的交点
    • 一道数学趣题
    • 斐波那契数列和1/89
    • 匀速贝塞尔曲线运动的实现

      • Part1
      • Part2
  • 开源项目

    • TurboLink
    • TinyEncrypt
    • UnrealStyleGuide
    • AxTrace
    • Cyclone
  • 学习笔记

    • 数学相关

      • 常用数学符号
      • 群
      • 数论(一)
      • 数论(二)
      • 数论(三)
      • 概率
    • 密码学

      • RSA
      • 抛币协议
      • 智能扑克协议
    • 图形学

      • 数学基础

        • 矢量
          • 1. 基础约定
            • 1.1 坐标系
            • 1.2 左乘和右乘
            • 1.3 行存储和列存储
          • 2. 矢量
            • 2.1 基本操作
            • 2.2 标准矢量
            • 2.3 长度
            • 2.4 点积
            • 2.5叉积
            • 2.6 混合积
            • 2.7 三重积
        • 矩阵
        • 立体角
        • 几何变换(一)
        • 几何变换(二)
        • 法线变换
        • 摄像机变换
      • 光照模型

        • 传统光照模型
        • 光度学
        • 双向反射分布函数(BRDF)
        • 微平面理论(一)
        • 微平面理论(二)
        • 微平面理论(三)
        • 光照方程
      • 环境光渲染

        • 环境光渲染(一)
        • 环境光渲染(二)
    • 编程语言

      • JavaScript

        • 环境搭建
        • 基本语法
        • 函数
        • 对象和类

数学基础(一)


1. 基础约定

1.1 坐标系

1.1.1 左手坐标系

DirectX一般缺省使用左手坐标系

1.1.2 右手坐标系

OpenGL缺省使用右手坐标系,图形学中缺省使用这种坐标系

1.2 左乘和右乘

1.2.1 左乘,前乘(pre-multiply)

矢量为行向量,和矩阵的乘法为

[x,y,z][M11M12M13M21M22M23M31M32M33]

DirectX缺省使用左乘

1.2.2 右乘,后乘(post-multiply)

矢量为列向量,和矩阵的乘法为

[M11M12M13M21M22M23M31M32M33][xyz]

OpenGL缺省使用右乘,图形学中缺省使用这种方式。

1.3 行存储和列存储

1.3.1 行存储

在计算机内存中,按照行优先存储一个矩阵,DirectX使用这种方式 比如对于矩阵

[M11M12M13M21M22M23M31M32M33]

在内存中为M11,M12,M13,M21,M22…

1.3.2 列存储

按照列优先存储一个矩阵,OpenGL使用这种方式 比如对于矩阵

[M11M12M13M21M22M23M31M32M33]

在内存中为M11,M21,M31,M12,M22…

2. 矢量

2.1 基本操作

2.1.1 定义

u→=[ux,uy,uz]T,v→=[vx,vy,vz]Tu→±v→=[ux±vx,uy±vy,uz±vz]Tku→=[kux,kuy,kuz]T

2.1.2 几何意义

2.2 标准矢量

标准矢量(Standard Basis),定义i→=[1,0,0]T,j→=[0,1,0]T,k→=[0,0,1]T

2.3 长度

2.3.1 定义

对于三维矢量u→,定义矢量的长度

∥u→∥=ux2+uy2+uz2

有时候矢量的长度也可以用|u→|表示,但容易和绝对值混淆

2.3.2 定义

对于三维矢量u→,定义矢量的单位矢量

u→^=u→∥u→∥=(ux∥u→∥,uy∥u→∥,uz∥u→∥)

2.4 点积

2.4.1 定义

对于两个三维矢量u→,v→,定义它们的点积(Dot Product)为

u→⋅v→=uxvx+uyvy+uzvz

2.4.2 点积的几何意义

a→⋅b→=∥a→∥∥b→∥cos⁡θ

两个向量的点积可以看成两个向量相近的程度,向量和自身的点积是向量长度的平方

u→⋅u→=∥u→∥∥u→∥=ux2+uy2

向量a→在向量b→上的投影的长度为

ab=a→⋅b→∥b∥

2.4.3 推论

判断两个矢量u→,v→之间的夹角和它们之间点积的关系

cos⁡(θ)=u→⋅v→∥u→∥∥v→∥
  • 当u→⋅v→>0,夹角在[0,90)之间
  • 当u→⋅v→=0,两个矢量垂直
  • 当u→⋅v→<0,两个矢量夹角在(90,180]之间

2.4.3 基本运算规则

矢量的点积满足一般的交换律、分配律

  • a→⋅b→=b→⋅a→
  • a→⋅(b→+c→)=a→⋅b→+a→⋅c→
  • (ka→)⋅b→=a→⋅(kb→)=k(a→⋅b→)

2.5叉积

2.5.1 定义

对于两个三维矢量a→,b→,定义它们的叉积

a→×b→=|i→j→k→axayazbxbybz|=(aybz−azby)i→+(azbx−axbz)j→+(axby−aybx)k→

2.5.2 叉积的几何意义

在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。

定义向量n→是一个单位向量,方向同时垂直于向量u→和v→,且符合右手定则(右手坐标系),那么

u→×v→=∥u→∥∥v→∥sin⁡(θ)n→

向量a和向量b的叉积还可以视作以a→和b→为边的平行四边形的面积

2.5.3 基本运算规则

  • a→×b→=−b→×a→
  • a→×a→=0→
  • a→×(b→+c→)=a→×b→+a→×c→
  • a→×(kb→)=k(a→×b→)

2.5.4 叉积的矩阵形式

两个向量的叉积,可以表达成一个矩阵和向量的乘积的形式,例如向量a→和b→的叉积

a→×b→=[(a→×b→)x(a→×b→)y(a→×b→)z]=[aybz−azbyazbx−axbzaxby−aybx]=[0−azayaz0−ax−ayax0][bxbybz]

这里称这个矩阵为矢量a→的叉乘矩阵cross-product matrix,写作[a]×

[a]×=def[0−azayaz0−ax−ayax0]

2.6 混合积

对于三个矢量a→,b→,c→,定义混合积为

(a→×b→)⋅c→

混合积满足

(a→×b→)⋅c→=(b→×c→)⋅a→=(c→×a→)⋅b→

2.6.1 混合积的几何意义

如图,以三个矢量为边的棱作平行六面体,∥a→×b→∥可以视作以a→和b→为边的平行四边形的面积,(a→×b→)⋅c→可以视作这个平行六面体的体积

2.7 三重积

对于三个矢量a→,b→,c→,有如下公式

(2.6.1)a→×(b→×c→)=(a→⋅c→)b→−(a→⋅b→)c→

证明:
设d→=a→×(b→×c→),可知d→垂直于b→和c→所组成的平面的法线,也就是d→平行于b→和c→所组成的平面。所以d→可以表达成b→和c→的线性组合

d→=mb→+nc→

由于d→垂直于a→,所以

a→⋅(mb→+nc→)=0m(a→⋅b→)+n(a→⋅c→)=0

所以一定存在一个非零的实数p,使得m=p(a→⋅c→),n=−p(a→⋅b→),所以

d→=a→×(b→×c→)=p(a→⋅c→)b→−p(a→⋅b→)c→

由于这是一个恒等式,p的值和a→,b→,c→无关,当特殊情况a→=c→时,有

a→×(b→×a→)=p(a→⋅a→)b→−p(a→⋅b→)a→

两边同时点积b→,可以得到

a→×(b→×a→)⋅b→=p(a→⋅a→)(b→⋅b→)−p(a→⋅b→)(a→⋅b→)

等号左侧应用混合积公式,可以得到

a→×(b→×a→)⋅b→=(b→×a→)⋅(b→×a→)=∥a∥2∥b∥2sin2(θ)

等号右侧

p(a→⋅a→)(b→⋅b→)−p(a→⋅b→)(a→⋅b→)=p∥a∥2∥b∥2−p∥a∥2∥b∥2cos2(θ)=p∥a∥2∥b∥2(1−cos2(θ))=p∥a∥2∥b∥2sin2(θ)

由此可得p=1

Next
矩阵