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

光照
镜面反射分量+散射分量+环境分量
相关文章
|
JavaScript
Nuxt.js(Vue SSR)项目配置以及开发细节
Nuxt.js(Vue SSR)项目配置以及开发细节
257 0
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
1617 0
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
|
JavaScript
在vue3中使用markdown编辑器
在vue3中使用markdown编辑器
在vue3中使用markdown编辑器
|
弹性计算 Linux
在ECS Linux系统上误操作了`rm -rf /*`命令
在ECS Linux系统上误操作了`rm -rf /*`命令
548 3
|
存储 JSON JavaScript
glTF和GLB有什么区别?
glTF和GLB有什么区别?
372 0
|
机器学习/深度学习 前端开发 iOS开发
欢迎来到 WebGPU 的世界 上
欢迎来到 WebGPU 的世界
1645 0
欢迎来到 WebGPU 的世界 上
|
JSON 前端开发 JavaScript
Threejs引入字体,实现3D文字,Canvas画布作为纹理贴图实现滚动字幕
Threejs引入字体,实现3D文字,Canvas画布作为纹理贴图实现滚动字幕
974 0
|
11天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
201867 14
对话 | ECS如何构筑企业上云的第一道安全防线
|
19天前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
179634 22
|
6天前
|
弹性计算 人工智能 安全

热门文章

最新文章