LoginSignup
2
0

More than 1 year has passed since last update.

[Animation] glTF モーフィングのデータ構造と計算方法

Posted at

モーフィングとは

モーフィングとはアニメーション技術のひとつで、ベースモデルに時間に合わせてスケールさせた変位を足すことにより、ベースモデルから変位モデルへのアニメーションが実現できる。
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

構造

image.png
データ形式

  • 緑: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

2
0
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
0