@adatechnology/game-destruction-three

中文文档
0.15.4发布于 2026/11/04MITTypeScriptES Module构建来源已验证近 30 天下载 5248

三.js 用于 @adatechnology/game- destruction的渲染器:凹口、孔口、焦炭、发热、熔融、碎片、松散的碎片和集合粒子(火、烟、火花、灰尘、硬块、碎片).

中文使用文档
文档目录7 节
  1. 安装
  2. 使用量
  3. 合并网格的部分
  4. 每次活动都画什么
  5. 业绩
  6. API 密码
  7. 葡萄牙

@adatechnology/game- destruction- 三号机车

三.js 制造器用于 @adatechnology/game-destruction核心决定了打击行为,将其报告为事件 套件在你的夹层上画出:顶点凹陷、弹孔和裂缝标记、焦炭和热发光、熔融和凹陷、有光的碎片 物理,一分后松散的碎片被取出,并集合出粒子(火,烟,火花,灰尘,碎片,分出物等.

  • 没有任何变化:几何和材料在网状的首次视觉变化上被克隆,以及 restore 编号 : clear 把原件还给我.
  • 爆炸和燃烧部分的起火 是由爆炸的影响世界所吸引的 @adatechnology/game-vfx (单位:千美元) explode 事件播放 ev.effect ?? 'generic',当它命名为无时按半径缩放)。 传出世界的主机股份 vfx没有它,造物主将创造自己的世界 game-vfx-three 层并步入 update碎片、火花、滴子和漏子仍然使用两个集合 THREE.Points (添加和正常混合),在阴影中计算出一个柔软的图案(没有纹理资产);当它们移动到共享的图案池时 game-vfx 得到一个.
  • three 仅用于类型中的对等依赖:您通过自己的 THREE 在运行时间.
  • 渲染器不演奏: 您得到密钥(impact_metal, (中文(简体) ), shatter_glass, (中文(简体) ), burn_loop, (中文(简体) ), burn_end,...)通过 onSound。 。 。 . createDestructionSound(engine) 是他们的音源 @adatechnology/game-audio 引擎: Cena de Arte的材质声音(clang,木头,玻璃,倒塌,thud,boom.)和游戏的爆炸出击出出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出击出style: 'art_scene' | 'game', (中文(简体) ), keys 因此,一个游戏会改变每个关键玩法。 撞击 断裂 或 Ricochet 也会发出 detail.keys首先,最具体的是: impact_<material>_<blow>, (中文(简体) ), impact_<material>, (中文(简体) ), impact_<family>_<blow>, (中文(简体) ), impact_<family> (单位:千美元)blow 是击中的 DamageType,作为 blow家人来自 impactFamily:金属,玻璃,陶瓷,土壤,泥瓦,木材,植物,塑料,橡胶,蜡,软. IMPACT_SOUND_KEYS 给每个家庭一个子弹、一击和一击剑的声音; 游戏替换或压制任何键入 keys。 。 。 .

合同居住 @adatechnology/game-contracts;这些类型在此再出口,因此现有的进口继续有效.

安装

pnpm add @adatechnology/game-destruction-three @adatechnology/game-destruction three

没有捆绑的浏览器( 全局为 GameDestructionThree;它捆绑了核心,所以你只需要三个.js和这个文件:

<script src="https://unpkg.com/@adatechnology/game-destruction-three/dist/index.global.js"></script>
<script>
  const { spec, parts } = GameDestructionThree.specFromObject3D(THREE, model)
</script>

使用量

import * as THREE from 'three'
import { createDestruction } from '@adatechnology/game-destruction'
import { createDestructionRenderer, specFromObject3D } from '@adatechnology/game-destruction-three'

const scene = new THREE.Scene()
const world = createDestruction({ seed: 7 })
const renderer = createDestructionRenderer(THREE, {
  scene,
  world,
  quality: 'medium',
  groundAt: (x, z) => terrain.heightAt(x, z), // default: flat at y = 0
  onPiece: (piece) => grabbable.push(piece),
  onSound: (key, point, volume) => audio.play(key, point, volume),
})

// 1. describe a model: one part per mesh, materials guessed from names, joints inferred from touching parts
scene.add(chairModel)
const { spec, parts } = specFromObject3D(THREE, chairModel, { name: 'chair', anchorBelow: 0.01 })

// 2. register it in the world and bind it to the model (the world follows chairModel's transform)
const id = world.add(spec, { position: [2, 0, -3] })
renderer.bind(id, chairModel, { parts })

// 3. hit it, burn it, take it apart
world.shoot([0, 1.5, 0], [0, 0, -1], 2500, 9)
world.hit(id, { type: 'fire', point: [2, 0.4, -3], temperature: 900, radius: 0.3, duration: 0.2 })

// 4. every frame
function frame(dt: number) {
  world.update(dt)
  renderer.update(dt)
}

// make a bound object a thrown prop
const piece = renderer.makePiece(id, { mass: 6 })
renderer.impulse(id, [0, 40, -120], [2, 0.6, -3])

bind 找到每个部分的网格 options.parts (怎样) specFromObject3D 返回),否则 userData.destructionPart 或者一个网名 等同部分 id, 由包含网格中心的部分框表示. specFromObject3D 读取 userData.destructionMaterial, (中文(简体) ), destructionPart (部分编号,或 { id, material?, parent?, kind? }数字 : parent + 键 kind (一) 将该部分附在其父母身上,并配有此类关节, destructionIgnore, (中文(简体) ), destructionTags 财务报告和审定财务报表 hollow。 。 。 .

对于挑剔, bind 松散的、微薄的、薄荷的、薄荷的、薄荷的、薄荷的、薄荷的、薄荷的、薄荷的 userData.destructionPart (d)和 userData.destructionObject (世界的id对象 部分属于现在; 一个松散的块由 splitGroup 拥有自己的身份,同样的身份 renderer.piece(id) 财务报告和审定财务报表 world.state(id) ),同样在网格上,一个顶点-距离部分离开一个合并网格时得到. 射线击中 world.hitPart(hit.object.userData.destructionObject, hit.object.userData.destructionPart, ...). 纯视膜(碎片、标记、地上) 污点) userData.destructionDebris = true:选择时跳过它们. 由被合并的网目所绘制的部件共享它,所以被合并的网目本身没有带部分的ID.

合并网格的部分

一个建筑或烤制的模型往往有一个合并的网格,用于许多部分. 按其所占据的顶点范围将每个部分捆绑在一起({ mesh, range: [v0, v1] }, (中文(简体) ), 结束独有性; 部分值也可以是混合间隙和范围的数组:

renderer.bind(houseId, houseRoot, { parts: {
  wall_north: { mesh: merged, range: [0, 1280] },
  wall_south: { mesh: merged, range: [1280, 2610] },
  door: doorMesh,                      // plain meshes still work
} })

对于有索引的几何,其三个顶点都位于范围;对于无索引的几何,范围是部分 三角形 三角形 三角形 凹槽只移动范围的顶点; Char和发热会移动到范围的顶点颜色(网点得到一个) color 属性和克隆 具有 vertexColors; 洞和裂缝标记留在部分; 熔融壁球并只拓宽范围。 当角色 断层或倒塌( :detach 财务报告和审定财务报表 collapse 它的面部被复制, 带有凹痕和颜色 和合并的网状变形 材料,变成新的网格,成为松散的块, 范围倒塌到一个点 在合并的网格,所以它消失在那里。 一个断了的, 被熔化或被烧掉的部分同样消失了. restore 财务报告和审定财务报表 clear 将合并后的网状原几何和材料放回并取出 松开后缀。 无效区域( 在几何或空外) 抛出 bind。 。 。 .

每次活动都画什么

活动视觉声音密钥
dent内部的顶点 dent.radius 被推进 depth * (1 - (d/r)^2)^2 (跳过) low 20克以上;金属花花花impact_*
hole表面为暗圆盘地标(并位于一个穿孔的出口一侧);透明材料为快克星;金属为火花impact_*
crack仅由玻璃(透明材料)上相接的白色线条组成的恒星;不透明的体画出没有线条,其损坏表现为芯片、孔和凹槽impact_*
ricochet沿着反射方向起火ricochet
debris请求的爆炸类型(sparks, (中文(简体) ), dust, (中文(简体) ), shards, (中文(简体) ), splinters, (中文(简体) ), chips, (中文(简体) ), fibers, (中文(简体) ), leaves, (中文(简体) ), drips, (中文(简体) ), ash, (中文(简体) ), smoke, (中文(简体) ), steam(中文(简体) )
fracture部分被隐藏; 有重力、地面回弹、安放、入睡和收缩的碎片(盒;薄不规则的棱镜; 有样式爆炸的碎片)shatter_glass, (中文(简体) ), crumble, (中文(简体) ), splinter, (中文(简体) ), impact_*
spall涂料脱出的地方,孔下,部分核心材料颜色的不透明补丁(磁盘标记);在网格上坐到最接近的点上(其世界盒的细轴)
stage (2个 fragments(中文(简体) )单位大小的裂口以同样的物理特性飞出 fracture 碎片、孔孔 Fragment.marks 在他们身上作黑盘和破碎的灰尘crumble, (中文(简体) ), impact_*
expose以圆柱为例的条(弧度为4毫米),每部分1网格,由每个新取而代之 expose; 空关 bars 取出笼子; renderer.rebarCount()
detach与 autoSplit,每个松散的群体成为自己的 Group (世界变换)和a Piece (单位:千美元)onPiece(中文(简体) )detach
disassemble_progressunscrew (喉咙)
ignite 编号 : extinguish 编号 : burnout从地上放出火和烟雾 part.burning; 喷出后蒸发; 烧出后起灰; 将颜色浸入材料 charColor状态 ashes 隐藏部分,留下一堆灰烬ignite, (中文(简体) ), burn_loop, (中文(简体) ), extinguish
热量(damage 或任何发热部分)发送 heatColor(temperature) 用于材料 visual.glows
meltmeshes sag (Y 下至 25%, 稍宽一点, 有吵闹的顶点, 底部保留); 状态 melted 隐藏部分并留下一水坑melt_sizzle
drip落下后会留下平坦的水潭(被淹没,被盖住)
leak流出从洞中滴出(或气味微弱),而部分仍有升
explode闪光 火 烟雾 灰尘和火花 一个集合 PointLight 脉冲、脉冲和射程内的碎片explode

settle (对象有: DestructibleSpec.soil 已安放或倾斜的:在第一个组位上,渲染器将绑定根子移到一个组位下 destruction-soil 并给它 ObjectState.soil.offset,在土壤产生时更新每个框架;根保持宿主的姿势,这就是什么 syncTransform 不断向世界发送.

world.explode 没有发出它自己的事件(只有一部分带有) explodes 因此,主机引爆 手榴弹或火箭呼叫 renderer.explode(point, energy, radius) 旁边有同样的闪光 火 烟 光 声音和推力.

碎块报告硬着陆:超过3 m/s 渲染器调用 world.hit(id, { type: 'blunt', energy: 0.5 m v^2, radius: 0.08, direction: [0, -1, 0], source: 'fall' }) (按每块0.15分每秒敲一通;物体的变换是先与世界同步,所以被击中的地处正确的地上),所以被丢出一盏玻璃 板子碎了 被扔的椅子会失去一条腿. Piece.localCenter 是相对于根源的质量中心(当部分断出时它会移动).

业绩

预算medium 编号 : highlow
颗粒( A)maxParticles(中文(简体) )2500号第1250号
粒子破裂计数100%60%
裂缝( C)maxFragments(中文(简体) )160 (韩语)80,每秒一个事件的片段被跳过
20千个顶点的口出声对跳过
  • 粒子是两个固定大小的环缓冲器(增加40%,正常为60%),每个抽取一个;死粒子要花一个循环迭接,别无其他.
  • 裂片共用一盒几何,6个硬度几何和每个源材料的1个材料id和颜色;它们会收缩而不是收缩.
  • 德甲共用一盘几何和一盘材料;网格保存最多为48个,渲染器为600个.
  • 热,焦炭和熔融只读作"活性"部件(热,燃烧,熔融)外加每0.4 s对所有部件进行扫描.
  • 爆炸光是在第一次爆炸(事后场景有一盏光,休息时有烈度为0)上所创造的,因此计划一次性的遮蔽再编译.
  • 熔融是直立的.

API 密码

createDestructionRenderer(THREE, options: RendererOptions): DestructionRenderer
specFromObject3D(THREE, root, options?: SpecFromObjectOptions): { spec, parts }
heatColor(temperatureC: number): number // 0xRRGGBB, 0 below ~450 C, dark red ~500, orange ~800, yellow ~1100, white from 1400

RendererOptions数字 : scene, (中文(简体) ), world, (中文(简体) ), quality, (中文(简体) ), maxFragments, (中文(简体) ), maxParticles, (中文(简体) ), fragmentLife, (中文(简体) ), groundAt, (中文(简体) ), gravity, (中文(简体) ), autoSplit, (中文(简体) ), onPiece, (中文(简体) ), onSound, (中文(简体) ), vfx (共同效应世界), camera (自有世界,何时) vfx 未给出), pointScale (以一米为单位的点大小;约 viewportHeight / (2 tan(fov / 2)),默认700).

碎片停留时间: fragmentLife 是安息的碎片在消失之前所停留的几秒钟(默认为12, 0 =永远),或a FragmentLifeRule (fragment, objectId) => seconds 决定每一片块从其 material, (中文(简体) ), size 财务报告和审定财务报表 shape 以及它来自的物体,例如留下的瓦砾和去的芯片: fragmentLife: (f) => (Math.max(...f.size) > 0.1 ? 0 : f.material === 'glass' ? 30 : 12)。 。 。 . maxFragments 盖住同时活出多少人(最古老的先淡出). 松开的碎片(一扇门,一条腿,一块断开的板子)永远不会消失:它们会随着相撞而留在地图上. 灰尘、烟雾和芯片丝有它们这样的生命 内 @adatechnology/game-vfx (单位:千美元)patchSpriteKinds(SPRITE_KINDS, { dust: { life: [10, 30] } }) 影响世界.

DestructionRenderer数字 : bind, (中文(简体) ), unbind, (中文(简体) ), makePiece, (中文(简体) ), pieces, (中文(简体) ), piece, (中文(简体) ), impulse, (中文(简体) ), update, (中文(简体) ), emit, (中文(简体) ), explode(point, energy, radius, { effect?, direction?, visual? }) (单位:千美元)visual: false 只保留推和声, 对于一个主机 发挥效果本身, clear, (中文(简体) ), restore, (中文(简体) ), stats, (中文(简体) ), dispose。 。 。 . clear() 从现场取出碎片、标记、水坑和颗粒并恢复每块接合的网状; dispose() 亦从出世出家出家.

葡萄牙

伦得里扎多尔三.j 第o段 @adatechnology/game-destruction. O núcleo decision o que cada golpe faz e devolve eventos; este pacote desenha: amassados 互联网档案馆的存檔,存档日期2013-12-02 rrtices, furos de bala e rachaduras, 碳化物 e brilho de calor, derretimento e poças, spartos com física leve, peças soltas e partículas (英语) (fogo、fumaça、faíscas、poeira、cacos、lascas)。 (原始内容存档于2018-10-21) (英语). Geometria e materias só são channados na primeira mudança visual de uma malha, e restore 编号 : clear (原始内容存档于2018-03-29). devolvem os gromais. 制片人não toca nada: o jogo Recebe craves (英语:impact_metal, (中文(简体) ), shatter_glass, (中文(简体) ), burn_loop, (中文(简体) ), burn_end,(...) 他们 onSound· ; createDestructionSound(engine) 儿子们不 game-audio (儿子们多斯·马特里亚伊斯·达·克纳·德·阿尔特, o estouro do jogo, o laço de moso e a tabela chave-som, trocável).

乌索: specFromObject3D(THREE, modelo) gera a e specialação e o mapa parte - > malhas; registre no munto com 互联网档案馆的存檔,存档日期2013-12-04 world.add(spec),lige com (英语) renderer.bind(id, modelo, { parts }) 电子 chame world.update(dt) 电子 renderer.update(dt) 卡达四郎 科姆语 quality: 'low' os 或 oçamentos de (原始内容存档于2018-10-25) (英语). partículas e spartos caem pela medade.

版本与发布记录

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

版本发布日期距今
0.15.4latest2026/11/041 天前
0.15.32026/11/041 天前
0.15.22026/11/041 天前
0.15.12026/11/042 天前
0.15.02026/11/042 天前
0.14.02026/11/042 天前

关于 @adatechnology/game-destruction-three 的常见问题

@adatechnology/game-destruction-three 是什么?

三.js 用于 @adatechnology/game- destruction的渲染器:凹口、孔口、焦炭、发热、熔融、碎片、松散的碎片和集合粒子(火、烟、火花、灰尘、硬块、碎片).

如何安装 @adatechnology/game-destruction-three?

在项目目录运行 npm install @adatechnology/game-destruction-three,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:three(^0.160.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@adatechnology/game-destruction-three 支持 TypeScript 吗?

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

@adatechnology/game-destruction-three 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@adatechnology/game-destruction-three 可以商用吗?

@adatechnology/game-destruction-three 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@adatechnology/game-destruction-three 的下载量有多少?

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

@adatechnology/game-destruction-three 还在维护吗?

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