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

李錦俊(mybios)的blog

游戲開發(fā) C++ Cocos2d-x OpenGL DirectX 數(shù)學(xué) 計算機(jī)圖形學(xué) SQL Server

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  86 Posts :: 0 Stories :: 370 Comments :: 0 Trackbacks

公告

QQ:30743734
EMain:mybios@qq.com

常用鏈接

留言簿(16)

我參與的團(tuán)隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 373514
  • 排名 - 67

最新評論

閱讀排行榜

評論排行榜

對OCTREE的描述

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


OCTREE是怎樣工作的

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


  現(xiàn)在根接點(diǎn)存儲了世界中的全部頂點(diǎn)。這是,他還是不能給我們?nèi)魏魏锰帲驗(yàn)樗€會畫所有的東西。我們想把這個接點(diǎn)分成8個部分。一次,我們劃分時,有8個立方體包含那最初的根接點(diǎn)的立方體。那意味著有4個立方體在上面,4個立方體在下面。請看下圖:


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


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


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

?


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


何時停止細(xì)分

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

  2。另一個方法是在停止細(xì)分時,看我們是否細(xì)分的數(shù)目是否超過了細(xì)分的標(biāo)準(zhǔn)。例如,我們可以先建立細(xì)分的標(biāo)準(zhǔn)為10,如果細(xì)分的數(shù)量大于這個標(biāo)準(zhǔn),我們將停止并指定這些在立方體中這個面的頂點(diǎn)到那個結(jié)點(diǎn)。當(dāng)我們說“大于這個標(biāo)準(zhǔn)”就意味著細(xì)分的數(shù)量有11個。

  3。最后的方法是看結(jié)點(diǎn)數(shù)是否超過結(jié)點(diǎn)變量定義時的值。例如,我們設(shè)置結(jié)點(diǎn)變量的值為500。每次,我們建立一個結(jié)點(diǎn),相應(yīng)的結(jié)點(diǎn)數(shù)增加1。然后在我們每次建立另一個結(jié)點(diǎn)時,檢測一下我們當(dāng)前的結(jié)點(diǎn)數(shù)是否超過結(jié)點(diǎn)變量。如果結(jié)點(diǎn)數(shù)為501,我們將不會細(xì)分這個結(jié)點(diǎn),但是指定他的當(dāng)前頂點(diǎn)給他。我自己用1和3的方法,但是1和2也很好,因?yàn)槟憧梢詼y試不同的細(xì)分的標(biāo)準(zhǔn)。

 
怎樣畫OCTREE

  OCTREE建立后,我們就可以畫我們需要的結(jié)點(diǎn)。那些立方體不是全部包含在我們的視覺中的,只有一部分。這就是我們?yōu)槭裁匆嬎忝總€結(jié)點(diǎn)的三角形的數(shù)量,如果我們只需要一個結(jié)點(diǎn)中的一部分,這樣我們就不需要畫成千上萬個三角形。我們從根目錄開始畫OCTREE。對于每個結(jié)點(diǎn)都存儲著一個中心點(diǎn)。這是非常好的,比如在下面這個函數(shù)中:

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

  這個函數(shù)返回true or false,是由立方體是否在破片中決定的。如果立方體在破片中,我們將檢測所有他的結(jié)點(diǎn),看他們是否在破片中,否則我們將忽約樹中的整個分枝。當(dāng)我們得到了破片中的結(jié)點(diǎn),但是沒有任何結(jié)點(diǎn)在他下面。我們想畫的頂點(diǎn)存儲在末結(jié)點(diǎn)中。記住,只有末結(jié)點(diǎn)有頂點(diǎn)存儲。看下面的圖:


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


OCTREE 中的沖突

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

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

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

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

  我相信你有更好的方法快速的檢測,在這里只是給你一點(diǎn)基礎(chǔ)。


總結(jié)

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

posted on 2006-11-17 00:00 李錦俊(mybios) 閱讀(1418) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)學(xué)、幾何和圖形學(xué)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久国产精品厨房| 欧美一区二区精品| 久久国产免费看| 亚洲在线免费| 国产精品综合久久久| 亚洲欧美日韩国产精品| 久久欧美肥婆一二区| 亚洲人成毛片在线播放女女| 欧美精品一区三区| 亚洲午夜一区二区三区| 欧美一区综合| 99视频超级精品| 国产精品久久久99| 久久av一区| av成人福利| 女仆av观看一区| 亚洲欧美在线免费| 一区在线视频| 国产精品福利久久久| 欧美日韩精品一本二本三本| 先锋资源久久| 一本久道久久综合婷婷鲸鱼| 亚洲在线视频观看| 性欧美videos另类喷潮| 亚洲区国产区| 夜夜狂射影院欧美极品| 亚洲欧美电影院| 99国产精品| 亚洲电影专区| 国产欧美一级| 欧美午夜三级| 欧美日本中文| 国产欧美日韩精品丝袜高跟鞋 | 国产亚洲欧美在线| 欧美精品在线网站| 国产精品看片资源| 欧美福利在线| 亚洲国产精品成人| 久久免费一区| 亚洲一区二区在线免费观看视频 | 亚洲一级电影| 久久久91精品国产一区二区精品| 99精品免费网| 欧美专区福利在线| 欧美日韩一级视频| 欧美日韩国产色综合一二三四| 国产精品乱码久久久久久| 激情久久久久久久久久久久久久久久| 亚洲精品综合| 亚洲精品免费网站| 亚洲精品美女在线观看播放| 午夜激情久久久| 最近中文字幕日韩精品| 亚洲国产欧美国产综合一区 | 午夜欧美大片免费观看| 免费在线观看精品| 欧美www在线| 亚洲嫩草精品久久| 午夜日韩在线| 欧美日韩视频在线一区二区观看视频| 国产欧美一区二区三区视频| 亚洲看片一区| 欧美搞黄网站| 久久久精品五月天| 国产精品专区第二| 欧美在线观看视频| 亚洲影视中文字幕| 国产精品毛片在线| 午夜精品视频| 亚洲视频大全| 久久精品亚洲乱码伦伦中文| 国产精品99一区二区| 一区二区电影免费观看| 亚洲视频在线一区| 久久精品一区二区国产| 亚洲一区二区三区视频播放| 欧美亚州韩日在线看免费版国语版| 最新日韩中文字幕| 亚洲电影免费观看高清| 99精品欧美一区二区蜜桃免费| 男男成人高潮片免费网站| 欧美日韩一区不卡| 一区二区三区国产在线| 亚洲看片网站| 久久先锋影音| 亚洲激情视频在线观看| 欧美一级淫片播放口| 亚洲一区在线观看视频 | 亚洲欧美精品| 亚洲图片自拍偷拍| 国产精品天天摸av网| 亚洲大黄网站| 欧美精品国产精品日韩精品| 国产欧美精品在线观看| 欧美中文字幕精品| 91久久久亚洲精品| 欧美日韩免费网站| 午夜久久久久久| 欧美在线播放一区二区| 在线精品国产欧美| 日韩西西人体444www| 久久婷婷国产综合国色天香| 在线精品亚洲| 亚洲精品极品| 久久精品综合网| 亚洲精品在线免费| 亚洲系列中文字幕| 在线观看视频一区二区欧美日韩| 亚洲欧美伊人| 午夜视频一区在线观看| 亚洲第一精品电影| 一本综合久久| 在线欧美福利| 一本一本久久a久久精品综合麻豆| 国产精品日本欧美一区二区三区| 久久久视频精品| 欧美人妖在线观看| 久热精品视频| 午夜精品区一区二区三| 久久国产精品久久w女人spa| 亚洲人成人一区二区在线观看| 一本色道久久综合一区| 黄色成人片子| 免费中文日韩| 国产精品美女xx| 亚洲国产精品ⅴa在线观看| 国产精品成人观看视频免费| 欧美大色视频| 国产日韩精品在线播放| 欧美一级电影久久| 欧美成人午夜剧场免费观看| 激情六月婷婷久久| 中文一区二区| 日韩一区二区高清| 噜噜噜91成人网| 亚洲精品国产精品国自产观看浪潮| 亚洲午夜激情免费视频| 亚洲九九精品| 久久亚洲春色中文字幕| 欧美一区二区精美| 欧美午夜激情在线| 亚洲精品久久久久久久久久久久| 免费久久99精品国产| 久久精品二区三区| 久久久精品一区| 欧美一区二区| 国产精品乱人伦一区二区| 亚洲精品激情| 一区二区三区视频在线观看| 欧美肥婆bbw| 亚洲欧美精品一区| 欧美伦理视频网站| 亚洲私人黄色宅男| 欧美黄色aa电影| 亚洲高清免费| 亚洲精选中文字幕| 欧美国产在线电影| 最新国产の精品合集bt伙计| 亚洲精品视频在线观看网站| 免费视频一区| 美女黄毛**国产精品啪啪 | 久久精品午夜| 另类激情亚洲| 亚洲第一精品影视| 美女图片一区二区| 亚洲黑丝在线| 亚洲午夜未删减在线观看| 午夜精品福利在线| 欧美尤物巨大精品爽| 国产日本亚洲高清| 久久国产精品99精品国产| 老司机凹凸av亚洲导航| 亚洲国产一区二区三区a毛片| 免费观看国产成人| 亚洲高清av在线| 亚洲综合日韩中文字幕v在线| 国产精品www.| 久久久www| 亚洲第一网站| 亚洲在线观看视频| 精品99一区二区| 欧美巨乳在线| 欧美成人一区二区| 欧美 亚欧 日韩视频在线| 欧美专区18| 亚洲电影中文字幕| 国产精品ⅴa在线观看h| 久久久久久久久久久久久久一区| 亚洲一区二区三区精品在线观看| 国产精品入口日韩视频大尺度| 性色av一区二区三区| 欧美粗暴jizz性欧美20| 亚洲一区二区精品在线观看| 黑人操亚洲美女惩罚| 欧美日韩综合不卡| 亚洲免费观看| 欧美激情2020午夜免费观看| 亚洲欧洲日韩在线| 国产精品一级| 欧美三级中文字幕在线观看|