• q3 bsp随笔(2)


    看完了q3的port生成,以及pvs的生成

    做个记录


    由于q3 bsp树生成时,将场景中所有的brush平面都参与,

    所以就可用bsp树的分割平面来切分port


    port从根节点开始,初始winding是根节点分割平面,与场景最大包围盒平面切割而成

    之后,剃归处理每个节点,对port进行切分,每个子节点的分割平面也做为port,被父节点的port切分


    这样,可以想像,port最终会被切割成场景中的 门 窗


    然后根据port 生成pvs



    port最终会连接两个叶子节点

    (注意,此时已经淘汰了那个不可能出现视点的叶子节点,如实心体的内部,

    淘汰方式很简单,如果哪个节点有brush,假设brush是长方体,那么这个节点一定被淘汰,因为视点不会在实心体里出现)


    q3对每个port生成两个副本

    然后判断port之间的位置关系,首先挑出 与 port 相对的port,认为它们是可见的

    然后,进行flood递归,挑出那些不连通的叶子节点

    (想像成,一个一个房间,如果有两个房间,这两个房间没有port直接或间接相连,则认为这两个房间不可见)


    再对每个port进行passage算法。

    原理很简单,

    找出与这个port(source)相连接的leaf的所有port(pass)

    取当前要计处source port的一条边,与pass的所有顶点组成平面,取出那个将source与pass完全隔在两边的平面seperator

    笔者做一个简单的图来理解这个过程

    source   seperator pass

    |       |

    |       |

    |      |


    中间倾斜的就是seperator平面,显然这是通过source与pass之间,能见的最大范围

    这个平面会有若干个,组成一个视截体,对余下的port进入切割,不在视截体范内的port剃除

    在视体范围内的递归进行passage算法source不变,但pass换成切割后的port

    这样就相对准确地找出当前叶子节点的pvs


    预算pvs写回磁盘

    就成为我们在游戏代码中看到的那个 gen_world_surface函数,画出玩家当前的可视节点



    基本上能凑出一个有室内室外场景的游戏。

    许多开源游戏默认都实现了八叉树与bsp(泄露出来的unreal好像也是这样)


    不同的是商业引擎还实现了bsp场景生成,开源的则依赖于q3的场景生成工具,只做了bsp解析


    时过境迁,bsp技术现在更多是展示多边形裁减,碰撞检测,它的核心功能,让多边形由远到近地绘制,因为有了zbuffer显得不是那么重要了

    再拜卡马克大神,感谢id的开源。




  • 相关阅读:
    从零开始系统深入学习android(实践让我们开始写代码Android框架学习7.App Widgets)
    用才智征服天下,用信誉赢得未来
    微众时代看网络营销
    营销不是传奇,欠的只是方法
    名扬天下,从这里出发
    【缅怀妈妈系列诗歌】之二十六:贺诞母亲
    营销密码,带你走进神奇地带
    打造“80后”第一营销品牌
    如果有一天
    把你写进诗里
  • 原文地址:https://www.cnblogs.com/aukle/p/3228802.html
Copyright © 2020-2023  润新知