3D数学图形学基础

简介: 3D数学图形学基础!!!3D数学图形学基础!!!3D数学图形学基础!!!

内容来源于《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

光照
镜面反射分量+散射分量+环境分量
相关文章
|
5月前
大学物理(上)-期末知识点结合习题复习(5)——刚体力学-转动惯量、力矩、线密度 面密度 体密度、平行轴定理和垂直轴定理、角动量定理和角动量守恒定律
大学物理(上)-期末知识点结合习题复习(5)——刚体力学-转动惯量、力矩、线密度 面密度 体密度、平行轴定理和垂直轴定理、角动量定理和角动量守恒定律
32 0
|
算法 算法框架/工具
图论算法实例分析|趣味象棋
图论(graph theory)是数学的一个分支,以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
120 0
图论算法实例分析|趣味象棋
|
C# 图形学
Unity基础——3D数学
Unity基础——3D数学
211 0
|
C++ 计算机视觉
霍夫直线检测代码实战
霍夫圆检测原理+实战
190 0
霍夫直线检测代码实战
|
vr&ar 图形学
【Unity3D 灵巧小知识点】 ☀️ | 求解 两个向量的夹角度数
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
【Unity3D 灵巧小知识点】 ☀️ | 求解 两个向量的夹角度数