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