青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Code Knight

Programming is so cool
隨筆 - 52, 文章 - 0, 評論 - 14, 引用 - 0

posted on 2010-02-23 21:08 Code Knight 閱讀(2055) 評論(0)  編輯 收藏 引用 所屬分類: 圖形學


數據加載中……

對OCTREE的描述

  OCTREE 是對3D空間進行劃分,也可以叫空間分割。他允許你只對你的3D世界中攝象機照射的區域進行作畫。他也能用于沖突檢測。下面講一下為什么要進行空間分割。假設你建立了一個游戲世界,這個世界有超過100,000個多邊形要畫。如果你建立一個循環并傳遞這些多邊形,那速度是很慢的。即使你有一塊很好的顯示卡,他也會有很大的麻煩。但是玩你游戲的玩家的顯示卡不會超過300$。有沒有一種方法只渲染攝象機看見的多邊形?那就是美麗的OCTREE。他允許你快速的找到你要渲染的多邊形。


OCTREE是怎樣工作的

  OCTREE工作在立方體中。最初,OCTREE從根接點開始,這個根接點對齊于立方體中整個世界,水平或場景的axis中心線。因此,把我們的整個世界想象成一個不可見的立方體。
 


  現在根接點存儲了世界中的全部頂點。這是,他還是不能給我們任何好處,因為他還會畫所有的東西。我們想把這個接點分成8個部分。一次,我們劃分時,有8個立方體包含那最初的根接點的立方體。那意味著有4個立方體在上面,4個立方體在下面。請看下圖:


  記住圖中黃色輪廓線沒有。
  我們剛剛把這個世界分成8個部分。想象一下如果我們有2,3,4個部分,我們的世界將是怎樣?我們的攝象機在世界的中間,向著后面靠右的角落。如果你看這些線,你將注意到在OCTREE中8個結點中的第4個。這些結點包含2個后面的頂和底結點。這意味著我們只用畫存儲在這些結點中的頂點。


  我們如何檢測出我們要畫的結點?如果你學過破片揀選(frustum culling),這將是很簡單的。你能得到這些破片的大小并檢測每個結點,看他是否被截斷或在你的視覺破片中。有一個關于破片揀選的教程在http://www.gametutorials.com. 如果一個立方體截斷破片,我們就將畫這些結點。在這個例子中,我們切的數量是我們需要畫的50%。記住,這只是我們世界中的一個部分。部分越多,我們就將越精確。當然,我們不會需要太多的點。下面,我們來看一下下面的圖:


  在上面這幅圖中,你將發現許多的不同。這個例子中,不是在原始的8個立方體的每一個結點中建立8個新的立方體。原始的8個結點的頂和底面沒有細分。你總是把一個結點分成8個或更多的結點,但是,如果在這個面沒有三角形可以存儲,我們將忽視這個結點并不給他分配內存。如果我們進一步的細分,更多的結點將形成原始的世界。如果我們變換到另一個部分,那立方體將相似的變換。為了說明這一點,請看圖:


  在圖中,有兩個球,但是方向相反。注意左邊的部分,他將那世界分成2個結點,不是8個。這是因為球只要2個結點。請看右邊的球是不是和左邊的很相似。這幅圖告訴我們:只顯示需要的部分結點。如果沒有三角形占用空間,結點將不會建立。


何時停止細分

  現在,我們明白了如何細分,但是我們也需要知道怎樣停止細分。有許多的方法:
  1。如果當時的三角形數量少于我們定義的最大的三角形數量,我們可以停止細分當前的結點。舉個例子,我們定義三角形的最大數量為100。這意味著我們在細分結點之前,要檢測一下當前三角形的總數量是否小于或等于我們定義的最大數量,然后再做決定。如果數量少于或等于,我們將停止細分并指定這些三角形到那個結點。請注意我們從不指定任何三角形到任何結點,除非他是末結點。如果我們劃分一個結點,我們不能存儲三角形到那個結點,但是可以存儲在他的子結點或他們的子結點中,甚至到他們的子中,等等。當我們復習了怎樣畫0C樹后,將會有更多的了解。

  2。另一個方法是在停止細分時,看我們是否細分的數目是否超過了細分的標準。例如,我們可以先建立細分的標準為10,如果細分的數量大于這個標準,我們將停止并指定這些在立方體中這個面的頂點到那個結點。當我們說“大于這個標準”就意味著細分的數量有11個。

  3。最后的方法是看結點數是否超過結點變量定義時的值。例如,我們設置結點變量的值為500。每次,我們建立一個結點,相應的結點數增加1。然后在我們每次建立另一個結點時,檢測一下我們當前的結點數是否超過結點變量。如果結點數為501,我們將不會細分這個結點,但是指定他的當前頂點給他。我自己用 1和3的方法,但是1和2也很好,因為你可以測試不同的細分的標準。

 
怎樣畫OCTREE

  OCTREE建立后,我們就可以畫我們需要的結點。那些立方體不是全部包含在我們的視覺中的,只有一部分。這就是我們為什么要計算每個結點的三角形的數量,如果我們只需要一個結點中的一部分,這樣我們就不需要畫成千上萬個三角形。我們從根目錄開始畫OCTREE。對于每個結點都存儲著一個中心點。這是非常好的,比如在下面這個函數中:

  //這個函數取走立方體(X,Y,Z)的中心點和他的大?。╳idth/2)
  bool CubeInFrustum(float x,float y,float z,float size);

  這個函數返回true or false,是由立方體是否在破片中決定的。如果立方體在破片中,我們將檢測所有他的結點,看他們是否在破片中,否則我們將忽約樹中的整個分枝。當我們得到了破片中的結點,但是沒有任何結點在他下面。我們想畫的頂點存儲在末結點中。記住,只有末結點有頂點存儲??聪旅娴膱D:


  有陰影的立方體是在破片中。白色的立方體不是在破片中。這里顯示了細分的2層。


OCTREE 中的沖突

  OCTREE 不是用于渲染,但是用于沖突檢測很好。隨著游戲的發展,沖突檢測也在改變,你將不得不在游戲世界中運用自己的算式檢測你的角色或目標是否沖突。下面是一些沖突檢測的例子:
  1。你將建立一個函數允許你轉遞3D空間中的點到你的OCTREE并返回在這個點周圍的頂點。你將轉遞的那個點是你的角色和目標的中心點。這雖然可以工作一端時間,但如果這個點靠近一個立方體的邊時呢?你的角色或目標可能和另一個立方體的頂點相沖突。為了解決這個問題,你將做一些事情。你可以轉遞角色/目標的半徑或一定的空間,然后檢測半徑或一定的空間是否和周圍的結點相沖突。這由你的角色/目標的形狀決定。下面是一些典型的函數:

  //這個函數取走角色/目標(X,Y,Z)的中心點并返回靠近他的頂點
  CVector3 *GetVerticesFromPoint(float x,float y,float z);

  //這個函數取走角色/目標(X,Y,Z)的中心點和半徑,然后返回和他沖突的結點中的頂點
  CVector3 *GetVerticesFromPointAndRadius(float x,float y,float z,float radius);

  //這個函數取走角色/目標(X,Y,Z)的中心點和立方體的大小,然后返回和他沖突的結點中的頂點
  CVector3 *GetVerticesFromPointAndCube(float x,float y,float z,float size);

  我相信你有更好的方法快速的檢測,在這里只是給你一點基礎。


總結

  這篇教程只是給你講截如何建立自己的OCTREE。關于這篇文章中的代碼在www.gametutorials.com,我希望這篇文章對你有用。


中文譯者:antking
http://akinggame.gameres.com
這篇文章的英文版在http://www.gametutorials.com/Tutorials/OpenGL/Octree.htm

Ben Humphrey (DigiBen)
Game Programmer
DigiBen@GameTutorials.com
Co-Web Host of www.GameTutorials.com

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美亚洲三区| 国产欧美日韩亚州综合| 亚洲人成网站精品片在线观看| 一区二区三区黄色| 亚洲伦理网站| 中文网丁香综合网| 欧美一区免费视频| 久久久国产午夜精品| 久久亚洲国产成人| 亚洲视频www| 欧美激情亚洲一区| 久久看片网站| 欧美成人精品一区| 91久久亚洲| 亚洲图片在区色| 久久久国产精品一区二区中文 | 亚洲精品系列| 亚洲在线观看免费视频| 欧美在线综合视频| 亚洲第一区中文99精品| 99av国产精品欲麻豆| 午夜精品久久久久影视| 老司机免费视频一区二区| 欧美日韩另类一区| 韩国三级在线一区| 亚洲一级片在线观看| 免费在线亚洲欧美| 亚洲免费视频在线观看| 欧美本精品男人aⅴ天堂| 国产欧美日韩亚洲一区二区三区| 亚洲国产日韩欧美| 欧美自拍丝袜亚洲| 一本一本久久a久久精品综合麻豆| 欧美专区亚洲专区| 欧美日韩免费网站| 亚洲精品久久久久中文字幕欢迎你| 午夜精品久久久久久久白皮肤| 欧美国产精品v| 久久成人综合网| 欧美丝袜第一区| 亚洲精品激情| 欧美xxxx在线观看| 午夜日韩在线| 国产精品www994| 一区二区三区.www| 亚洲二区在线观看| 久久久精品国产免费观看同学| 欧美午夜精品久久久久久孕妇 | 日韩视频―中文字幕| 久久久久久午夜| 国产综合在线看| 久久国产精品久久国产精品| 亚洲无线一线二线三线区别av| 欧美片在线观看| 亚洲精品日产精品乱码不卡| 免费日韩av电影| 久久久久久久波多野高潮日日| 国产精品一区在线观看| 亚洲永久视频| 亚洲一区尤物| 国产精品欧美精品| 午夜国产不卡在线观看视频| 一区二区91| 久久一区国产| 久久国产精品久久w女人spa| 亚洲一区二区三区四区在线观看 | 久热精品视频在线观看| 欧美一级久久久久久久大片| 国产亚洲欧美另类中文| 久久午夜视频| 老妇喷水一区二区三区| 亚洲高清av| 亚洲日本中文字幕免费在线不卡| 欧美激情1区| 亚洲一区视频在线观看视频| 亚洲在线视频观看| 一区精品久久| 亚洲激情图片小说视频| 欧美视频在线免费| 久久九九精品99国产精品| 久久精品亚洲精品| 亚洲人成小说网站色在线| 亚洲欧洲在线一区| 国产伦精品一区二区三区视频孕妇| 欧美一区亚洲二区| 久久中文在线| 亚洲一区二区影院| 久久国产天堂福利天堂| 亚洲欧洲一区二区三区在线观看| 亚洲精品国产欧美| 国产亚洲一二三区| 亚洲精品日韩久久| 国产欧美大片| 欧美激情第三页| 国产精品久久久爽爽爽麻豆色哟哟| 欧美一区二区私人影院日本| 久久综合狠狠综合久久综青草| 日韩视频一区二区三区在线播放免费观看| 亚洲精品国产精品乱码不99按摩 | 欧美激情精品久久久久久变态| 亚洲免费视频一区二区| 久久久精品tv| 性欧美18~19sex高清播放| 久久一二三国产| 久久爱www久久做| 欧美日韩一区二区三区| 开元免费观看欧美电视剧网站| 欧美日韩国产成人在线| 久久一区激情| 国产日韩欧美在线一区| 亚洲精品欧美一区二区三区| 激情文学综合丁香| 亚洲一区在线播放| 正在播放亚洲一区| 欧美sm视频| 毛片av中文字幕一区二区| 国产精品欧美激情| 99国产精品视频免费观看一公开 | 国产精品影院在线观看| 亚洲精品免费网站| 国产区二精品视| 国产欧美日韩视频在线观看| 毛片一区二区| 美脚丝袜一区二区三区在线观看 | 尤物九九久久国产精品的特点 | 欧美一区久久| 久久中文欧美| 欧美激情自拍| 国产精品成人一区二区艾草| 国产精品初高中精品久久| 国产精品视频免费观看| 国产亚洲精品久久久| 亚洲国产精品一区在线观看不卡| 亚洲高清中文字幕| 亚洲一区二区网站| 欧美国产精品劲爆| 午夜精彩国产免费不卡不顿大片| 久久久精品欧美丰满| 欧美午夜大胆人体| 亚洲欧洲中文日韩久久av乱码| 亚洲一区视频在线| 欧美激情视频一区二区三区不卡| 亚洲嫩草精品久久| 欧美日韩免费看| 亚洲精品国产视频| 欧美国产日本在线| 久久电影一区| 国产欧美一区二区三区久久人妖| 日韩视频在线观看国产| 久久只精品国产| 欧美在线高清视频| 精品粉嫩aⅴ一区二区三区四区| 午夜精彩视频在线观看不卡 | 国产精品一二三四| 亚洲综合成人婷婷小说| 中文国产一区| 国内精品伊人久久久久av影院 | 亚洲免费成人av| 亚洲精品在线观| 国产精品伦一区| 噜噜噜久久亚洲精品国产品小说| 久久精品理论片| 在线午夜精品| 久久全国免费视频| 在线亚洲美日韩| 久久精品人人爽| 亚洲在线中文字幕| 一区二区三区视频在线观看| 国产视频精品xxxx| 亚洲视频精品在线| 亚洲午夜91| 欧美日韩裸体免费视频| 久久精品国产欧美亚洲人人爽| 欧美黄污视频| 欧美va亚洲va国产综合| 国产在线欧美| 亚洲一区免费视频| 99精品欧美一区二区三区综合在线| 欧美中文字幕精品| 亚洲欧美日韩久久精品 | 久久国产色av| 久久夜色精品一区| 一区二区三区无毛| 欧美成人黄色小视频| 一区二区欧美在线| 亚洲先锋成人| 国产精品女人网站| 美日韩在线观看| 翔田千里一区二区| 亚洲视频1区| 一卡二卡3卡四卡高清精品视频| 亚洲欧美视频在线观看视频| 韩国av一区| 国产精品日韩精品| 欧美国产综合| 亚洲精选91| 国产午夜精品理论片a级大结局| 亚洲影院在线观看| 欧美大片va欧美在线播放| 亚洲伊人第一页|