衝突碰撞是針對shape的碰撞。shape之間可能存在預設不碰撞檢測的情況。相互碰撞檢測方式如下圖:
只要設定shapedesc.shapeflags |= nx_trigger_enable就可以使得該shape免予衝突檢測。
衝突檢測是很耗效能的。每次的遍歷是很難實現的。所以有一些效能上的優化。首先能夠衝突檢測的pair是在一定的距離內的。另外還要滿足下面的衝突檢測前的判斷。
(a->getactor()->isdynamic() || b->getactor()->isdynamic())可以手工把shape分到組裡面。系統維護了乙個32*32的矩陣碰撞檢測標誌,也就是一共可用32個組。預設所有的shape都在0組。如果兩個組不碰撞,則不進行碰撞檢測。下面函式可以修改矩陣標誌位。&& nxscene::getgroupcollisionflag(a->getgroup(), b->getgroup())
&& (!(nxscene::getshapepairflags(a,b) & nx_ignore_pair))
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);針對shape的128bit組、操作符、標誌位判定過濾器。nxscene::setshapepairflags(nxshape&, nxshape&, nxu32 flags);
設定了使用者自定義過濾器後,其他的過濾器都失效了(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的問題,上**:
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;// mesh的定點描述序列。
stm.********s = ********s;// 三角形定點序列
stm.flags |= nx_mf_flipnormals;
return pphysxsdk->createccdskeleton(stm);
}
由於 nxccdskeleton是乙個skeleton描述。所以不同的shape可以使用乙個skeleton描述。不用每次建立shape都需要重新new新的
nxccdskeleton。
速度並非高過某一值就必定發生穿牆。穿牆的速度是離散分布的。
比如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檔案,有個別檔案安裝上安裝不過去,遇到問題後搜尋問題可以找到解決方案,解決後以後就幾乎不會遇到。如果是預設的程式...