碰撞检测技术:kd tree
接上文.
參考: http://bit.kuas.edu.tw/~cscheng/research/paper/kdtree.htm
根據(jù)我現(xiàn)在的理解. 比起blockmap, kd樹(shù)很靈活,它可以公平地劃分塊. 保證每塊的星星一樣多. 但是要分配出一個(gè)二叉樹(shù)(3D仍應(yīng)是二叉)的結(jié)構(gòu),當(dāng)深度比較大時(shí),比如log(starn),就會(huì)費(fèi)內(nèi)存了. 還是用前面的例子實(shí)現(xiàn)...:
首先要計(jì)算層數(shù),就是kd tree里面的k. 設(shè)星球總數(shù)為m,層數(shù)為k,用后面說(shuō)的方法就得出大致的時(shí)間方程: T=(m/2^k)^2+k*m,(b<=log2(m)),求T最小值時(shí)的k. 這個(gè)指數(shù)方程不會(huì)解~ hehe,暫定為k=log2(m)好了. 接著開(kāi)始劃分并建立樹(shù), 首先第一刀豎著切,x=所有星的x平均數(shù),這樣就分別把兩邊的星星標(biāo)記為2和3,表示當(dāng)前屬于2號(hào)和3號(hào)結(jié)點(diǎn),這是第1層;再分別給2和3的區(qū)域橫著切兩刀,y仍取平均數(shù),這是第2層.... 這樣橫豎交替地切,因此在建立每一層就要遍歷starpool[]一次,一共是k*m次的位置檢索. 而最后被歸到同一個(gè)葉結(jié)點(diǎn)的星星組串成循環(huán)鏈表,以便對(duì)每組內(nèi)部做n=(m/2^k)^2/2次碰撞檢測(cè). 現(xiàn)在就明白T的計(jì)算方法了.
午飯和晚飯都沒(méi)吃,無(wú)法再思考下去了. 至于kd tree的效果是不是非常好,是否用在網(wǎng)游里更合適. 以后再想.
轉(zhuǎn)載于:https://www.cnblogs.com/euclid/archive/2006/12/19/597157.html
總結(jié)
以上是生活随笔為你收集整理的碰撞检测技术:kd tree的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用ibatis.net简单的数据更新
- 下一篇: 内容样式行为分离