对于同步,碰撞等效果需要引入物理引擎进行模拟的。就涉及到服务器和客户端同时模拟同步的问题。经过一定时间的测试,已经能够在客户端使用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下是几乎相同的。会有微小误差。但是如果同步的是速度,则同步上会出比较大的差距。特别是力比较大的情况下。