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 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个带旋转的矩形是否相交

标签: none

添加新评论