メインコンテンツまでスキップ

Native API

Native API は、scene、listener、source、mesh、BVH を直接制御する必要がある高度な single-thread 統合向けです。一般的なアプリは Facade API を使用して ください。

import { SoundTrace } from '@exarionai/soundtrace.js';
import {
BvhType,
PathType,
UpdateType,
type MeshBuildOptions,
} from '@exarionai/soundtrace.js/native';

サポート範囲

:::warning 現在の公開型契約 @exarionai/soundtrace.js/native は低レベルのクラスと型を export しますが、現在 SoundTrace.create() の公開戻り値型は facade です。したがって createScene()createListener()createSource() などの factory を使う完全な direct-native TypeScript のエントリーフローは、まだ公開契約として提供されていません。

公開型が拡張されるまでは facade を使用してください。内部実装へのキャストや非公開の deep import はバージョン互換性を保証しません。 :::

また direct-native 制御は ST 専用です。worker-hosted MT では次の surface が SoundTraceMtUnsupportedError を送出します。

  • createScene()createListener()createSource()
  • createMesh()createObject()createCollider()
  • materialspropagatordiagnostics
  • createWorkletNode()
  • 同期 native getter

MT アプリケーションは facade と await sound.debugSnapshot() を使用してください。

オブジェクトモデル

オブジェクト役割
SoundSceneobject、source、単一の listener を所有し propagation を実行
SoundListenerlistener の pose、ray と render オプションを管理
SoundSourcesource の pose、gain、path 別オプションを管理
SoundMesh三角形ジオメトリと BLAS を管理
SoundObjectシーンの transform と mesh インスタンスを管理
SoundColliderSoundMeshSoundObject のライフサイクルを結合
MaterialTable周波数帯域ごとのマテリアルを登録
Propagatorvalid path と profile を照会
Diagnosticsray、メモリ、ランタイム診断を照会

シーンの更新

低レベルのシーンは次の順序で更新します。

scene.tick(dt);
scene.updatePropagation();

scene.update(dt) は 2 つの呼び出しを順に実行するショートハンドです。

シーンの listener は 1 つです。

scene.setListener(listener);
scene.addSource(source);
scene.addCollider(collider);

ジオメトリの変更

変更APIupdate type
transform のみ変更object.setPosition(...) などobject の状態に合わせて更新
頂点のみ変更mesh.updateVerticesAndRefit(...)UpdateType.Refit
トポロジーまたは BVH オプションの変更mesh.setData(...)UpdateType.Rebuild

refit はトポロジーが保たれるアニメーションジオメトリ(skinned animation、procedural 変形)に 使用します。このパスは refit 可能な LBVH 系と組み合わせてください。

頂点の更新は core の exaMeshUpdateVerticesexaMeshRefit という 2-call protocol です。 mesh.updateVertices() は頂点をアップロードするだけで BVH を refit しないため、両方を行う mesh.updateVerticesAndRefit() を使うか、自分で mesh.refit() を呼んでください。頂点数は build 時と完全に一致している必要があります。

mesh.updateVerticesAndRefit(vertices); // updateVertices + refit
object.setUpdateType(UpdateType.Refit);
scene.tick(dt);

SoundCollider を使うと 2 つのステップを 1 回で処理できます。

collider.refitVertices(vertices); // updateVerticesAndRefit + setUpdateType(Refit)
scene.tick(dt);

トポロジーが変わる場合は rebuild を明示します。

mesh.setData(vertices, triangles, buildOptions);
object.setUpdateType(UpdateType.Rebuild);
scene.tick(dt);

collider.rebuild(vertices, triangles, buildOptions) が同じ組み合わせを実行します。

BVH の選択

タイプ用途
BvhType.HKDtree壁や床などの静的ジオメトリ
BvhType.LBVH頂点が頻繁に変わるジオメトリ
BvhType.LBVH_SIMD*SIMD 幅を明示した LBVH
BvhType.LBVH_NWAY*N-way LBVH

BvhType.Default は per-mesh でエンジン既定値に従う sentinel です。プロセス全体の 既定値を決めるときは具体的な BVH タイプを使用してください。

const buildOptions: MeshBuildOptions = {
bvhType: BvhType.HKDtree,
bvhMaxDepth: 0,
primPerLeaf: 0,
};

オーディオ

Native のリアルタイムレンダリングも AudioWorkletNode を使用します。基本契約は 次のとおりです。

  • サンプルレート: AudioContext.sampleRate
  • ブロックサイズ: 128 samples
  • 出力: 2 チャンネルのバイノーラル

facade の source.play() がこの設定と graph 接続を管理します。direct-native の createWorkletNode() は、公開 factory 型が提供されたあとにアプリケーション コードで使用することを推奨します。

診断

必要な情報FacadeNative ST
valid path と profileawait debugSnapshot()Propagator
ray とメモリ統計await debugSnapshot()Diagnostics
アプリが設定した poseエンティティの状態native object getter

MT では propagation の結果を同期 getter で読まないでください。

関連ドキュメント