PhysX學習記錄 七 衝突檢測

2021-06-20 18:00:52 字數 3593 閱讀 1760

衝突碰撞是針對shape的碰撞。shape之間可能存在預設不碰撞檢測的情況。相互碰撞檢測方式如下圖:

只要設定shapedesc.shapeflags |= nx_trigger_enable就可以使得該shape免予衝突檢測。

衝突檢測是很耗效能的。每次的遍歷是很難實現的。所以有一些效能上的優化。首先能夠衝突檢測的pair是在一定的距離內的。另外還要滿足下面的衝突檢測前的判斷。

(a->getactor()->isdynamic() || b->getactor()->isdynamic())

&& nxscene::getgroupcollisionflag(a->getgroup(), b->getgroup())

&& (!(nxscene::getshapepairflags(a,b) & nx_ignore_pair))

可以手工把shape分到組裡面。系統維護了乙個32*32的矩陣碰撞檢測標誌,也就是一共可用32個組。預設所有的shape都在0組。如果兩個組不碰撞,則不進行碰撞檢測。下面函式可以修改矩陣標誌位。

nxscene::setgroupcollisionflag(collisiongroup g1, collisiongroup g2, bool enable);
actor分組與shape分組功能類似。不過actor分組需要設定有效的碰撞標誌位,而不能完全遮蔽碰撞。預設都在0組。如果希望預設能夠衝突檢測,就需要設定 0組合0組製件能夠衝突碰撞。

gscene->setactorgrouppairflags(333,334, nx_notify_on_start_touch | nx_notify_on_end_touch);
標誌位包括:nx_notify_on_start_touch, nx_notify_on_end_touch, nx_notify_on_touch.

可以只設定對應的兩個actor或者shape的碰撞過濾。

nxscene::setactorpairflags(nxactor&, nxactor&, nxu32 flags);

nxscene::setshapepairflags(nxshape&, nxshape&, nxu32 flags);

針對shape的128bit組、操作符、標誌位判定過濾器。

設定了使用者自定義過濾器後,其他的過濾器都失效了(2,3,4)。

這個我一開始是理解為連續衝突檢測,就是乙個simulate裡面可以多次碰撞。看了文件後才發現原來是針對discrete collision detection而來的。主要是針對高速移動actor的碰撞檢測,如果使用discrete collision detect可能出現穿牆而過的情況而出現的乙個演算法。原理是就是dcd顧名思義就是離散衝突檢測。檢測只在各個step點上,所以可能導致穿牆。而ccd是step的路線框出乙個矩形和另乙個actor進行碰撞檢測。所以可以避免穿牆的問題。

對於慢速移動、多碰撞物體模擬效果會步入dcd。比如在凹面上面滾動的球。

1.nx_coutinuous_cd設定為true,該設定可以在執行時修改:

gphysicssdk->setparameter(nx_coutinuous_cd, true)

或者nx_cf_inherit_setting標誌位清除,nx_cf_continuous_cd設定true

dynamic vs static

2.dynamic actor物件必須有 ccd skeleton

3.dynamic actor的線速度必須高於ccdmotionthreshold.預設是0

4.static actor的shape必須是nxconvexmeshshape、nx********meshshape的組合

dynamic vs dyname

2.2個actor至少包含乙個設定了nx_sf_dynamic_ccd的shape

3.兩個actor必須包含ccd skeleton

4.至少乙個actor的線速度必須超過ccdmotionthreshold

5.兩個actor的相對速度必須超過ccdmotionthreshold

主要是mesh的問題,上**:

[cpp]view plain

copy

nxccdskeleton* createccdskeleton (nxphysicssdk* pphysxsdk, 

float

size)  

;// 三角形定點序列。乙個三角形3個點。這裡寫的是定點的index.對應後續的stm.points陣列裡面的定點序列。1就是stm.points[1]

nxvec3 points[8];  

//static mesh

points[0].set( size, -size, -size);  

points[1].set( size, -size,  size);  

points[2].set( size,  size, -size);  

points[3].set( size,  size,  size);  

points[4].set(-size, -size, -size);  

points[5].set(-size, -size,  size);  

points[6].set(-size,  size, -size);  

points[7].set(-size,  size,  size);  

nx**************mesh stm;  

stm.numvertices = 8;  

stm.num********s = 6*2;  

stm.pointstridebytes = sizeof

(nxvec3);  

stm.********stridebytes = sizeof

(nxu32)*3;  

stm.points = points;"white-space:pre"

>              

// mesh的定點描述序列。

stm.********s = ********s;"white-space:pre"

>            

// 三角形定點序列

stm.flags |= nx_mf_flipnormals;  

return

pphysxsdk->createccdskeleton(stm);  

由於 nxccdskeleton是乙個skeleton描述。所以不同的shape可以使用乙個skeleton描述。不用每次建立shape都需要重新new新的

[cpp]view plain

copy

nxccdskeleton。  

[cpp]view plain

copy

速度並非高過某一值就必定發生穿牆。穿牆的速度是離散分布的。

比如29會碰撞,30穿牆,31碰撞,32穿牆。

PhysX學習記錄 七 衝突檢測

衝突碰撞是針對shape的碰撞。shape之間可能存在預設不碰撞檢測的情況。相互碰撞檢測方式如下圖 只要設定shapedesc.shapeflags nx trigger enable就可以使得該shape免予衝突檢測。衝突檢測是很耗效能的。每次的遍歷是很難實現的。所以有一些效能上的優化。首先能夠衝...

PhysX學習記錄 六 Joint

如果沒有joint,所有actor都只能進行簡單易懂操作。有了joint才有了豐富多彩的關聯移動方式。joint和contract 碰撞檢測時產生的碰撞點 是physx系統兩種約束之一。所有約束都是面對乙個pair物件。兩個actor稱為乙個pair。可以通過設定乙個actor為null來與世界進行...

PhysX初步學習內容記錄

現在總結幾點內容,我用的是win7 64位作業系統,使用vs2012 1,雖然現在64位機子普及了。但是為了相容性考慮,還是編譯win32版本的。2,需要安裝dxsdk jun10.exe檔案,有個別檔案安裝上安裝不過去,遇到問題後搜尋問題可以找到解決方案,解決後以後就幾乎不會遇到。如果是預設的程式...