空間剪枝最佳化

旅玖旅玖發表於2024-03-20

# 判斷一個物體在左側還是右側


只需要求出主角與物體的差向量,並與前方向做叉積即可
    * 結果>0 則在右側
    * 結果<0 則在左側
    * 結果=0 則在正前方或正後方

# 空間剪枝最佳化


	1. 判斷物體是否在相機內
		對於一個物體,判斷是否在相機內unity已經有了實現,但是假設我現在有一堆樹,我想知道有多少棵樹在相機內呢,直接遍歷所有的樹會導致我們的開銷非常大
	2. 在一個100*100的空間內,隨機生成2000個1*1的小方塊,小方塊生成後會隨機賦予一個初速度,
	   小方塊將沿速度方向勻速運動,碰到空間邊界會反彈。小方塊之間不會反彈。現在需要檢查方塊是否與其他方塊發生了碰撞(相交)
		顯然如果直接n^2來遍歷判斷,肯定會卡死,那這兩個問題有沒有非遍歷方案呢?

# 最佳化方案


	1. 網格劃分
		事實上,只有離的近的小方塊才會相交,也只有一部分的樹才會在相機內,我們可以把空間進行劃分成塊,只對小方塊所在的空間塊內的方塊做碰撞檢測,
		就可以最佳化大部分的檢測了
		但是,隨著空間的變大,小方塊體積的變化,分配不均等問題,會導致網格的大小選取很困難,網格變多了也會造成一筆記憶體開銷,有沒有折中的方案呢?
	2. 四叉樹/八叉樹
		我認為其本質就是升維二分法,將空間透過遞迴不斷的拆分下去,我們會選擇最大劃分層次以及最大包含物件數量來作為遞迴基,這樣就可以透過樹形結構
		來快速的查詢互動關係了,但是實際工程中,物體都是有大小的,如果出現了佔地多個節點的物體該如何處理呢?
		#方案1#
		只在葉子節點中儲存物體,如果無法完美儲存則儲存在相交的葉子節點中
		#方案2#
		可以在非葉子節點儲存物體,無法劃分的物體則保留
		這兩種方案可以說是各有優劣,第一種方案由於會儲存多個節點,導致物體移動時樹的變化開銷增大,而第二種由於一個節點儲存的內容更多,會導致檢測了
		一些遙遠的物體,如果能把物體抽象成點就更好了

參考部落格:https://blog.csdn.net/yhn19951008/article/details/119899092

相關文章