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的开源。
q3 bsp随笔(2)的更多相关文章
- css随笔1
1.简单清除浏览器样式 *{ padding: 0px; margin: 0px; } 2.得到屏幕范围的div html,body{ width: 1 ...
- (原、整)BSP的江湖传说
@author:黑袍小道 查看随缘,当苦无妨,良人可归. 引言 为什么叫江湖传说,因为实现了第一人是卡马克,就这么简单.(不接受那啥) Quake3:http://www.mralligato ...
- AI人工智能系列随笔
初探 AI人工智能系列随笔:syntaxnet 初探(1)
- 【置顶】CoreCLR系列随笔
CoreCLR配置系列 在Windows上编译和调试CoreCLR GC探索系列 C++随笔:.NET CoreCLR之GC探索(1) C++随笔:.NET CoreCLR之GC探索(2) C++随笔 ...
- C++随笔:.NET CoreCLR之GC探索(4)
今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔.下面我们继续: // Initialize fre ...
- C++随笔:从Hello World 探秘CoreCLR的内部(1)
紧接着上次的问题,上次的问题其实很简单,就是HelloWorld.exe运行失败,而本文的目的,就是成功调试HelloWorld这个控制台应用程序. 通过我的寻找,其实是一个名为TryRun的文件出了 ...
- ASP.NET MVC 系列随笔汇总[未完待续……]
ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...
- 使用Beautiful Soup编写一个爬虫 系列随笔汇总
这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...
- 利用Python进行数据分析 基础系列随笔汇总
一共 15 篇随笔,主要是为了记录数据分析过程中的一些小 demo,分享给其他需要的网友,更为了方便以后自己查看,15 篇随笔,每篇内容基本都是以一句说明加一段代码的方式, 保持简单小巧,看起来也清晰 ...
随机推荐
- HttpClient and FileUpload
All communication over the Internet happens using a standard set of protocols, such as File Transfer ...
- 天底下最简单的QT画图板,就一个类,60行代码
简单直观.但是我有个问题是,这实际上不是在绘制直线,而是几千几万个超级短的“直线”,这样会不会效率很低呢? 注意,每次绘制的时候,需要一支笔,这支笔需要设置颜色和宽度(就像我们平时写字也要稍微挑一下笔 ...
- http状态码有那些?分别代表是什么意思
http状态码有那些?分别代表是什么意思? 简单版 [ 100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息 ...
- SqlMapConfig.xml全局配置文件解析
一:SqlMapConfig.xml配置文件的内容和配置顺序如下 properties(属性) settings(全局配置参数) typeAiases(类型别名) typeHandlers(类型处理器 ...
- FE: Responsive Web Design Overview
布局特点 1. 单列布局 vs 水平布局 手机屏幕宽度较小,因此多采用单列布局. 反观桌面网页设计,为了利用宽度,往往使用各种水平布局的组件,诸如水平导航栏,水平按钮组,水平分页等.然而水平布局 ...
- COJ 0557 4013多重部分和问题
4013多重部分和问题 难度级别:B: 运行时间限制:2000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 n种大小不同的数字 Ai,每种各Mi个,判断是否可以从 ...
- Shell中特殊的变量
$表示当前的进程,当使用echo $$是会输出当前shell的pid echo $$ 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例 ...
- MVC 模板页和布局
我们在以前的Asp.NET课程中已经学习过母版页了,在MVC中WebForm视图使用母版页的方法与以前基本相同. 创建一个项目MvcMasterPageDemo. 添加Home控制器,生成Index视 ...
- final(最终、修饰符)
/* final(最终.修饰符) final关键字的用法: 1. final关键字修饰一个基本类型的变量时,该变量不能重新赋值,第一次的值为最终的. 2. fianl关键字修饰一个引用类型变量时,该变 ...
- 【MySQL】关于MySQL错误日志信息的收集
为方便维护MySQL,写了个脚本用以提供收集错误信息的接口.这些错误信息来自与MySQL错误日志,而 通过grep mysql可以获取error-log的路径. #!/usr/bin/env pyth ...