抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

简介

用圆或球来包裹物体,检测两个物体是否有碰撞。

原理

判断两个圆是否相交,只需要判断两个圆心的距离小于等于(也可以只是小于,看需求)两个圆的半径之和,若小于,则相交。

二维空间和三维空间的原理相同,也是判断两个球心的距离小于等于两个球的半径之和。

物体的包围球可能会存在较大的空隙,因此包围球检测的精度较低。

我们在求距离的时候,可以使用平方来计算,因为平方的开销比开方小,这样可以优化性能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//包围盒数据结构
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CollisionData : MonoBehaviour
{
public Vector3 center = Vector3.zero;
public float radius = 1.0f;
}
---------------------------------------------
/// <summary>
/// 球与球检测
/// <param name="data1"></param>
/// <param name="data2"></param>
/// </summary>
private bool CollisionCircle(CollisionData data1,CollisionData data2)
{
//求两个球半径和的平方
float totalRadius = Mathf.Pow(data1.radius + data2.radius, 2);
//球两个球心之间的距离平方
float distance = (data1.center - data2.center).sqrMagnitude;
//距离小于等于半径和则碰撞
if (distance <= totalRadius)
{
return true;
}
return false;
}

碰撞检测示例工程

评论