阅读新闻

详细介绍四叉树 Quadtrees(上)

[日期:2006-12-04] 来源:  作者: [字体: ]
         
原理:什么是Quadtrees?
  由于3D图形卡消费市场的变革,现在3D游戏越来越流行了,他们中大部分是第一人称射击游戏,这 是一个很好的理由,这个理由是室内环境,当和室外环境相比它非常简单。对于室外环境,它没有方便 的通往下一关的楼梯,门,或墙来阻挡你的视线。室外环境都是连续的。对于传统的几何学来说这是非 常棘手的,请打入quadtrees来学习下面的知识。
  
  注意:下面的图示都是从上到下看一个3D地形,方格显示了在X和Y轴上的地形,并看不见现 实中的物体高度,因为我们是顺着Y轴看的。


Figure 1

  
  设想你的地形是一个非常大的方格,在一个X和Z的面上扩展,如图1。我们有一个摄象机在地形的右 下角,它的可视截面(蓝三角)扩展为在相同方向上的小单元,这样在优化前,绘制地形的程序代码看 起来象这样:
  
  for(int ctr=0; ctr  {
  DrawCell();
  }
  
  注意:一个小单元就是一个包含一些三角形的正方形,它是地形的一部分),看起来非常好,但是本 来我们只是占用了16个单元,可是画了256个。这是非常大的浪费,在我们的可视截面里只有5个单元。 现在第一个优化:我们要测试所有的单元是否在可视截面里,如果在就画他,现在的代码如下:
  
  for(int ctr=0; ctr  {
  if(cell is in frustum) DrawCell();
  }
  
  如果单元在我们的可视截面中,就画他,非常正确。现在我们只画了5个单元,而不是256个,我们只 是更改很少的代码。在上面,我们保存了我们没有绘出的251个单元,每次都是,这是非常的浪费,如下图:


Figure 2

  
  我将一些单元变成了兰色,这样我们可以建立一个包围盒,如果兰色的单元不在截面内,我们可以安全 的说这个单元在区域A中,如果我们知道兰色的单元不在截面内,我们如何去测试区域A中的其他144个单元 呢,这由quadtrees 来工作
  
  quadtrees 是从地形中获得的,把它分割成四个较小的部分,每一个部分继续分下去,直到一个分到 一个设定的大小,这看起来有点乱,让我结合图片解释一下,首先,从我们的网格出发,现在将他分为四份。


Figure 3


1234下一页  GO
阅读:
录入:admin

评论 】 【 推荐 】 【 打印
上一篇:详细介绍四叉树 Quadtrees(上)
下一篇:详细介绍四叉树 Quadtrees(下)
相关新闻      
本文评论       全部评论
发表评论
字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款