@author:黑袍小道

查看随缘,当苦无妨,良人可归。

 
 

引言

为什么叫江湖传说,因为实现了第一人是卡马克,就这么简单。(不接受那啥)

Quake3:http://www.mralligator.com/q3/#Nodes

 
 

 
 

必备

点积和叉积

 
 

点积

向量乘法的一种形式,它的计算结果是一个标量值;由于这一原因,有时也将点积称为标量积(scalar product)。设u=(ux,uy,uz),v=(vx,vy,vz),则点积定义

简言之点积等于两个向量对应分量的乘积之和

点积的定义不存在任何明显的几何含义。但是,使用余弦定理可以发现存在如下关系:

  

叉积

是向量数学定义的第二种乘法形式。它与点积不同,点积的计算结果是一个标量,而叉积的计算结果是一个向量

叉积只能用于3D 向量(2D 向量没有叉积)。通过对两个3D 向量u 和v 计算叉积,可以得到第3 个向量w,该向量同时垂直于u 和v。

  

 
 

 
 

BSP的最小说明

bsp树是一种空间分割树,它主要用于游戏中的场景管理,尤其是室内场景的管理。

它的本质是二叉树,也就是用一个面把空间分割成两部分,分割出的空间则继续用面分割,以此类推,直到到达特定递归深度,或者空间中不再有物体只剩下一个物体(得到凸包/凸多面体)。

最终,叶结点对应场景中的物体,内部结点存储分割面。物体被"收纳"到各个包围盒中。

 
 

BSP的简化说明

简化部分 :

(1) 使用二维,而不是三维。

(2) 手工输入包围盒,而不是自动生成。包围盒为AABB包围盒(轴向),不支持上图中的凹多边形。

(3) 叶结点和内部结点共用一个数据结构。其中内部结点存储了方向(水平或竖直)以及分割线;叶结点存储了对应场景为实心还是空心。

(4) 沿着包围盒的边界进行分割(和图中所示相同),选择分割线的方法比较简单:

首先

分别选出水平和竖直方向的最优分割线。(判断标准:与空间中心最接近的包围盒边界线)

然后

  

  

如果都相交或都不相交,那么优先选择距离中心点更近的(按相对比例来算)

如果选择的分割线与包围盒相交,那么把这个包围盒根据分割线拆成两个包围盒。

退出条件(或):

  

  

达到最大分割层数,直接生成两个叶结点,返回。

  

空间里没有物体了,返回空叶结点。

  

空间里只剩下一个物体了,返回满叶结点。

 
 

蓝线:第一次分割 ; 紫线:第二次分割 ; 黄线:第三次分割

包围盒:

(4,10,4,16)

(10,24,4,9)

(7,19,23,27)

(22,28,13,24)

bsp树

 
 

 
 

BSP用于3D游戏

问题:

 
 

在当前的摄像机位置使用正确的渲染顺序去渲染所有的将要渲染的几何体的每一帧。

你可能会说.别忘了我可以使用ZBuffer来解决顺序问题.你当然可以使用Zbuffer 但是是在没有透明物体的情况下。

如果有半透明物体.那么你将无法正确的渲染使他正确的显示出来.(ZBuffer是一个深度缓冲相关。如果打开.渲染的时候就会根据渲染点的z值来决定那个点最后显示出来.从而呈现出遮挡的关系.如果是模型中有半透明的部分那么就必须要排序之后进行混合.关键问题就出在blender的顺序上.不透明的必定要先渲染.透明的必定要后渲染)

通过camera到每一个多边形的正确顺序来处理每一帧渲染循环都去解决排序和层次问题.

深度排序问题

 
 

上面的图片的渲染情况会出一个问题.当你尝试去从后往前画这两个多边形的时候(画家算法)。两个多边形会不能正确的被画出来,先画红的后画绿的绿色的会把红色的覆盖掉…通过Zbuffer是可以解决这种问题的.但是效率不太好。如果没有硬件加速是非常废系统资源的,但是Zbuffer也不是全能的,它并不能解决半透明问题。

通过BspTree技术可以轻松的解决上述的所有问题,不单如此,还可以处理其他领域的问题如碰撞检测(因为通过BSP渲染技术之后,一帧要渲染哪些多边形是知道的所以计算诸如FPS类型的游戏打枪到墙壁的时候碰撞检测会很简单遍历当前的多边形进行计算就可以了), 多边形剔除算法。

创建一个BspTree是一个离线的过程.你可以在游戏一开始就把bsptree预计算出来。然后游戏里面使用,所有的多边形排序都是预处理出来的。这是Bsp编辑器的工作,传入一个所有的多边形的列表来然后预先排序他们.处理出来的数据可以存到硬盘上.然后游戏运行的时候可以加载进来在游戏循环环境下快速的遍历。

不但BspTree可以用来正确的渲染所有多边形在场景里.而且可以超快速的来剔除当前视点看不见的多边形。

这是因为可以简单的测试多边形在实景,这样所有的后面被遮挡的多边形就会在你的游戏中被剔除掉

可以简单的就剔除掉成千上万的多边形,我们还将使用bsptree快速的进行碰撞检测。

如何工作的?

看下下面的例图A.他显示了一个从上面看的简单的游戏层级.这些黑色的线就游戏视图里看到的墙.那些黑色的箭头描述了墙的面向的方向.可以理解成2d线的法线.

上面的Ca Cb Cc是三个实例.它表明游戏里的3个位置(相机的位置).通过摄像机的位置先渲染最远的墙.然后渲染最近的墙.我们应该取以下的顺序.

Camera Position

Correct Drawing Order

Ca

D or E in any order, A , C & B is Unclear

Cb

D or E in any order, A , B & C is Unclear

Cc

C & B is Unclear , A , D or E in any order

BspTree存储这所有多边形的层级关系,里面都是后面前面或者相邻的多边形。

但是有一个问题就是C和B墙,我们不能明确的描述C在B的前面还是后面。这个问题使我们无法在所有的位置来使用正确顺序来渲染.

因为我们不能描述墙C是在B的前还是后。BSPTree算法将写不出来.我们必须解决这个问题让BspTree能识别这个"前后"处理.这就是二分法…(我们延长B, C会被切割成两个我们叫C1 C2. 之后C1就是B的前 C2就是B的后.BSPTree就适应了)..后面细说.这块还有点抽象.

BSPTree存储多边形的的信息是把世界切成两半.所有的多边形检测哪个在多边形的哪边。

如果相交就切开.成多个之后进行记录.也就说原来的多边形被切成了新的两个多边形。所以我们的第一次分割完成了,我们拥有了两个新的多边形,相当于第一分割出了两个世界。

这两个世界里只有绝对的前面的多边形和绝对的后面的多边形,不会再有模糊的概念,之后这两个世界里的多边形选取一个继续分割。

最后当没有可以分割的就结束该过程了.(如何选取分割的面也是一门科学.)

Front List of split (A)

Back List of Split (A)

B , C

D , E

Front List of split (B)

Back List of Split (B)

Ca

Cb

Front List of split (D)

Back List of Split (D)

E

Nothing

 
 

第一次通过A来刨分生成两个空间.后面有 DE 前面有BC..先说前面的B之后继续刨分A前面的世界、

然后把C切分成了Ca Cb.Ca就在B的前世界,Cb就在B的后世界,Ca再分已经没东西了截止。

Cb再分也没东西了截止.

再看A的后面的世界,有D和E,我们选D来刨分,之后D的后面没有东西。

D的前面有E,之后E再分已经没有东西了。结束此过程, BSP创建成功。

 
 

 
 

 
 

 
 

 
 

 

(原、整)BSP的江湖传说的更多相关文章

  1. RCNN 和SPPnet的对比

    一.RCNN: 1.首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口. 2.把这2k个候选窗口的图片都缩放到227*227,然后分别输入CNN中,每个候选窗台提取出一个特征向量,也就是说 ...

  2. 空间金字塔池化(Spatial Pyramid Pooling,SPP)

    基于空间金字塔池化的卷积神经网络物体检测 原文地址:http://blog.csdn.net/hjimce/article/details/50187655 作者:hjimce 一.相关理论 本篇博文 ...

  3. Spatial pyramid pooling (SPP)-net (空间金字塔池化)笔记(转)

    在学习r-cnn系列时,一直看到SPP-net的身影,许多有疑问的地方在这篇论文里找到了答案. 论文:Spatial Pyramid Pooling in Deep Convolutional Net ...

  4. Linux从逻辑地址到物理地址

    转自:http://blog.chinaunix.net/uid-24774106-id-3427836.html 我们都知道,动态共享库里面的函数的共享的,这也是动态库的优势所在,就是节省内存.C ...

  5. 基于2-channel network的图片相似度判别

    一.相关理论 本篇博文主要讲解2015年CVPR的一篇关于图像相似度计算的文章:<Learning to Compare Image Patches via Convolutional Neur ...

  6. 转-------CNN图像相似度匹配 2-channel network

    基于2-channel  network的图片相似度判别 原文地址:http://blog.csdn.net/hjimce/article/details/50098483 作者:hjimce 一.相 ...

  7. hdu 4541(麻烦的模拟)

    Ten Googol Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Su ...

  8. mysql查询语句中使用星号真的慢的要死?

    前言 之所以写这篇文章,是源于以前看过的关于sql语句优化的帖子,里面明确提到了在sql语句中不要使用 * 来做查询,就像下面的规则中说的 2.尽量避免使用select *,返回无用的字段会降低查询效 ...

  9. sppNet论文学习

    Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 深度神经网络中用于视觉识别的空间金字塔池化 ...

随机推荐

  1. 2017.9.25 JSP内置对象的概述

    1.JSP的定义: 在JSP中是为了便于数据信息的存储.传递.获取,专门设置了九个内置对象, jsp内置对象是指他们是预先设定的,不需创建,每个对象都有自己的属性和方法. 2.JSP内置对象 对象名称 ...

  2. Thymeleaf模板引擎绕过浏览器缓存加载静态资源js,css文件

    浏览器会缓存相同文件名的css样式表或者javascript文件.这给我们调试带来了障碍,好多时候修改的代码不能在浏览器正确显示. 静态常见的加载代码如下: <link rel="st ...

  3. 【洛谷P1996】约瑟夫问题

    约瑟夫问题 链表模拟大概是正解 #include<iostream> using namespace std; struct node{ //单链表 int d; node *next; ...

  4. jQuery插件的使用和写法

    插件(plugin)也称为扩展(Extension),是一种遵循一定规范的应用程序接口编写出来的程序. jQuery的易扩展性,吸引了来自全球的开发者来共同编写jQuery的插件. jQuery表单验 ...

  5. Status bar - iOS之状态栏

    (一)设置状态栏显示和隐藏 1.通过 Info.plist 文件增加字段,控制状态栏全局显示和隐藏 在 Info.plist 文件中增加字段 Status bar is initially hidde ...

  6. ES6初识-Proxy和Reflect

    { let obj={ time:'2017-03-11', name:'net', _r:123 };   let monitor=new Proxy(obj,{ // 拦截对象属性的读取 get( ...

  7. Mysql入门基础命令

    1    Mysql基本操作 1.1    查询当前数据库 mysql> show databases; +--------------------+ | Database | +------- ...

  8. HttpServletRequest cannot be resolved to a type The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    HttpServletRequest cannot be resolved to a type The superclass "javax.servlet.http.HttpServlet& ...

  9. HAN模型理解1

    HAN 模型 最开始看这个模型是看的这个解释: RNN+Attention(HAN) 文本分类 阅读笔记 - 今天做作业没的文章 - 知乎 https://zhuanlan.zhihu.com/p/4 ...

  10. liteos学习文档liteos.github.io

    https://liteos.github.io该主页是华为liteos物联网操作系统的文档,里面有一章是“内核指南”,讲的是rtos的最主要的功能.可以当作liteos的入门了解,如果用rtos的使 ...