查詢檢測PhysX 3.2中的場景查詢(1)-基礎

查詢檢測PhysX 3.2中的場景查詢(1)-基礎

題記:寫這篇博客要主是加深自己對查詢檢測的認識和總結實現算法時的一些驗經和訓教,如果有錯誤請指出,萬分感謝。

    PhysX SDK直一都爲遊戲開闢供提高效靠可的場景查詢(Scene Query)功能,到了3.2中,也是如此。這一個系列中,就給大家分析PhysX 3.2中場景查詢功能的用使。

    這一篇中,我們重點分析這一功能的一些基本概念和基本用法。

 

    首先,PhysX 3.2中,場景查詢的種類持支三種,分別是Raycast,Sweep和Overlap檢測。其中:

    Raycast檢測是從一點,投射一根必定長度的線段,檢測物理天下中跟這個線段訂交的碰撞體(PxShape);

    Sweep檢測跟Raycast檢測似類,但是投射出去的是一個或者一組形體(PxGeometry),檢測物理天下中跟這個/組形體訂交的碰撞體(PxShape);

    Overlap檢測跟面上兩個不一樣,它是給定某置位的一個形體(PxGeometry),檢測物理天下中跟這個形體訂交的碰撞體(PxShape)。

 

    其次,PhysX 3.2中,對於每一種場景查詢,都持支倏地獲得否是有檢測結果的*Any的查詢,以及回返有所檢測結果的*Multiple的查詢;同時,對於Raycast和Sweep,還持支查詢近來的檢測結果*Single的方法。Overlap類型的查詢不持支這類*Single的方法,是因爲原理上,Overlap的訂交檢測是沒有向方的,所以沒法判斷那一個結果是近來的,只能回返有所結果。瞭解了這一點,SDK供提的場景查詢方法就很好記了,就是這些:

raycastAny(...);
 raycastSingle(...);
 raycastMultiple(...);

 sweepAny(...);
 sweepSingle(...);
 sweepMultiple(...);

 overlapAny(...);
 overlapMultiple(...);

    
然後,在場景查詢行執的式方上, PhysX SDK爲我們供提了兩種行執式方,一種是即立行執的單次提交,馬上回返結果的式方;另一種是批理處查詢(Batch Query),我們可以把一幀中可以會合到一同行執的查詢,都加入到一個批理處中行執,這個在場景查詢很多的時候,可以帶來能性上的升提。批理處查詢的用使,我們會在接下來的篇幅中分析。

 

    接下來,在行執過程當中,有一個必須慮考的問題就是如何濾過掉不必要的碰撞體,更倏地高效的回返望期的查詢結果。這一部分內容,會在PhysX 3.2中的場景查詢-濾過中分析。

    每日一道理 
毅力,是千里大堤一沙一石的凝聚,一點點地累積,纔有前不見頭後不見尾的壯麗;毅力,是春蠶吐絲一縷一縷的環繞,一絲絲地堅持,纔有破繭而出重見光明的輝煌; 毅力,是遠航的船的帆,有了帆,船纔可以到達成功的彼岸。

    同時,在Raycast和Sweep查詢行執中,PhysX SDK還供提了Cache的功能,讓我們可以供提一個最有可能被檢測到的碰撞體(PxShape),SDK優先檢測否是跟這個碰撞體有訂交。這個功能在某些場所非常有效,比如射擊遊戲中續連射擊某個物體時,比如某個BOSS級別的壘堡,第一次擊中以後,接下來的短時間內的續連射擊,以可就把這個物體作爲Cache傳入,倏地檢測否是擊中這個物體,這樣夠能省節查詢中很多能性開銷。

 

    最後,在查詢到結果後後,我們要需回返查詢的結果,如果是*Multiple這樣的查詢,我們還要需訴告SDK查詢到這個結果以後,SDK否是要需繼承理處後續的查詢。爲實現這些功能,SDK在每個查詢的API中,都供提給了一個PxSceneQueryFlags類型的參數供我們用使,指定我們要需什麼樣的回返值,或者這個結果以後,該如何繼承。PxSceneQueryFlags的定義是這樣的:

struct PxSceneQueryFlag
{
	enum Enum
	{
		eIMPACT		= (1<<0),	//!< 回返結果PxSceneQueryHit中包括"impact"
		eNORMAL		= (1<<1),	//!< 回返結果PxSceneQueryHit中包括"normal"
		eDISTANCE	= (1<<2),	//!< 回返結果PxSceneQueryHit中包括"distance"
		eUV		= (1<<3),	//!< 回返結果PxSceneQueryHit中包括質心座標系"u" and "v". sweep檢測不可用。
		eINITIAL_OVERLAP	= (1<<4),	//!< 在sweep檢測中開打或者閉關初始訂交檢測,並且在回返結果中也表明初始訂交
		eINITIAL_OVERLAP_KEEP	= (1<<5),	//!< 與eINITIAL_OVERLAP一同用使,保存或者棄放初始就訂交的碰撞體
		eTOUCHING_HIT	= (1<<6),	//!< 明表檢測到的是Touching hit,*Multiple查詢可以繼承
		eBLOCKING_HIT	= (1<<7),	//!< 明表檢測到的是Blocking hit,*Multiple查詢將終止繼承查詢
	};
};

    
以上是對PhysX 3.2中場景查詢功能的一些基本分析,希望夠能幫助大家更快的上手用使PhysX 3.2的場景查詢功能。

文章結束給大家分享下程序員的一些笑話語錄: 一個合格的程序員是不會寫出 諸如 “摧毀地球” 這樣的程序的,他們會寫一個函數叫 “摧毀行星”而把地球當一個參數傳進去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章