碰撞体的形状
- 立方体
- 球
- 胶囊:椭球
- 网格
- 车轮
- 地形碰撞体
三维弹性碰撞
private Vector3 m_preVelocity = Vector3.zero;//上一帧速度
public void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.name == "wall")
{
ContactPoint contactPoint = collision.contacts[0];
Vector3 newDir = Vector3.zero;
Vector3 curDir = transform.TransformDirection(Vector3.forward);
newDir = Vector3.Reflect(curDir, contactPoint.normal);
Quaternion rotation = Quaternion.FromToRotation(Vector3.forward, newDir);
transform.rotation = rotation;
rigidbody.velocity = newDir.normalized * m_preVelocity.x / m_preVelocity.normalized.x;
}
}
物体碰撞
更改transform.position而不给物体添加速度,物体是不会碰撞的。 unity的component是有顺序的。 刚开始学习unity的时候,老师说translate的移动方式不会受到碰撞影响,最近有个项目,要让碰撞起作用,测试之后,发现用translate移动会受到碰撞限制。 移动的物体上有Collider和Rigidbody组件,Rigidbody组件中 Collision Detection最好选择Continuous Dynamic模式。被碰撞的物体具有Collider组件。
Unity3d中的碰撞器(Collider)和触发器()的区别?
答:碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。 当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数; 当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。 如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
物体发生碰撞的必要条件
答:两个物体都必须带有碰撞器Collider,其中一个物体还必须带有Rigidbody刚体。
碰撞发生的几个阶段
- OnCollisionEnter
- OnCollisionStay
- OnCollisionExit
Unity为什么没有提供圆柱体的collider?
https://forum.unity.com/threads/why-cylinder-collider-doesnt-exist.63967/
核心原因:圆柱体的碰撞检测实现困难。
正方体、球体、椭球体可以非常简便地判断是否相交,而圆柱体判断相交比较复杂。
算法题:
- 给定空间中两个长方体,判断它们是否存在公共部分。
- 给定空间中两个球体,判断它们是否存在公共部分。
- 给定空间中两个椭球体,判断它们是否存在公共部分。
- 给定空间中两个圆柱体,判断它们是否存在公共部分。