文章目录
加速光线追踪
通过在aabb包围盒内画格子加速光线追踪
上一篇博客为了加速光线追踪启用了aabb包围盒 我们发现和包围盒相交容易 和每一块模型相交比较难 如果我们一旦和包围盒相交了 我们就需要和包围盒内的每一个物体相交 一样很耗时 所以我们在每一个包围盒内分出格子 如图
当我们与包围盒相交后 我们再与盒子内的格子(三维来说就是小方块)相交 当相交的格子内有物体时(我们会先把有物体的格子标记出来)我们就会判断一次光线和物体是否相交 这样就加快了速度
Oct-Tree(八叉树)
最左边那张图 八叉树就是把aabb包围盒切三刀分成八块 然后在每个子节点再切成八块 一直切到你不想切为止 图中只切了左上角那一部分 而什么时候不切了 就是看你自己定条件(比如说从图中二维的情况可以定 如果切出来的四块里面有三块是没有东西的 这个时候就不用再切了)
KD-Tree
图中我们标的数字就是KD-Tree树每一轮切的 他会横竖交替着切(在三维上就是xyz轴交替着切) 每切一次把包围盒分成两部分 类似于二叉树
就像图中这样 蓝色绿色橙色那边也一样要分 只是不方便写出来 他分的具体位置没有定死 不是一定要在中点处分 每分一次要知道下一次是分什么轴(x,y,z)这个要按顺序来
KD-Tree难点
很难判断一个三角形是否在这个小的包围盒内 就如上面图中的 很难判定圆圈是否有一部分在分出来的区域内
比如说 圆圈有可能是一小部分在包围盒内 也有可能圆圈包住了包围盒
一个物体可能在多个小包围盒内(一个圆圈可能在多个方框内) 可能出现重复计算
BSP-Tree
相较于KD-Tree他的区别就是它可以斜着切
Bounding Volume Hierarchy(BVH)(现今最常用的)
他是通过物体来划分的
如何创建BVH
他是按照物体来划分小包围盒 (同样黄色那边还要划分)小包围盒之间可以出现重叠的情况 但他不会出现重复计算的问题 因为虽然有重叠的部分 但是不会出现一个三角形属于多个小包围盒(子节点)
步骤:
1.递归的把大包围盒的物体按一定规则分为两个部分(也可以按x,y,z轴依次划分,具体情况具体分析(可以每次按 分一个最长的轴))
2.把划分成的两个部分(划分的时候要把里面的物体分的尽量平均 就是分出来的两棵树里面的三角形尽量一样多 这个时候我们就需要找到第n/2个三角形的位置进行划分 有一个算法是快速选择可以尽快找到(也可也以之间排序 再找))重新计算包围
3.当叶子节点里面的三角形足够少的时候停止划分
创建好BVH后如何使用
先判断光线是否和该节点相交
如果不想交相交直接返回
如果相交则判断是否为叶子节点
如果是叶子节点 就判断光线和节点里面的物体是否发生碰撞
如果不是叶子节点 就通过递归分别判断该节点的两个子节点和光线 是否相交