内容来源于《3D数学基础:图形与游戏开发》,以下内容为学习笔记,仅供学习
向量计算
向量的大小(模)
各分量平方和的平方根
dist=Math.sqrt(x*x+y*y+z*z)
单位向量
大小为1的向量
V/|V|
归一化向量,标准化向量:获取向量的方向,即获取向量的单位向量
normalize
加减乘除
[x1,y1,z1]+[x2,y2,z2]=[x1+x2,y1+y2,z1+z2]
[x1,y1,z1]-[x2,y2,z2]=[x1-x2,y1-y2,z1-z2]
k[x,y,z]=[kx,ky,kz]
[x,y,z]/k=[x/k,y/k,z/k]
点积(内积、点乘)
各分向量的乘积
[x1,y1,z1].[x2,y2,z2]=x1*x2+y1*y2+z1*z2
在标准化向量中,点积等于两向量夹角的余弦值,方向相同,点积为1,方向相反点积为-1,相互垂直为0
叉乘(叉积、外积)
[x1,y1,z1]x[x2,y2,z2]=[y1*z2-z1*y2,z1*x2-x1*z2,x1*y2-y1*x2]
两个向量面所组成面的垂直向量
模长为两个向量的模乘积再乘夹角正弦值
两个向量距离
a=[x1,y1,z1]
b=[x2,y2,z2]
(a,b)=|b-a|=Math.sqrt( (x2-x1)^2+ (y2-y1)^2+(z2-z1)^2)
正方体法各个面的向量
上:vec3(0,1,0)
下:vec3(0,-1,0)
左:vec3(-1,0,0)
右:vec3(1,0,0)
前:vec3(0,0,1)
后:vec3(0,0,-1)
向量
转置
a b c
d e f
g h i
=>转置后
a d g
b e h
c f i
矩阵乘法
rxn矩阵A * nxc矩阵B = rxc矩阵C
Cij的结果等于A的第i行向量与B的第j列向量点乘的结果
向量与矩阵的乘法
a b c
[x,y,z] *[d e f] =[x*a+y*b+z*g,x*b+y*e+z*h,x*c+y*f+z*i]
g h i
a b c x a*x+b*y+c*z
[d e f] * [y]=[d*x+e*y+f*z]
g h i z g*x+h*y+i*z
a b c
[1,0,0] * [d e f]=[a,b,c]
g h i
a b c
[0,1,0] * [d e f]=[d,e,f]
g h i
a b c
[0,0,1] * [d e f]=[g,h,i]
g h i
变换矩阵
x轴 y轴 z轴 变形
m0 m4 m8 m12
m1 m5 m9 m13
m2 m6 m10 m14
m3 m7 m11 m15
2D旋转
R(θ)=[cosθ sinθ]
-sinθ cosθ
3D旋转
绕x轴旋转
1 0 0
R(θ)=[0 cosθ sinθ]
0 -sinθ cosθ
绕y轴旋转
cosθ 0 sinθ
R(θ)=[0 1 0 ]
-sinθ 0 cosθ
绕z轴旋转
cosθ sinθ 0
R(θ)=[-sinθ cosθ 0 ]
0 0 1
绕[x,y,z]向量方向上的旋转
x^2(1-cosθ)+cosθ xy(1-cosθ)-zsinθ xz(1-cosθ)+ysinθ
xy(1-cosθ)+zsinθ y^2(1-cosθ)+cosθ yz(1-cosθ)-xsinθ
xz(1-cosθ)-ysinθ yz(1-cosθ)+xsinθ z^2(1-cosθ)+cosθ
3D缩放
k1 0 0
S(k1,k2,k3)=[0 k2 0]
0 0 k3
[x,y,z]向量方向上的缩放
1+(k-1)x^2 (k-1)xy (k-1)xz
(k-1)xy 1+(k-1)y^2 (k-1)yz
(k-1)xz (k-1)yz 1+(k-1)z^2
正交投影(平行投影)
所有点拉平至垂直轴(2D)或平面(3D)上
向x轴投影2D矩阵
Px=[1 0]
0 0
向y轴投影2D矩阵
Py=[0 0]
1 0
[x y]方向上的2D投影
1-x^2 -xy
-xy 1-y^2
向xy面投影3D矩阵
1 0 0
Pxy=[0 1 0]
0 0 0
向xz面投影3D矩阵
1 0 0
Pxz=[0 0 0]
0 0 1
向yz面投影3D矩阵
0 0 0
Pyz=[0 1 0]
0 0 1
[x y z]方向上的3D投影
1-x^2 -xy -xz
-xy 1-y^2 -yz
-xz -yz 1-z^2
镜像
物体沿直线(2D)或平面(3D)进行翻折
沿[x,y]向量镜像的2D矩阵
1-2x^2 -2xy
-2xy 1-2y^2
沿[x,y,z]向量镜像的2D矩阵
1-2x^2 -2xy -2xz
-2xy 1-2y^2 -2yz
-2xz -2yz 1-2z^2
切变(扭曲变换)
切变是非均匀地拉伸它。切变的时候角度会发生变化,但令人惊奇的是面积和体积却保持不变。基本思想是将某一坐标的乘积加到另一个上
2D沿x轴切变
1 0
s 1
2D沿y轴切变
1 s
0 1
3D沿xy面切变
1 0 0
0 1 0
s t 1
3D沿xz面切变
1 0 0
s 1 t
0 0 1
3D沿yz面切变
1 s t
0 1 0
0 0 1
矩阵行列式
|M| = |a b|=ad-bc
c d
|a b c|=aei+bfg+cdh-ceg-bdi-afh
d e f
g h i
4D齐次空间
4D标的基本思想相同实际的3D点能被认为是在4D中w=1“平面”上。4D点的形式为(x,y,z,w),将4D点投影到这个“平面”上得到相应的实际3D点(x/w,y/w,z/w)。w=0时4D点表示“无限远点”它描述了一个方向而不是一个位置。
a b c
d e f
g h i
3x3矩阵可变换为
a b c 0
d e f 0
g h i 0
0 0 0 1
变换矩阵 平移向量[x,y,z]
1 0 0 0
0 1 0 0
0 0 1 0
x y z 1
透视投影
投影线相交于一点,该点为投影中心
为投影中心在投影平面前面,投影线到达平面之前已经相交,所以投影平面上的图像是翻转的。当物体远离投影中心时,正交投影仍保持不变,但透视投影变小了。透视缩略
小孔成像的原理
欧拉角
欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。描述物体相对于父坐标空间的方位
可分解为三个垂直轴的旋转
- heading,绕y轴
- pitch,绕x轴
- bank,绕z轴
注意:使用限制欧拉角能简化很多基本问题。让一个欧拉角处于限制集里的意思是指 heading和bank在-180"到+180之间,pitch 在-90°到+90°之间。如果pitch 为士90°,则bank 为零
欧拉角=》矩阵
heading旋转角h
cosh 0 sinh
0 1 0
-sinh 0 cosh
pitch旋转角p
1 0 0
0 cosp -sinp
0 sinp cosp
bank旋转角b
cosb -sinb 0
sinb cosb 0
0 0 1
从欧拉角计算物体到惯性旋转矩阵
cos(h)cos(b)+sin(h)sin(p)sin(b) sin(b)cos(p) -sin(h)cos(b)+cos(h)sin(p)sin(b)
-cos(h)sin(b)+sin(h)sin(p)cos(b) cos(b)cos(p) sin(b)sin(h)+cos(h)sin(p)cos(b)
sin(h)cos(p) -sin(p) cos(h)cos(p)
几何图元
中心在原点的单位球面上所有点:
x^2+y^2+z^2=1
2D参数表示点在单位圆上
x(t)=cos(2*PI*t)
y(t)=sin(2*PI*t)
球体,圆心(a,b,c),半径r
(x-a)^2+(y-b)^2+(z-c)^2=r^2
圆周长:2*PI*r
圆面积:PI*r^2
球表面积:4*PI*r^2
球体积:(4/3)*PI*r^3
射线参数表示开始点(a,b)
x(t)=a+t*∆x
y(t)=b+t*∆y
向量表示,向量为p,开始点(a,b)p0
p(t)=p0+t*∆p
直线2D
ax+by=d
y=kx+b
向量:p*n=d
平面方程式
ax+by+zc=d
p1,p2,p3三点确定一个法向量
e3=p2-p1
e1=p3-p2
法向量为
(e3*e1)/|(e3*e1)|
图形学
弧度=角度*PI/180
角度=弧度*180/PI
放缩与视场角转换
zoom=1/tan(fov/2)
fov=2arctan(1/zoom)
[x,y,z,w]=>[x/w,y/w,z/w]
裁剪矩阵
x,y,z必须在-w至w之间
n,f为近,远两个切面的距离
zoomx为水平放缩值
zoomy为垂直放缩值
zoomx 0 0 0
0 zoomy 0 0
0 0 (f+n)/(f-n) 1
0 0 (2nf)/(n-f) 0
openGL ,z范围[0,w]
zoomx 0 0 0
0 zoomy 0 0
0 0 f/(f-n) 1
0 0 (nf)/(n-f) 0
光照
镜面反射分量+散射分量+环境分量