Siphon memo 7 - ViewMap I/O
Freestyle の ViewMap の入出力についてのメモ。
Freestyle は入力された 3D モデルから生成される ViewMap について入出力 ViewMapIO.cpp が用意されている。ただ、Python API から style modules に入力する ViewMap を変更したりするのは難しそうである。その理由は Freestyle の Operators()
の Python API からは描画処理で使用する stroke や chain などのコンテナの getter しか用意されておらず setter が無いためである。
TODO
Freestyle から生成した ViewMap をそのまま入力ベクトルとして GPLVM に与えることは難しそうである。ただ、出力の strokes を使えば manifold が作れそうである。これからやることは、
a) ベジエ曲線化
これは freestyle.shaders.BezierCurveShader
を用いれば良い。自前で polyline から bezier にする場合は permissive な license で公開されている FitCurves.c などを参考にする。
b) 制御点を同一に
入力データの次元数を同一にしないと latent manifold の計算を行うことができない。最近 Blender に搭載された Curve Decimate (D2070) を参考にする。
c) パーツ配置の latent manifold 化
3D モデルを NPR で 2D イラストレーションらしくレンダリングしても 3D っぽさが残ってしまう理由の一つは、人間が描く際、局所的にパースを自由自在に変化できることが大きく関係しているのではないかと考えている。解決方法としては、複数フレームにおける左目と右目などのパーツの 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 的に難しいだろうなという気がしている。余裕があるかぎり様々な実験ができればと考えている。