モーフィングとは
モーフィングとはアニメーション技術のひとつで、ベースモデルに時間に合わせてスケールさせた変位を足すことにより、ベースモデルから変位モデルへのアニメーションが実現できる。
https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%83%B3%E3%82%B0
他のアニメーション手法にスキンメッシュアニメーションがあるが、モーフィングはボーンの構造に依らずアニメーションを行うことができる。
表情の変化など小さな領域のアニメーションを得意としているように思えるが、オブジェクト全体が動くような規模のアニメーションには向いていないように思える。
実施例
モデル
https://sketchfab.com/3d-models/yard-grass-3a67e76decc849c694c228eb590a9902
ライセンス:CC Atribution
https://creativecommons.org/licenses/by/4.0/legalcode
使用ライブラリ
tiny glTF
https://github.com/syoyo/tinygltf
glTFファイルのローダーとして使用している。
仕様書
khronos公式
https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html
構造
- 緑:float
- 赤: vec3
四角の中の文字は個数を表している。
- t : target数
- p : positon数
- k : key frame数
key frame $k$での1番目の頂点( $p_0$ )の座標は
p_0 = p_0 + \sum_{tatget = 0}^{t}p_0.{target} * w_{k}.target
で計算できる。
ここで$p_0.target$とは、各targetにある$p_0$のことである。$w_k.target$とは、outputのうち$k$番目の集合にはtの数だけweightが含まれているので、その中のtarget番目のweightのことである。
これを頂点の数分行う。
感想
実装時には、この計算方法を見つけることとはまったく別の部分で躓いた。
ご覧の通りデータをすべてバッファーに詰めようとすると、float換算で3 * position数 * target数分のデータが必要になるので、1つのバッファーに詰めると膨大な数のデータ量になる。
このバッファーを用意したが、なぜかvec3でアクセスすると正確に値が取ってこれなかった。
バッファーの中身がfloatであるとしてアクセスすると読み取れた。
Git Hub
何かの参考になれば。
https://github.com/kodai731/Aqoole-Engine-Android-Vulkan-Rendering-Engine-:title