看完了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的开源。

q3 bsp随笔(2)的更多相关文章

  1. css随笔1

    1.简单清除浏览器样式 *{        padding: 0px;        margin: 0px;    } 2.得到屏幕范围的div html,body{        width: 1 ...

  2. (原、整)BSP的江湖传说

    @author:黑袍小道 查看随缘,当苦无妨,良人可归.     引言 为什么叫江湖传说,因为实现了第一人是卡马克,就这么简单.(不接受那啥) Quake3:http://www.mralligato ...

  3. AI人工智能系列随笔

    初探 AI人工智能系列随笔:syntaxnet 初探(1)

  4. 【置顶】CoreCLR系列随笔

    CoreCLR配置系列 在Windows上编译和调试CoreCLR GC探索系列 C++随笔:.NET CoreCLR之GC探索(1) C++随笔:.NET CoreCLR之GC探索(2) C++随笔 ...

  5. C++随笔:.NET CoreCLR之GC探索(4)

    今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔.下面我们继续: // Initialize fre ...

  6. C++随笔:从Hello World 探秘CoreCLR的内部(1)

    紧接着上次的问题,上次的问题其实很简单,就是HelloWorld.exe运行失败,而本文的目的,就是成功调试HelloWorld这个控制台应用程序. 通过我的寻找,其实是一个名为TryRun的文件出了 ...

  7. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  8. 使用Beautiful Soup编写一个爬虫 系列随笔汇总

    这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...

  9. 利用Python进行数据分析 基础系列随笔汇总

    一共 15 篇随笔,主要是为了记录数据分析过程中的一些小 demo,分享给其他需要的网友,更为了方便以后自己查看,15 篇随笔,每篇内容基本都是以一句说明加一段代码的方式, 保持简单小巧,看起来也清晰 ...

随机推荐

  1. Swift—静态方法-备

    静态方法与静态属性类似,Swift中定义了静态方法,也称为类型方法.静态方法的定义与静态属性类似,枚举和结构体的静态方法使用的关键字是static:类静态方法使用的关键字是class或static,如 ...

  2. LDMFD和STMFD个人理解

    ARM里面的堆栈是满递减(FULL DESCENDING)的.SP指向最后一个入栈的数据,SP的地址由高向低生长.对于LDM和STM指令来说,编号小的寄存器对应堆栈中的低地址. STMFD的寻址方式是 ...

  3. linux文件合并,去重,分割

    第一:两个文件的交集,并集前提条件:每个文件中不得有重复行1. 取出两个文件的并集(重复的行只保留一份)2. 取出两个文件的交集(只留下同时存在于两个文件中的文件)3. 删除交集,留下其他的行1. c ...

  4. Mysql 存储过程和函数区别

    存储过程是procedure用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表. 存储 ...

  5. 【转】android:DDMS查看Threads--不错

    原文网址:http://www.cnblogs.com/mybkn/archive/2012/05/27/2520335.html 有时候程序运行出现死锁或者信号量卡死是很纠结的问题,单看代码很难分析 ...

  6. 探求Floyd算法的动态规划本质(转)

    ---恢复内容开始--- Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Fl ...

  7. openstack debugs

  8. Hadoop分布式文件系统HDFS详解

    Hadoop分布式文件系统即Hadoop Distributed FileSystem.        当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区(Partition)并 ...

  9. [置顶] 白话二分匹配之最大匹配+附上hdu2063解题报告

    最近开始学习图论的二分匹配,关于最大匹配做一次小总结,希望自己后面回头来看一目明了,也对刚接触的人有帮助: ps:开始有的文字很多....对于很多人来说一看到文字就烦啦...不过这个总结是针对匈牙利算 ...

  10. HDU 3264 Open-air shopping malls (计算几何-圆相交面积)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3264 题意:给你n个圆,坐标和半径,然后要在这n个圆的圆心画一个大圆,大圆与这n个圆相交的面积必须大于等 ...