2022/7/20(水)

一日かけてモデルのスキン変形の方法を勉強した。

最終的にKhronos Group公式のglTFチュートリアルとSascha Willems氏による実装を見るのが一番ためになった。

https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_020_Skins.md

https://github.com/SaschaWillems/Vulkan-glTF-PBR/blob/a9e9df7d2390a24d9066b123229a534ed923d9fa/base/VulkanglTFModel.cpp#L346-L385

https://github.com/SaschaWillems/Vulkan-glTF-PBR/blob/master/data/shaders/pbr.vert#L40-L47

全体的な理解にはかなり苦労したが、結局のところ大雑把にまとめれば

  1. inverseBindMatrixでモデル空間における座標をボーンローカル座標空間の座標に直す
  2. その中で回転なり移動なり
  3. ボーンローカル座標空間上の座標を親ボーンローカル座標空間に直す
  4. 2-3を再帰的に(子から親の順番で)繰り返し最終的にモデル空間における座標にする

という感じらしい。3.の工程の仕組みがまだ今一つ理解できないが、大枠は理解できた。

明日以降実装しようかと思っているが、実装できたとしてデモとして分かりやすいアプリケーションに落とし込むアイデアがあまりない。どうしよう。


今日解いた競プロの問題。

ABC144-A: f(x)=Nとしてf(2x)の値の最大化を考えると、x→2xのところで繰り上がりは無いほうが有利だなという話になる。よってxの各桁の数字は4以下となる。で、各桁4以下でさえあればf(2x)は2Nであってどう頑張ってもこれ以上にはならない。ということでM=2N。

次のxを最小化するところだが、この時点でそもそも各桁4桁以下という縛りがある。桁数は少なければ少ないほど良いはずなので、各桁の数字は大きいほど良い。ということで出来るだけ4とし、1,2,3が余ったら頭に付ける。同じ桁数の数字なら当然上の桁が小さいほうが小さくなる。

ABC205-Eの解説を読んだ。自力でなんか二項係数の削り落としみたいな感じの式は出せたが、これをどう高速に解くのか分からないので解説を読んだところ、カタラン数なる数列があるらしかった。それなりに応用範囲の広い話らしい。


今日摂取したコンテンツ。

https://note.com/anno_kgrzk/n/n0e1d7abbf03b

面白い取り組みだと思った。VR空間に国境の壁はなくても言語の壁はあるので、そこに人工言語を持ってこようという発想はなかった。

Categories: