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