フリーハンドでジオメトリノードなオブジェクトを這わせる
Geometry Nodesを使うとシンプルな手順で派手なものが作れるようですが、なかなか自分で「こうしよう」と思ったものは作れないでいます。しくみがまだまだ理解できていません。
タイトルの意味がよくわかりませんが、今回はジオメトリノードを使って、フリーハンドで描いたカーブ上にオブジェクト(インスタンス)を生やし、それを別のオブジェクトに這わすというのをやってみます。
こういうことです。
ではスタート。
かがやくオブジェクト
生やすオブジェクトを作ります。なんでもいいんですが、Blenderで作るので、Blenderロゴっぽくかがやくオブジェクトにしようと思います。名付けて「ブレンダのかがやき君」。
[Add] - [Mesh] - [UV Sphere]
でUV Sphereを作り、マテリアルを貼って、Shader Nodeで整えます。シェーダーノードは、基本的なところはわかるものの、テクスチャ座標など細かなところのしくみがまだよくわかってなかったりします。とりあえず今回は見た目がそれっぽければよしということで、こんなノードにしました。
かわいい。
カーブを準備
今作ったかがやき君は少し横によけておき、[Add] - [Curve] - [Bezier]
で新たにベジェカーブを作ります。このカーブ上にジオメトリノードを設定して配置していくことになります。長さはあとで変えるので、今はデフォルトのままにします。
かがやくジオメトリーノードカーブ
Curveのモディファイアープロパティで、[Add Modifier]-[Geometry Nodes]
を選びジオメトリノードを追加します。ここからは上部のGeometry Nodes
タブを選んで作業します。
インスタンス配置
まずは、InputとOutputの間にInstance on Point
ノードをはさみ、そこのInstance
端子にかがやき君のObject Info
ノード(かがやき君のオブジェクト名はSphere
)をつなげます。オブジェクトノードは、メニューから追加してオブジェクトを指定することもできますが、アウトライナーからドラッグ&ドロップすると簡単に追加できます。
かがやき君は、「ポイント」と呼ばれるカーブ状の位置に表示されます。そのままだとかがやき君が大きすぎたので、Scaleを0.2に下げてます。それとデフォルトではポイントの位置が適切でないので、カーブの長さに合わせてポイントを再配置する Resample Curve
ノードを挟み、かがやき君同士が少し重なる程度の密度にLength
を調整します。
回転と拡縮
かがやき君が皆同じ方向を見てしまっているので、これをランダムに回転させます。回転は、Instance on Points
ノードのRotation
端子にRandom Value
ノードをVector
としてつなげることでできます。Vector
を選ぶことで、値がx,y,zの3軸分出力されます。Rotation
端子は、ドット付きのひし形端子なので、ポイントごとに処理が行われます。
ランダムの値は、x,y,zそれぞれの軸において、0度~360度なわけですが、ここではラジアンで入力するので、360度=2π=6.283となります。入力するときはtau
あるいは2*pi
と打つと、自動的に変換してくれます。tauは360度を表す単位で覚えておくと便利です。
大きさも少しランダムにします。先程、Scale
を0.2
倍に統一しましたが、Rotation
端子同様Scale
端子もRandom Value
ノードをつなげます。ここでは、0.15~0.25倍としました。少しかがやき君同士がくっつきすぎていたので、Resample Curve
ノードの値も、0.3m
に伸ばしました。
ノードはこれで完成です。パスを伸ばしたりすると長さに応じてかがやき君が増殖します。
フリーハンドでオブジェクトをかがやかせる
カーブは、フリーハンドで描ける機能があります。カーブのオブジェクトを選択した状態で、Tab
キーを押してEdit Mode
に入り、左に並ぶアイコンのDraw
を選択します。
また、別のオブジェクトの表面上に描くことができるように、オプション(右側に表示されていなければn
キーで表示)からTool
-Depth
でSurface
を選択しておきます。
この状態でマウスでドラッグすると、描いた線のうえにかがやき君がぶわーっと登場してくれます。また、別にオブジェクトを作り、その上に描くこともできます。サルを追加して、その上に描いてみました。
なかなかにキモいですね。よくできました。
ジオメトリノードは、大量のオブジェクトを効率よく生成したり、プロシージャルに複雑なことができたり、アニメーションが計算だけでできたりと、様々な可能性が感じられて楽しいです。なかなか各ノードをどう組み合わせると何ができるのかが理解しきれてないので、もっと勉強してみたいなと思います。
絵が描けないのに手描きアニメーションをつくる
昔「グリー・スペンシル」だと思ってた
新しく出た v2.83 はグリースペンシルが1から作り直されたそうで、いい感じになってるらしいですね。でも、グリースペンシルで絵を描くには、絵を描かないといけないわけです!(当たり前)
でも、Blenderには昔から 3Dオブジェクトモデルの輪郭を描いてくれる Freestyle という機能がありました。これを使えば、絵が描けなくてもイラストちっくなものが描けてしまうわけです。すごい。
その Freestyle なんですが、これまた v2.83 から「レンダーパス」に単体で抽出できるようになったようです。つまり、オブジェクトの線画だけで出力できるようになったと。これを使ってみようと思います。
まずは、サルの周りに円形カーブをおいて、カメラがサルを撮りながらカーブに沿って1周するステージを作成。
Freestyleを設定していく 手描き風で
Freestyleを使うには、レンダープロパティの「Freestyle」左のチェックを入れる。
これでレンダリングしてみるとこうなる。モデルに線画がついているけど、この線画だけを抽出しようと思うと、今まではマテリアルを透明にするなどして調整が必要だった。これが、今回簡単になる。
次に、ビューレイヤプロパティで線画のスタイルを設定する。いろいろできること多くて、細かい設定方法は全然理解できてないので、またそのうち…。
手描き風にするために、ストロークの形状を変えてみる。Freestyle Line Style
を開き、Stroke
~Texture
のボタンが並んでる中で、Geometry
を選ぶ。ここだけUIが他と違う感じでわかりづらいけども、これはタブみたいなもの。選ぶと下部にオプション設定が出てくる。
Add Modifier
ドロップダウンから、Bezier Curve
とSpatial Noise
を選んでみた。他のもいろいろおもしろい効果が出てくるので試してみるといい。Spatial Noise
のAmplitu
は振れ幅。デフォルトの5.000
だとちょっと大きすぎるので、3.000
にした。
またレンダリングしてみる。
ランダム性のあるふわっとした線画になり、手描き風になった。むしろ手描きのほうが線がきれいなぐらいにw
ここまでは、今までのバージョンでもできた。ここから先が v2.83 からの機能。
レンダリングで線画だけを抽出する
レンダーパスに登場させるためのオプションをチェックする。ビューレイヤプロパティの「Freestyle」に As Render Pass
というオプションが v2.83 から追加されているのでこれをオンにする。これで、説明にある通り、レンダリングが別のパスとして行われる。
では、レンダリングしてコンポジット画面を見てみる。Render Layers
に今までなかった Freestyle
という出力ができている。ビューアで見ると、(画像では見えづらいけども)ちゃんと線画だけが抽出されているのがわかる。
あとは好きにコンポジットすればいい。このままレンダリングすると、線画以外の部分は黒地で、ただのマックロ画像になってしまうので、Alpha Over
で緑色の下地につないだ。
で、アニメーションレンダリングしてみたものがコレ。
モノの噂によると、TVアニメは24fpsで3フレームごとというのが多いらしいので、同じ設定にしてみた。なかなか手描き風アニメっぽい感じじゃないでしょうか(フリースタイルの線幅は 1px だと細すぎたので 2px にした)。
比較用に、サルにsubdivかけてFreestyleのノイズなど消して24fpsフルフレームでも作ってみました。ぬるっとしてて、CG感がある。やっぱりアナログ感が残る方がいいな。
モノをつかんで移動して置くアニメーション
意外と見つからない「置く」
オブジェクトをつかんで他のところへ移す、というアニメーションを作ってみたい。とりあえず試してみると、キャッチして移動させるところまでは "child of" コンストレイントを使うとできた。ところが、離すときにこのコンストレイントの影響を0にする必要があり、そうするとオブジェクトが元の場所にいきなり戻ってしまう。「置く」動作ができない。
"pickup release hold drop"などのキーワードでやり方をぐぐってみたのだけど、同じ場所に「置く」(つまり、元の場所に戻すだけ)だったり、「置く」動作の時にそれっぽい位置に手動で移動させるみたいなチュートリアルがいくつかあるばかり。なんかしっくりこない。空のオブジェクトを置く位置に作って、置く際にその空オブジェクトの位置と角度をコピーするというのもあった。なんかすごそうだけど難しい。
そうだ、物理処理をしてしまえばいいのでは?
オブジェクトをアニメーションさせる際に、シミュレーションの世界で処理してしまえば、置いた位置にそのまま残るのでは?というかこれは確実に残るだろう。そこをベースにちょっと考えてみた。
まずは、適当に舞台を作る。UFOキャッチャーのアームぽいのとつかまれるサル、そして床。最初、床にも物理設定をして落とすイメージでいたけども最終的にそうしなくてもできることがわかった。
アームに他の位置へ移動させるアニメーションをつけるのだけど、その前に、サルにアームの子供になるよう Child Of
コンストレイントを設定しておく。子供にした途端、サルが親のオブジェクトとなったアームの位置や回転の状態にひっぱられて変なところにいってしまう。これを Set Inverse
ボタンを押して初期位置になおす。
で、アームに適当に位置・回転の LocRot
キーフレームを打ってアニメーションをつけた。サルは Child Of
がつきっぱなしなので、当然ずっと持ったままになってしまっているが、とりあえず今はOK。
こどもになったりこどもじゃなくなったり
ここで、サルに物理設定をしておく。[物理演算プロパティ]から Rigid Body
ボタンを押して、 Type Active
の剛体にする。ただ、物理シミュレーションをするわけではなく、アニメーションの制御は基本的にこちらでしたいので、Dynamic
のチェックをはずし、Animated
のチェックをつけておく。
ここから、つかんだり離したりする際の設定をしていく。基本的に以下の通りにする。
- つかむ:直前のフレームおよびその直後のフレームで・・・
Child Of
のInfluence
を0.000
→1.000
にする。Rigid Body
のAnimated
を オフ → オン にする。
- 離す:直前のフレームおよびその直後のフレームで・・・
Child Of
のInfluence
を1.000
→0.000
にする。Rigid Body
のAnimated
を オン → オフ にする。
画像がちょっとわかりづらいけども、これは離してる状態から掴む状態に移行するところ。左が10フレーム目で、離した状態の最後。Child Of
の影響が0(子供になっていない)で、かつAnimated
をオフにしてアニメ制御していない状態。右が次の11フレーム目で、掴む状態の最初。Child Of
の影響を1(子供にする)にして、かつAnimated
をオンにすることでアームの動きに追従してアニメーションすることができる。
離すときは、コレの逆(「つかむ」→「離す」)のキーフレームを打てばよい。んでできたアニメーションがこれ。
問題なくキャッチ&リリースができた。つかむ・離すをまた繰り返したいときは、前述の通りキーフレームを何度でも打つことができる。
物理設定、いいんだろうか
正直、物理設定(Rigid Body)をした際のコストがわからない。シミュレーションはしていないので動作が重くなることはないと思うけども、本当は最初にあげた「離すときにそれっぽい位置に移動させる」とした方がいいのかもしれない。
ただ、移動先の正確な位置や角度を見つけ出すのは若干めんどくさい。親子付けして移動されたオブジェクトは、位置などのパラメタが変わらない。なので、離す位置で Apply
(Ctrl+A) - Visual Transform
を選び一旦確定させる。すると、ツールシェルフの Item
にパラメタが反映されるので、それを「メモ」しておく。メモしたら Ctrl+Z
で動作を確定前に巻き戻して、手でメモどおりに入力していく。という方法しか思いつかなかった。
これをいっぺんにやってくれるアドオンがあった。これが一番ラクなのかも。