yushimatenjin / playcanvas-vrm

https://github.com/yushimatenjin/playcanvas-vrm-viewer
2 stars 0 forks source link

VRM実装項目リスト #2

Open emadurandal opened 2 months ago

emadurandal commented 2 months ago

実装項目リストを作成してみました。

VRM 0.x

VRM 1.0

VRMA (VRM Animation)

yushimatenjin commented 2 months ago

ありがとうございます!PlayCanvasの機能で関連がありそうな部分を少し羅列させていただきます。

マテリアルの書き換えはカスタムシェーダーの機能がある

// this.app.graphicsDevice.scope.variables
pc.app.graphicsDevice.scope.variables

実行結果

Shader Chunkとして、StandardMaterialを拡張する機能が存在しています。例えば、Diffuse / Emissiveなど、StandardMaterial特定のシェーダーを書き換えができます。

// 例 Emissiveのチャンクを書き換え
const material = new pc.StandardMaterial()
material.chunks.APIVersion = pc.CHUNKAPI_1_55;
material.chunks.emissivePS = emissivePS // 書き換えた後のチャンク
material.setParameter('iGlobalTime', 0);
material.update();

( サンプル/ コード )

const render = pc.app.root.findByName("Face").render; // Renderコンポーネントを取得
const meshInstance = render.meshInstances[0]; // メッシュインスタンスを取得
const morphInstance = meshInstance.morphInstance; //  モーフインスタンスを取得

const key = 1; 
const weight = 0.5;
morphInstance.setWeight(key, weight) // モーフの操作
emadurandal commented 2 months ago

ありがとうございます。

シェーダーに関しては、カスタムシェーダーでやっていくことになりそうですね。 いずれはWebGPUへも対応しないといけないと思うのですが、PlayCanvasの場合はシェーダーコードのGLSL/WGSL両対応のための仕組みなどあるのでしょうか。それともそれぞれ書かないといけない?

モーフに関しては、その機能を使うことになりそうですね。VRMのモーフは、glTFにおける複数のMeshを組み合わせたモーフになります。

揺れ物に関してですが、ammo.jsを使わずにVerlet積分による物理計算を自前で実装することになると思います(それほど複雑ではないです)。

yushimatenjin commented 2 months ago

ありがとうございます!

WebGPUへの対応についてみ

PlayCanvasの実行時にglslangと、twgslというライブラリを使用してトランスパイルがされるようです。現状、カスタムシェーダーを作成した場合にもデバイスのタイプがWebGPUで実行されている場合にはトランスパイルが実行されます。

.wgslを直接利用をしていることもありますが、現状は、多くがこのトランスパイルで対応をされているようです。こちらの、Examplesでは、 ( createShaderFromCode ) にはES 3.0のシェーダーコードのみが渡されています。

WebGPUで実行をしている場合には、transpileのコードにてWGSLに変換されているようになりますね。

スクリーンショット (トランスパイル後のシェーダーコード)

transpile

yushimatenjin commented 2 months ago

.vrma の形式についても現状の確認をしています。.glbへリネームをして、PlayCanvasのGlbParserで読み込みを行いました。

スクリーンショット

chrome-capture-2024-7-5

chrome-capture-2024-7-5 (1)

VRMAは1.0用だと思いますが、0.0と並べて確認をしています。 現状のGlbParserでアニメーションの再生すると髪の毛のボーン周りはうまく処理されないようです。 (揺れ物の影響・・?)

emadurandal commented 2 months ago

検証ありがとうございます。

VRM0.xで変なポーズになっているのは、主にはVRM0.xのキャラの向きがVRMAアニメーションの向き(VRM1.0想定)とは逆だら、というのと、ローカル軸の有無が影響している可能性があります。

また、VRMA_01~04がアニメーションが動くのに、VRMA_05以降がまったく動かないのは、ボーンの一致不一致の問題だと思います。VRMA_01~04が動いたのは、おそらくたまたまボーン番号が適用先のモデルと一致していたためだと思います。そのVRMAサンプルは私もだいぶ調べたのですが、VRMA_05以降はVRMA_04までとボーンの構造が違うんですよ。

なので、Humanoid情報とのマッピングが必要ですね。

髪の毛については、そうですね。揺れ物ボーンは別途で対応が必要だからでしょうね。