首页 > 代码库 > 关于Unity中的刚体和碰撞器的相关用法

关于Unity中的刚体和碰撞器的相关用法

1.创建一个3D工程

2.构造项目文件目录

3.保存场景为game_scene到文件夹scenes中

4.创建一个Plane平面类型的GameObject节点和一个Sphere球体类型的GameObject节点

5.给Plane贴上图片,Sphere贴上材质

6.运行,发现球在空中静止,因为没有添加受力体,也就是刚体组件Rigidbody,添加后运行,球从空中掉到平面上,前提是两者都已经有Collider碰撞器组件,否则只要一方没有Collider就会穿过彼此。

 

Rigidbody组件属性

1.Mass(质量): [0, 10],默认为1, [0.1, 10]日常生活的感受;

2.Drag(阻力): 物体移动时的阻力
3.AngularDrag(旋转阻力): 旋转时候的衰减;
4.Use Gravity(使用重力): 是否受重力影响;
5.Is Kinematic(是否受牛顿运动学影响): false,正常的物理计算,true运动只会在代码和动画里面受影响,普通的碰撞等都不会改变它的运动状态;
6.Interpotate: (物体运动插值模式) None(最近计算值) Interpolate(内插值) extrapolate(外插值)
7.Collision Detection:Discrete(离散模式 资源少,静止,低速,普通物体) Continuous(连续检测,高速体积小,子弹)。被使用了Continusous检测撞击的对象(被子弹撞击的物体),使用Continus Dynamic模式;
子弹发射碰撞物体,在两个update之间,时间dt范围之内,使用Discrete,子弹会偶然穿过物体,且显示没有发生碰撞,Continuous会判断初始和穿过之后这段距离之间有没有发生碰撞,有就吧子弹还原到撞到物体表面的状态,子弹不会穿过物体。

  Discrete优点运行速度快,性能消耗小,缺点有穿透。

  Continuous优点不会穿透,缺点运行速度慢,性能消耗大。

  Continus Dynamic搭配Continuous,提升仿真效果。

8.Constraints(约束):哪个坐标轴打钩哪个就不会改变,位置和旋转,都可以设置。

 

刚体变量

1: 角速度(angularVelocity);
2: 线性速度(velocity);
3: 重心(center of mass)
4: 碰撞检测开关(detectCollisions): 默认为true, 关闭检测碰撞 false;
5: intertiaTensor惯性张量 intertiaTensorRotation 惯性张量旋转;
6: 最大角速度(maxAngularVelocity);
7: 最大穿透速度(maxDepenetrationVelocity)
8: position:刚体的世界坐标,与图像的transform.position尽量保持一致。因为是刚体带动图像在运动,所以刚体先动,然后图像才动,所以两者坐标大致相同。
9: rotation: 刚体在世界坐标的旋转,与图像的transform.rotation也是尽量保持一致。
10: useConeFiction是否使用锥形摩擦,一般false; true一般不使用;

 

创建一个ball的脚本,挂载在Sphere球体下面。ball脚本的内容:

   Rigidbody body;
// Use this for initialization void Start () { this.body = this.GetComponent<Rigidbody>(); Debug.Log(this.body.angularVelocity); // 角速度 Debug.Log(this.body.velocity); // 线性速度; Debug.Log(this.body.centerOfMass); //重心; // 关闭了以后就不会有碰撞,这个球就会穿透这个平面 // this.body.detectCollisions = false; // transform.position 也会有一个坐标大致相等。 Debug.Log(this.body.position); // 刚体所在的世界坐标 Debug.Log(this.body.rotation); // 刚体的旋转 }

 

刚体常用方法

F *T=冲量变化=MV1-MV0

F:力的大小和方向

T:力的作用时间

当V0为0时,F *T=MV

 

世界坐标就是Scene视图右上角那个坐标系的坐标,和物体自身的模型坐标系没有关系。

 

关于Unity中的刚体和碰撞器的相关用法