@flare-engine/物理学
已建 AABB / Circle相撞探测器 - CollisionWorld 带有出入信号, SpatialIndex 统一相位相, CollisionWorld.raycast 用于宽相支持的射线查询加独立 raycast 明确的目标清单,以及 overlapInto 用于最小翻译分辨率。 触发 / 层/ 口罩过滤 。 固态网格运动 : buildSolidGrid 编号 : isBlockedAABB 编号 : moveAndSlideInto (结构 SolidTile 输入,无平面分解,半开AABB-vs-tile,轴相分离的幻灯片,零分量,带有 isSolidAt 编号 : setSolidAt 在运行时读取或翻出一个单元格。 不存在第三方物理依赖性:刚体反应生活在第一方 @flare-engine/dynamics,在设计文件中评价的planck.js选项从未被采纳. 按对撞机计数计算的成本,包括捕获日期和运行到运行的分布,公布于 基准这些行的时间是整个物理框架(移动每个相撞器,然后 step()(没有) step() 被隔离。 相撞器在硬地边界上包裹,因此整个样本窗口的密度是恒定的,如果有人逃脱,探测器会失败捕获;将行读作放大向导,这就是 <1000 以上图出自.
@flare-engine/physics 答题 这些重叠是否· ; @flare-engine/dynamics 答题 他们最终会在哪里。两个软件包都取决于另一个软件包的覆盖范围 @flare-engine/dynamics 当身体需要相互推动时, 不只是报告接触.
安装
bun add @flare-engine/physics
使用量
import { CollisionWorld, AABB, createCollider } from '@flare-engine/physics';
declare const entityA: number;
declare const x: number, y: number;
const world = new CollisionWorld();
world.onCollisionStart.add((pair) => console.log(pair.entityA, pair.entityB));
const colliderA = createCollider(AABB(32, 32), { layer: 1, mask: 2 });
world.addCollider(entityA, colliderA, x, y);
world.step();
解决碰撞
shapeOverlap 答题 是否为 两个形状相撞 让你知道有问题
而不是如何修复它. overlapInto 给出最小的翻译矢量——最短的推力
将它们分开:
import { AABB, CircleShape, createOverlap, overlapInto } from '@flare-engine/physics';
const mtv = createOverlap(); // reuse across pairs — no per-pair allocation
if (overlapInto(AABB(32, 32), 0, 0, CircleShape(8), 18, 4, mtv) !== null) {
// mtv.x / mtv.y is a unit axis pointing from a toward b; mtv.depth is how far
// b must move along it to just stop touching.
}
回返 null 当形状分开时,你的缓冲器没有动静。 同心圆没有
有意义的轴线,所以 (1, 0) 而不是返回 NaN 从零向量的正常化.
触取不是相相相会. 每个形状对都是严格的: 边缘完全相遇的两个形状
重叠,单位 shapeOverlap 财务报告和审定财务报表 overlapInto 一样,所以两者总是同意。 零辐射圆
只有在严格在盒子内时,才像零大小的盒子那样相撞.
横扫世界
import { CollisionWorld } from '@flare-engine/physics';
declare const world: CollisionWorld;
// Nearest hit along +x, limited to colliders on layers 1 and 2.
const hit = world.raycast(0, 0, 1, 0, 500, 0b011);
if (hit !== null) {
// hit.entity / hit.distance / hit.point / hit.normal
}
CollisionWorld.raycast 只走射线所接触的宽相间细胞和过滤器
编辑 layer 位相撞者已经携带( t)mask 默认为每层)。 独立
raycast(ox, oy, dx, dy, maxDist, targets) 出口仍用于违反明确清单
不是一个世界.
回击记录在通话之间重复使用 ——在铸造前读取,或者复制需要的
再来一次 这就是保持每帧射线分配自由的原因;相对的独立的帮助者返回
(加上两个巢穴) Vec2(s) 呼叫者可能保持的每次通话.
见 API 规格。 。 。 .
许可证
阿帕奇 - 2.0