2018-01-21

Siphon memo 7 - stroke manifold

Freestyle の ViewMap の入出力についてのメモ(間違いがありましたらご指摘いただければ幸いです)。

Freestyle は入力された 3D モデルから生成される ViewMap について入出力プログラム ViewMapIO.cpp が用意されている。Blender にも確かにソースコードの断片が含まれているが Blender からは ViewMap の入出力について UI からは cache 以外ほとんど考慮しない設計になっていて、ほとんど使われていないように見える。

Blender Freestyle のソースコードを読んでみた限りでは、この入出力パイプラインの入力を Blender Python API 上ですり替えることは難しそうである。その理由は ViewMap 内部にある stroke や chain などのコンテナに対して Python API では Operators() を通じ getter しか用意されておらず setter が無いためである。ただ、これは Python Object を通じて ViewMap の様々な属性を変換する手間を考えると computational resource 的に有利な実装と言えると考える。

TODO

Freestyle から生成したストロークを使えば manifold が作れそうである。これからやることは、

a) ベジエ曲線化

これは freestyle.shaders.BezierCurveShader を用いれば良い。自前で polyline から bezier にする場合は permissive な license で公開されている FitCurves.c などを参考にする。

b) 制御点を同一に

入力データの次元数を同一にしないと latent manifold の計算を行うことができない。最近 Blender に搭載された Curve Decimate (D2070) を参考にする。

c) パーツ配置の latent manifold 化

どんなに 3D モデルを NPR でレンダリング しても 2D のイラストレーションに近づけない理由の一つは、humanistic 2D rendering で局所的にパースを自由自在に変化できることが大きく関係しているのではないかと考えている。解決方法としては、複数フレームにおける左目と右目などのパーツの translation, rotation, scale (rigid transformation) を feature に取り、latent manifold として操作すれば 3DCG であっても二次元的な操作が可能になるのではないかと考えている。

d) その他、後でやりましょう的な

個人的に興味があるのは、GPLVM に与える入力ベクトルの構成である。Freestyle から得られる情報は occuluding (occuluded) surfaces や 2D Curvature, 2D (3D) Normal そして Quantitative Invisibility (qi) と多種多様である(そしてそれがエンジニアから見た Freestyle の魅力の一つでもある)。ストロークの情報だけでなくこれらの情報を利用すれば、生成モデルを通して temporal coherence の問題、さらには二次元と三次元の断絶をある程度緩和することができるのではないかと考えている。

Temporal coherence の問題については GitHub の freestylesvg リポジトリ の初音ミクの動画を見れば、線がチカチカしていたりと不自然さがなんとなく分かるのではないかと思う(ただ stroke ではなく region であればなかなかうまくいくのでは、とも感じる)。商用だと Pencil+ 4 などの高品質な製品があり、Blender にもこのようなプラグインが欲しいという要望を見かけることもあるが、GPL 的に難しいだろうなという気がしている。

Next → Page 1 of 7