LoginSignup
2
1

More than 3 years have passed since last update.

FBX SDK(Python)でunityちゃんを解析し、WebGLでアニメーションする!(WebGL編)

Last updated at Posted at 2020-05-17

FBX SDK(Python)でunityちゃんを解析し、WebGLでアニメーションする!(WebGL編)

本記事は、FBX SDK(Python)でunityちゃんを解析し、WebGLでアニメーションする!の記事の、WebGLでスキンメッシュアニメーションを実装する記事になります

WebGL 開発支援サイト webgl.orgを読んで、「ポリゴンのレンダリング」「テクスチャマッピング」「アルファブレンド」のやり方を理解する

正直な話、WebGL 開発支援サイト webgl.orgを読んでいれば、前回のFBX SDK(Python)を使って、unityちゃんのfbxを解析するの情報だけで、スキンメッシュアニメーションを実装できるようになっているかと思います

最終目的である「unityちゃんのfbxファイルを、Python版のFBX SDKを用いて解析し、WebGLにおいてスキンメッシュアニメーションを再生する」において、fbxファイルから必要な情報を抽出できるようになった時点で、これ以降に躓くようなポイントはほぼないでしょう...

なので、まずはWebGL 開発支援サイト webgl.orgを学んで、「ポリゴンのレンダリング」「テクスチャのマッピング」「アルファブレンド」が出来るようになってください

そこまで理解できれば、unityちゃんのモデルをWebGLで表示できるはずです

注意点: unityちゃんの「cheek」のメッシュは最後に描画する

WebGL 開発支援サイト webgl.orgを読んでも解決しないと思われる問題があります

「cheek」のメッシュがこんな感じの見た目になっちゃう問題です...
チークのメッシュが真っ黒

結論いうと、「cheek」のメッシュを最後に描画するようにすれば解決します
理由は良く分かりません...
(Z値が同一なので、描画順によってαブレンドがうまくいっていないとか?)

スキンメッシュアニメーションを実装する

スキンメッシュアニメーションに関しても、「〇×(まるぺけ)つくろーどっとコム」さんの「FBX習得編」その9 ボーンの情報を取得するに書いてある通りにすれば実装できるので、ほぼ説明することはありません...
「ボーンの初期姿勢の逆行列」「ボーンのフレーム時姿勢」は既に取得できているので、これを掛け合わせた「ボーン行列」を毎フレーム計算すればいいだけです

注意点...というほどではないですが、WebGL 開発支援サイト webgl.org minMatrix.jsと座標変換行列で解説されている通り、WebGL(OpenGL)では、「列オーダー」になっているので掛け合わせる順序が逆になることには気を付けましょう

ボーン行列の計算のサンプルコード(イメージ)

var boneMatrix = [];// 計算後のボーン行列

for(var boneIndex; boneIndex < boneMatrix.length; boneIndex++>){
    var inverseInitMatrix; // 初期姿勢の逆行列
    var frameInfo;// フレーム時の姿勢行列

    // 書ける順番が逆順になっている
    m.multiply(frameInfo, inverseInitMatrix, boneMatrixs[boneIndex]);
}

このようにして計算したボーン行列をuniform変数としてシェーダに渡せば、スキンメッシュアニメーションが再生できます

難しい話は特にないと思いますが、私の最終的な頂点シェーダのコードを載せておきますので、分からなくなってしまったら、この頂点シェーダを実行できるようにattribute変数やuniform変数をbind出来るように試行錯誤してみるとよいかもしれません

頂点シェーダのサンプルコード
<script id="vs" type="x-shader/x-vertex">
    // unityChanメッシュの最大値が 108なので、それが収まるような値にしておく
    const int boneMatrixNum = 128;

    attribute   vec3 position;// 頂点
    attribute   vec2 textureCoord;// uv座標
    attribute   vec4 weight;// ウェイト
    attribute   vec4 boneIndex;// ボーンインデックス
    uniform     mat4 mvpMatrix;// mvp行列
    uniform     mat4 boneMatrix[boneMatrixNum];// ボーン行列
    varying     vec2 vTextureCoord;

    void main(void){
        vTextureCoord = textureCoord;

        mat4 skinMeshMatrix = (boneMatrix[int(boneIndex[0])] * weight[0]) + (boneMatrix[int(boneIndex[1])] * weight[1]) + (boneMatrix[int(boneIndex[2])] * weight[2]) + (boneMatrix[int(boneIndex[3])] * weight[3]);
        vec4 pos = skinMeshMatrix * vec4(position, 1.0);
        gl_Position = mvpMatrix * pos;
    }
</script>

まとめ

以上、FBX SDK 2017(Python版)を使って、unitychan.fbxから抽出した情報を用いて、WebGLでスキンメッシュアニメーションを再生する方法について説明しました

説明した...と言いつつ、ほとんどWebGL 開発支援サイト webgl.orgを読んでもらうように勧めただけですが...

これで、unityちゃんをWebGLでアニメーションさせられるようになりました!
アニメーションする動画

備考

本記事の内容を実際に私が作成した際のソースコードを一応GitHub公開していますので、必要であれば、ご確認ください

ソースコード

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1