Ver Fonte

添加AABB使用 和 空间划分介绍

usuiforhe há 3 anos atrás
pai
commit
b1c368837f

BIN
图形学/Image/123.png


BIN
图形学/Image/124.png


BIN
图形学/Image/125.png


BIN
图形学/Image/126.png


BIN
图形学/Image/127.png


+ 86 - 5
图形学/图形学.md

@@ -30,15 +30,24 @@ https://latex.codecogs.com/svg.latex?\vec{A}=(^{x}_{y})\\\vec{A}^T=(x,y)\\\lVert
 ### 点乘
 
 $$
-\vec{A} = (^{x} _{y}) \\
-\vec{A}^T = (x, y) \\
-\lVert \vec{A} = \sqrt{x ^2 + y^2} \rVert \\
+\vec{A} = (^{x} _{y}) 
+$$
+
+$$
+\vec{A}^T = (x, y) 
+$$
+
+$$
+\lVert \vec{A} = \sqrt{x ^2 + y^2} \rVert 
 $$
 
 向量之间的点乘 
 
 $$
-\vec{A} \cdot \vec{B} = \lVert \vec{A} \rVert * \lVert \vec{B} \rVert * \cos \theta \\
+\vec{A} \cdot \vec{B} = \lVert \vec{A} \rVert * \lVert \vec{B} \rVert * \cos \theta 
+$$
+
+$$
 \cos \Theta = \frac{\vec{A} \cdot \vec{B}}{\lVert \vec{A} \rVert * \lVert \vec{B} \rVert}
 $$
 
@@ -2173,7 +2182,7 @@ Shadow Mapping可以处理硬阴影的情况:即一个点要么在阴影中,
 
 ### 加速计算光线与物体表面的求交 (Accelerating Ray-Surface Intersection)
 
-计算光照最暴力的做法,每个像素打出的光线都要与所有的物体,所有的三角形计算交点,并且光线每经过一次 反射/折射 都要计算新的光线与每个物体的三角形的交点
+计算光照最暴力的做法,每个像素打出的光线都要与**所有的物体**,**所有的三角面**计算交点,并且光线每经过一次 反射/折射 都要计算新的光线与每个物体的三角形的交点
 
 如果真的是上面这种暴力做法,计算效率就特别低
 
@@ -2219,4 +2228,76 @@ $t_{quit} = max(t_{x_{max}}, t_{y_{max}}, t_{z_{max}})$
 - $t_{enter}$ 小于0, ${t_{quit}}$ 大于0,则表示 光源 在碰撞盒 内部 
 - 如果 $t_{enter}$ 小于 ${t_{quit}}$,并且 $t_{quit}$ 大于 0, 则表示 光线 与 碰撞盒 相交
 
+#### AABB帮助加速求交计算
+
+1. 找到包围盒
+
+![](./Image/123.png)
+
+> 假设上图外框一个包围盒包住了5个圆
+
+2. 对包围盒 划分网格 并 标记与物体相交的网格 (预处理)
+
+![](./Image/124.png)
+
+> 上图右上角还有一个网格没有标记出来
+
+3. 光线追踪
+
+![](./Image/125.png)
+
+这里将光线与网格的碰撞分成了三种情况
+
+- 网格1: 与光线相交,但是网格内并没有物体,所以无需处理
+- 网格2: 与光线相交,并且网格内存在物体,需要计算一次光线与物体相交的判断,计算后发现光线与物体不相交,无需处理
+- 网格3: 与光线相交,并且网格内存在物体,需要计算一次光线与物体相交的判断,计算后发现光线与物体相交,需要计算颜色
+
+光线与网格相交的计算很快,与物体相交的计算很慢
+
+至于与哪些网格相交,举个例子就是这里的**光线的方向是右上方**,那么下一个与光线相交的格子要么是**当前格子的右边**,要么是**当前格子的上面**
+
+通过上述方法可以加速计算光线与物体相交的计算,但是存在一个问题,对包围盒进行网格划分的**密度应该如何设置?**
+
+这里存在两个极端情况
+
+1. 不做任何划分 -> 没有任何效果
+2. 划分的很密集 -> 与网格相交的计算量与直接计算所有物体相交的计算量相近
+
+经过测试 网格数量 = 物体数量 * 27 是一个比较好的效果,常数27
+
+使用网格划分对于物体比较均匀划分的场景应用比较合适,但是对于中空比较多的场景就不太合适,比如篮球场,大部分都是空的,这样空白网格过多也会造成许多无效计算
+
+#### 空间划分
+
+针对上面物体分布不均匀的状况,可以把空的地方不划分,物体多的地方多划分
+
+![](./Image/126.png)
+
+- Oct-Tree 八叉树 (三维空间 一个立方体切成8块, 二维空间 一个正方形分成4份)
+- KD-Tree 
+- BSP-Tree
+
+对于上述的树形结构,一般物体的信息存储在**叶子节点**中,**非叶子节点**存储网格对应的坐标、大小等信息
+
+![](./Image/127.png)
+
+> 上述左图为空间划分,右图为树形结构  
+
+1. 一根光线发出
+2. A区域对应的叶子节点中存储了A区域的坐标和大小,判定光线穿过了A区域
+3. A节点下的左节点1 判断是否与光线相交,发现相交,与1区域所有物体求交
+4. A节点下的右节点B 判断是否与光线相交,发现相交,由于B节点非叶子节点,继续判断B节点下的左右叶子节点
+5. B节点下的左节点2 判断是否与光线相交,发现相交,与2区域所有物体求交
+6. B节点下的右节点C 判断是否与光线相交,发现相交,由于C节点非叶子节点,继续判断C节点下的左右叶子节点
+7. C节点下的左节点D 判断是否与光线相交,发现相交,由于D节点非叶子节点,继续判断D节点下的左右叶子节点
+8. D节点下的左节点4 判断是否与光线相交,发现相交,与4区域所有物体求交
+9. D节点下的右节点5 判断是否与光线相交 发现不相交 不做处理 跳过
+10. C节点下的右节点3 判断是否与光线相交 发现相交,与3区域所有物体求交
+11. 结束
+
+按照上图,虽然成功进行了空间划分,但是也暴露的一些问题
+
+1. 有些物体横框了多个包围盒,也就是说每个包围盒叶子节点都要存一份该物体,但其实最好一个物体就存在一个叶子节点中
+2. 如何计算物体与包围盒相交,这个计算其实比较复杂
+
 # 动画模拟、仿真