cocoscreator3.8.3 简洁的Obb碰撞检测

import { Vec3 } from "cc";

export class Obb {

    position: Vec3;

    extents: number[];

    axes: Vec3[];

    constructor(position: Vec3, width: number, height: number, rotation: number) {

        this.position = position;

        this.extents = [width / 2, height / 2];

        this.axes = [new Vec3(Math.cos(rotation), Math.sin(rotation)), new Vec3(-1 * Math.sin(rotation), Math.cos(rotation))];

    }

    static detectorObb(obb1: Obb, obb2: Obb): boolean {

        var nv = obb1.position.subtract(obb2.position);

        var axisA1 = obb1.axes[0];

        if (obb1.getProjectionRadius(axisA1) + obb2.getProjectionRadius(axisA1) <= Math.abs(nv.dot(axisA1))) return false;

        var axisA2 = obb1.axes[1];

        if (obb1.getProjectionRadius(axisA2) + obb2.getProjectionRadius(axisA2) <= Math.abs(nv.dot(axisA2))) return false;

        var axisB1 = obb2.axes[0];

        if (obb1.getProjectionRadius(axisB1) + obb2.getProjectionRadius(axisB1) <= Math.abs(nv.dot(axisB1))) return false;

        var axisB2 = obb2.axes[1];

        if (obb1.getProjectionRadius(axisB2) + obb2.getProjectionRadius(axisB2) <= Math.abs(nv.dot(axisB2))) return false;

        return true;

    }

    getProjectionRadius(axis: Vec3) {

        return this.extents[0] * Math.abs(axis.dot(this.axes[0])) + this.extents[1] * Math.abs(axis.dot(this.axes[1]));

    }

}

//作用案例
const OBB1 = new Obb(this.box1.node.position.clone(), this.box1.width, this.box1.height, this.box1.node.angle * Math.PI / 180);

    const OBB2 = new Obb(this.box2.node.position.clone(), this.box2.width, this.box2.height, this.box2.node.angle * Math.PI / 180);

    var r = Obb.detectorObb(OBB1, OBB2);

    console.log(`-----> 是否相交:${r}`);

上面的就是判断2个带旋转的矩形是否相交

1赞

给自己当个记录~~怕以后忘记了

1赞

我也标记一下,顺便问一下,你的position用世界坐标不行吗?因为有可能是子弹和物体分开的~

你可以判断的时候把某一方的坐标系转换到对面那边去来计算就可以了

我自己测试一下吧,量级大的话这么转还是有点难受~

经过测试,可以的~用世界坐标也可以~

还有一个办法,不转也是可以的,就是子弹的父容器和怪物的父容器的大小和位置都是一致的话,那就可以不用转了

不一致的,所以我才提了一嘴~反正用世界坐标是可以的,大胆的用~