1. 程式人生 > >Physx Unity3D同步模擬

Physx Unity3D同步模擬




對於同步,碰撞等效果需要引入物理引擎進行模擬的。就涉及到伺服器和客戶端同時模擬同步的問題。經過一定時間的測試,已經能夠在客戶端使用Unity3D 3.4.2伺服器使用Phyxs 2.8.1的情況下,實現直線運動和碰撞上的同步。但是由於客戶端和伺服器幀率上存在的差別,所以對於碰撞,無法很好的同步,只能在碰撞後,伺服器進行微調。


現在羅列細節如下:
1.主意物理幀率。Unity3D使用Time.fixedDeltaTime 伺服器使用NxSence::SetTiming
2.伺服器和客戶端使用幀同步
3.Unity3D Drag與Physx的damping是一個概念的。
4.重力
a.Unity3D的重力設定可以在edit->project setting->physxics->Gravity設定。Physx在NxSence上設定
b.Unity3D單個物體是否受重力影響可以在rigidbody設定use gravity, physx通家過NxActor::raiseBodyFlag(NX_BF_DISABLE_GRAVITY)
5.最大速度
a.最大角速度是有設定的。Unity3D在edit->project setting->physxics->Max Angular Velocity。Physx是NxBodyDesc.maxAngularVelocity上
6.Unity3D和Physx使用的都是左手座標系所以沒有多少關係。但是有幾個座標轉換的函式是需要熟悉的
a.Unity3D
Rotation是Quaternion型別。在Inspector上填寫的rotation是繞x,y,z軸的旋轉角度。最後的關係是如下,主意順序不能亂:
transform.rotation = Quaternion.Quaternion.AngleAxis(rotation.y, Vector3.up)
*Quaternion.AngleAxis(rotation.x, Vector3.right)
*Quaternion.AngleAxis(rotation.z, Vector3.forward)

Quaternion.Inverse()獲取當前的逆矩陣,可以用來實現左邊的互轉
b.Physx
localxxxx
NxMat33.getInverse()獲取當前矩陣的逆矩陣,可以用來實現左邊的互轉
7.伺服器StepTime 200ms,客戶端fixedDeltaTime 20ms.伺服器的一次simulator和客戶端的10次fixedUpdate效果在AddForce和AddTorge下是幾乎相同的。會有微小誤差。但是如果同步的是速度,則同步上會出比較大的差距。特別是力比較大的情況下。