6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Houdini ApprenticeAdvent Calendar 2020

Day 8

おじいさんの亡霊を制作する上でつまずいたところなど

Last updated at Posted at 2020-12-07

概要

Houdiniでおじいさんの亡霊FXを作っていく中で、
つまずいたところや思ったことなどを書きたいと思います。

作例

Grandpa Ghost V001.gif
※Glowはコンポで足してます。

hip

https://www.dropbox.com/s/j4kvzeei3kofs8a/Grandpa_Ghost_forShare.zip?dl=0
※おじいさんの写真は権利関係のため付属しません。代わりにかわいいイラストを入れてます。
image.png

##環境
Houdini Indie 18.5.351

下準備 - 写真を加工する

まずは亡霊化したいお好みの写真を、Houdiniで使いやすいように加工していきます。
Fotolia_52825114_M.jpg

自分は今回、なんでか知らないけどむかし購入していたおじいさんの写真素材を使うことにしました。
ただ人物に限らずハンバーグとかでも楽しいと思います。

用意できたらテクスチャとして扱いやすい形にしていきましょう。手順としては以下の3つです。

  • 背景を消す
  • 1024px * 1024pxなど2の累乗の正方形の解像度にする
  • カラー素材とマスク素材の2つ用意する
    image.png

中心のおじいさん

ここからHoudiniでの作業になります。まずは亡霊の中心に立つおじいさんを制作します。
この作業で目指す状態とノードはこのようになります。
image.png

もうなんの説明もいらないほどシンプルなネットワークです。
なのでここではつまずいた部分、疑問に思った部分に絞って書きます。

HoudiniのプリミティブオブジェクトにはUVがない

まず不思議に思ったのは、GridやSphereなどのプリミティブオブジェクトが
初期値でUVをを持っていないことでした。
image.png
左:Gridだけ。UVなし。
右:UV TextureをつなげてUVを生成したもの。

このようにGridの後にUVTextureノードを接続して明示的にUVを作成しないと、
Materialを適用してもTextureが表示できません。

なぜ最初からUVを持っていないのか?

これ、ある程度Houdiniに慣れると気にもしなくなるんですが、
Mayaなど他CGツールに慣れていると「なんで?」となります。はい、なりました。
作成時にUVもあるのが当然の世界で育ってきたので…。

じゃあなぜHoudiniではいちいち作成する必要があるのかというと、
個人的には**「使わないかもしれない情報は無闇に持たさない」**のが理由だと思っています。

MayaではUVはUVエディターを開いたときだけ見える情報ですが、
HoudiniではUVやPositionなどの情報(Attribute)を駆使して作業していきます。
そのときに使わない情報がたくさんあると、必要な情報を見つけづらいし、
データとしても重くなったりするからじゃないかなー、とおじさんは思います。

Textureが逆さまになる

Material Paletteからconstantを作ったら、mat階層でそのconstantの
Color MapとOpacity MapそれぞれにTextureを適用します。
これでおじいさんが画面に出るはず。しかしなぜか上下逆さまです。なんで?
image.png

Gridの起点とUVの起点が違う

Point Numberを表示するとなんとなく理由がわかりました。
Pointの開始番号0が、Viewでは左上から始まってるのに対し、UVでは左下から始まっています。
image.png

つまりView上では逆から見ている、ということなので、UV Transformノードで反転すれば解決します。

image.png

ただなぜGridが左上基準なんでしょうか?
この辺り深すぎる理由がありそうなので今回は考えないことにします。誰か教えて!

View上でAlphaが抜けない場合
constantノードのOpenGLタブから、Use Lightingをオン、 OGL Alphaを1以下(0.999とか)にすると解決することがあります。 それでもダメな場合は、Enviroment LightなどLightを1つ追加すると直ることがあります。

これに関しては理由はわかりません。これも誰か教えて!

image.png

亡霊のおじいさん

それではメインの亡霊おじいさんの制作に入ります。
最終的な状態はこのようになります。
image.png
これまた逐一手順を書いていくとめちゃくちゃ長くなるため、
作業してて注意が必要だった点、ハマった点について書いていくことにします。

VOPでUVを参照するときは、UVをPointに持たせておく

おじいさんの根本をすぼませて幽霊のような形状にするのに、
VOPでUVを参照してPointを操作することにしました。
そのためにまずUV Textureで重要な設定があります。

image.png

これをするとUV TextureノードのAttributeがPointに生成されます。
初期値ではVertexになっているので変えておきましょう。

なぜかというと、Pointを操作するために作ったVOP(Point VOP)では
基本的にPointのAttributeを参照するためです。
Vertexを参照することもできますが、ひと手間かかることになります。
今回は単なるUVの参照なのでシンプルにしておきます。

これ滅多に忘れないとは思うんですが、Texture表示のためだけに
作ったUVで作業していると意外と忘れます。
そうなると「UV持ってるはずなのになんでぇ!?」と
鼻水垂らしながら叫ぶことになるので気をつけましょう(経験談)。

※Point操作でUVを使った後は、Vertexの方にUVを戻したほうがTexture表示という本来の用途からすると正しいかもしれません。

**湧き上がる「最初からPointにUVを持たせておけばいいのでは?」という疑問**
これは会社のHoudiniマスターに教えてもらって初めて自分でも納得できた話なんですが、 通常はVertexに持たせておくほうがいいそうです。

なぜかというと、Mayaとかほかソフトが通常そうだから…というのもありますけど、
一番の理由は”PointだとUVをカットできない”からです。

image.png
pigheadはVertexにUVを持っている。

image.png
Attribute PromoteでUVをPoointに移すともうグチャグチャ。

Pointは1つのPointに常に1つのため分離することが出来ません。
なのでUVをカットすることが出来ないんですね。へぇ~。

Textureを逆さのままにしてる理由

中心のおじいさんの制作では入れてたUV Transformを外してあるので、Textureは反転したままになってます。
これについてはPathDeformerのForward Directionがデフォルトで+Z方向なのが理由です。

image.png
これは+Z方向を前方としてPathに沿うということなので、
いまおじいさんがひっくり返っても、Pathに沿ったときは上になってくれます。
image.png
これがもし中心のおじいさんと同じ様に180度反転していたら、
逆さまになってしまいます。そんなおじいさん見たくない。

もちろんForward Directionを-Z方向にすれば反転した状態でも問題なくPathに沿ってくれます。
が、パッと見で分かりにくいところにあるパラメータを変更するのは、
他人、とくに数カ月後の自分をワナに嵌めやすいため、
なるべくデフォルト値を保ったほうがいいかなあと思います。

数式があるならVEXの方が作りやすい…気がする

Spiral.gif
おじいさん亡霊を添わせる螺旋カーブは、ある程度自由に形が作れて調整可能にしたかったので
VOPで作ることにしました。

PointのX座標とZ座標を三角関数、Y座標はptnumで値を乗算すればいけそう。
式にするとこんな感じです。

P.x = cos(radians(ptnum * frequency + offset)) * amp
P.y = ptnum * 数値
P.z = sin(radians(ptnum * frequency + offset)) * amp

これをVOPで再現するとこうなりました。
image.png

VEXだとこうなります。
image.png
VOPの方がやりやすそうだから、という理由で最初はVOPで組んでいましたが、
「式を再現するにはどういう順番で並べればいいんだっけ?」となりがちで結構苦労しました。
それに対してVEXは式そのものを書いてしまえばいいので分かりやすかったです。

もちろん慣れの問題もありますが、あれこれ組み替えて結果を試すときはVOP、
再現したい式がそもそも分かってる場合はVEXの方がいいのかなーという印象です。

反省点

Pathに添わせた後の、回転して時間をずらすforLoopの処理をしてますが、
すぐ重くなってしまうので、もっと他のやり方があるような気がします。
100人ぐらい出すとタイムスライダはほぼ動きません。
image.png
1000体ぐらい亡霊を出せるように、この辺りも次回までの課題としたいですね。

おわりに

元々仕事で覚えたことの復習のために、手持ちの写真素材でなにか作れないかなーと思ってたら、
いつの間にかおじいさんの亡霊を作っていました。

Houdiniはハイエンドなエフェクトやプロシージャルモデリングという印象はありますが、
こういうのも作れる(作るやつがいる)と思っていただけたら幸いです。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?