@flare-engine/physics

中文文档
0.4.12发布于 2026/11/13Apache-2.0TypeScriptESM + CJS构建来源已验证近 30 天下载 2677

AABB 碰撞、空间指数、射线

中文使用文档
文档目录5 节
  1. 安装
  2. 使用量
  3. 解决碰撞
  4. 横扫世界
  5. 许可证

@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

版本与发布记录

@flare-engine/physics 共发布 17 个版本,首次发布于 2026/06/10;过去 12 个月发布了 17 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.4.12latest2026/11/133 天前
0.4.112026/11/123 天前
0.4.102026/11/087 天前
0.4.82026/11/0610 天前
0.4.72026/11/0411 天前
0.4.62026/10/3115 天前

关于 @flare-engine/physics 的常见问题

@flare-engine/physics 是什么?

AABB 碰撞、空间指数、射线

如何安装 @flare-engine/physics?

在项目目录运行 npm install @flare-engine/physics,或使用 pnpm add / yarn add / bun add。

@flare-engine/physics 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@flare-engine/physics 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@flare-engine/physics 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@flare-engine/physics 可以商用吗?

@flare-engine/physics 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@flare-engine/physics 的下载量有多少?

根据 npm 官方下载统计,@flare-engine/physics 在 2026/10/15 – 2026/11/13 这 30 天内被下载 2,677 次,日均约 89 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@flare-engine/physics 还在维护吗?

最新版本 0.4.12 发布于 2026/11/13(3 天前);至今共发布 17 个版本,其中过去 12 个月发布了 17 个;首次发布于 2026/06/10。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。