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

光照
镜面反射分量+散射分量+环境分量
相关文章
|
安全 jenkins 持续交付
如何在 Jenkins 中配置邮件通知?
如何在 Jenkins 中配置邮件通知?
807 11
最通俗易懂的 JAVA slf4j,log4j,log4j2,logback 关系与区别以及完整集成案例
最通俗易懂的 JAVA slf4j,log4j,log4j2,logback 关系与区别以及完整集成案例
最通俗易懂的 JAVA slf4j,log4j,log4j2,logback 关系与区别以及完整集成案例
|
机器学习/深度学习 人工智能 安全
操作系统的未来:智能化与安全性的融合
随着人工智能和机器学习技术的迅猛发展,未来的操作系统将不再是简单的软件平台,而是成为智能化的管理者和服务者。本文将探讨操作系统如何通过集成先进的AI技术来提升用户体验,同时确保系统的安全性不被新兴的网络威胁所侵蚀。我们将分析当前操作系统的安全挑战,探索AI在增强操作系统安全性方面的潜力,并提出未来操作系统发展的可能方向。
301 7
|
移动开发 前端开发 数据可视化
一份小白前端可视化学习指南——附思维导图
一份小白前端可视化学习指南——附思维导图 前言 因为群里粉丝一直要求我写一篇「可视化入门指南」,今天他来了。其实说起前端可视化,大家所能想到的就是各种图表,大屏。这种看着贼炫酷,而笔者呢工作也一直从事3D前端开发工作,慢慢对图形产生了兴趣。但是呢一直做的是三维的东西,没搞过二维的。大概是2月前开始学习2D的一些东西,然后并写了一些文章,效果还不错。所以我就写一些经验之谈,大佬勿喷。我大概从4个方面去讲我是怎么学习的 「可视化不得不掌握的数学基础」 「svg」方面的学习 「canvas」方面的学习 「可视化中」不得不掌握的「图形算法」 读完本篇文章,你可以大概知道我该怎么去学,需要学什
一份小白前端可视化学习指南——附思维导图
|
SQL 存储 NoSQL
附PPT下载|DTCC演讲:降本增效,阿里云一站式数据库上云最佳实践
在第十三届中国数据库技术大会(DTCC 2022)上,阿里云数据库高级解决方案架构师王林平从上云路径、云上数据库使用实践及使用进阶等方案深入介绍了阿里云一站式数据库上云最佳实践。 本文内容根据演讲录音以及PPT整理而成。
附PPT下载|DTCC演讲:降本增效,阿里云一站式数据库上云最佳实践
|
算法 调度
【调度算法】NSGA II
【调度算法】NSGA II
1352 1
|
Linux 开发者 iOS开发
QT:基于QMediaPlayer制作的视频播放器(最下方有整合包,可直接运行)
QMediaPlayer是Qt多媒体模块中的一个核心类,它提供了播放音频和视频内容的功能。这个类的设计旨在简化跨平台的媒体播放,使得开发者能够在多种操作系统(如Linux、Windows、macOS及移动平台)上轻松集成多媒体播放能力到他们的应用中,而无需关心底层实现细节。以下是关于QMediaPlayer的一些关键点:
772 0
无缝融合:使用 Python 和 PyFFmpeg 合并视频的完整指南
使用Python和PyFFmpeg合并视频教程:安装pyffmpeg和subprocess模块,编写merge_videos函数,通过ffmpeg命令行工具进行视频拼接。运行脚本将多个.mp4文件合并为一个,并保存为merged_video.mp4。简单易用,提升内容创作效率。
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】 ODConv(Omni-Dimensional Dynamic Convolution):全维度动态卷积
ODConv是一种增强型动态卷积方法,通过多维注意力机制在卷积的四个维度上学习互补注意力,提升轻量级CNN准确性和效率。与现有动态卷积不同,ODConv覆盖了空间、输入/输出通道和核数维度。在ImageNet和MS-COCO上,对MobileNetV2|ResNet等模型有显著性能提升,减少参数的同时超越传统方法。代码和论文链接可用。在YOLO系列中,ODConv改进了特征学习,优化了目标检测性能。
|
XML 数据格式 Kotlin
Kotlin 异步 | Flow 限流的应用场景及原理
Kotlin 异步 | Flow 限流的应用场景及原理
1236 0