方法1,每个物体我记录4个点,然后判断2或者4次,如果左上和右下,那么算碰撞,如果右上和左下,也算碰撞,否则就没碰撞
方法2,每个物体我记录中心点和胖瘦,直接勾股定理求距离,如果距离小于胖瘦之和就算碰撞,否则不算,但是勾股定理好像比上面的判断4次还慢
所以,哪个方法效率更好那?
第二个,距离算平方值就行,不用开方
有道理,我用胖瘦之和再乘方1次当比较条件,这样就不用每个都开方一次了,每个物体都能减少一次计算,我再改改
方法一是矩形碰撞,把物体作为长方形来检测,适合人物、建筑等等
方法二是圆形碰撞,把物体作为圆形来检测,适合子弹、正方形的物体等等
物理碰撞还包括了碰撞判断时机
逻辑也要考虑清楚
我现在1屏幕有100个子弹200个怪,用物理的太卡,想试试能不能手写优化一下
你是不是应该换那个轻量的不带物理效果的碰撞系统?有没有试过?
比如四叉树
是哪个?我现在怪加包围盒,子弹加包围盒和刚体,然后刚体设置的是运动学,碰撞事件回调的是刚体的,你说的更轻量的,是哪个?
你子弹靠刚体移动? 
我是对BoxCollider监听的onTriggerEnter事件,但是发现如果子弹不加刚体,没法触发事件,所以只有子弹加了,怪没加刚体
曼哈顿是最快的 我写过一个分区+曼哈顿 200行代码,下次征文水下
曼哈顿是斜着的正方形, 用weakmap 记录碰撞状态,走曼哈顿判定 on/off 即可
private _getCollisionState(nodeA: HitObj, nodeB: HitObj): boolean {
const pairMapA = this._collisionPairs.get(nodeA);
if (!pairMapA) return false;
return pairMapA.get(nodeB) || false;
}
private _setCollisionState(nodeA: HitObj, nodeB: HitObj, state: boolean) {
let pairMapA = this._collisionPairs.get(nodeA);
if (!pairMapA) {
pairMapA = new WeakMap();
this._collisionPairs.set(nodeA, pairMapA);
}
pairMapA.set(nodeB, state);
}
private _manhattanDistance(pos1: Vec3, pos2: Vec3): number {
return Math.abs(pos1.x - pos2.x) + Math.abs(pos1.z - pos2.z);
}
你曼哈顿距离替代欧式距离,我明白减小计算量,但是组a组b那个是什么意思,1组是带碰撞盒和刚体的,1组是只带碰撞盒而不带刚体的?
自定义group 根据group mask 决定哪些group 检测
那明白了,那其实可以有2层分组,1个是根据概念,例如是怪物还是子弹,2个是根据位置,例如屏幕水平和垂直分4个区域,然后加个字典,每帧遍历需求有碰撞触发的组对组
这一段中的,
const isColliding = dist <= nodeA.minDistance + nodeB.minDistance;
,这句里的minDistance,是节点矩形的最短边的边长吗?
有一个不用加onTriggerEnter的就是轻量的碰撞系统Builtin
嗯 我有用line 画出来的
好的,换成内置物理系统吗,我查查
碰撞检测就那么几种算法吧 aabb obb 分离轴

