@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_progress | unscrew (喉咙) | |
ignite 编号 : extinguish 编号 : burnout | 从地上放出火和烟雾 part.burning; 喷出后蒸发; 烧出后起灰; 将颜色浸入材料 charColor状态 ashes 隐藏部分,留下一堆灰烬 | ignite, (中文(简体) ), burn_loop, (中文(简体) ), extinguish |
热量(damage 或任何发热部分) | 发送 heatColor(temperature) 用于材料 visual.glows | |
melt | meshes 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 编号 : high | low |
|---|---|---|
颗粒( 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.