blender の箱を消したら

blender を覚えたい蜂砂の発見や操作メモです。オブジェクトの動かし方は覚えたので中級者を目指したい。

フリーハンドでジオメトリノードなオブジェクトを這わせる

Geometry Nodesを使うとシンプルな手順で派手なものが作れるようですが、なかなか自分で「こうしよう」と思ったものは作れないでいます。しくみがまだまだ理解できていません。

タイトルの意味がよくわかりませんが、今回はジオメトリノードを使って、フリーハンドで描いたカーブ上にオブジェクト(インスタンス)を生やし、それを別のオブジェクトに這わすというのをやってみます。

こういうことです。

f:id:beesand:20220326194925p:plain
完成形

ではスタート。

かがやくオブジェクト

生やすオブジェクトを作ります。なんでもいいんですが、Blenderで作るので、Blenderロゴっぽくかがやくオブジェクトにしようと思います。名付けて「ブレンダのかがやき君」。

[Add] - [Mesh] - [UV Sphere] でUV Sphereを作り、マテリアルを貼って、Shader Nodeで整えます。シェーダーノードは、基本的なところはわかるものの、テクスチャ座標など細かなところのしくみがまだよくわかってなかったりします。とりあえず今回は見た目がそれっぽければよしということで、こんなノードにしました。

f:id:beesand:20220326194932p:plain
シェーダーノード

かわいい。

f:id:beesand:20220326194935p:plain
単体オブジェクト

カーブを準備

今作ったかがやき君は少し横によけておき、[Add] - [Curve] - [Bezier] で新たにベジェカーブを作ります。このカーブ上にジオメトリノードを設定して配置していくことになります。長さはあとで変えるので、今はデフォルトのままにします。

f:id:beesand:20220326194937p:plain
カーブを置く

かがやくジオメトリーノードカーブ

Curveのモディファイアープロパティで、[Add Modifier]-[Geometry Nodes]を選びジオメトリノードを追加します。ここからは上部のGeometry Nodesタブを選んで作業します。

インスタンス配置

まずは、InputとOutputの間にInstance on Pointノードをはさみ、そこのInstance端子にかがやき君のObject Infoノード(かがやき君のオブジェクト名はSphere)をつなげます。オブジェクトノードは、メニューから追加してオブジェクトを指定することもできますが、アウトライナーからドラッグ&ドロップすると簡単に追加できます。

f:id:beesand:20220326194947p:plain
ジオメトリノード(途中)

かがやき君は、「ポイント」と呼ばれるカーブ状の位置に表示されます。そのままだとかがやき君が大きすぎたので、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度を表す単位で覚えておくと便利です。

大きさも少しランダムにします。先程、Scale0.2倍に統一しましたが、Rotation端子同様Scale端子もRandom Valueノードをつなげます。ここでは、0.15~0.25倍としました。少しかがやき君同士がくっつきすぎていたので、Resample Curveノードの値も、0.3mに伸ばしました。

f:id:beesand:20220326194953p:plain
ジオメトリノード(最終形)

ノードはこれで完成です。パスを伸ばしたりすると長さに応じてかがやき君が増殖します。

f:id:beesand:20220326195029g:plain
増殖するかがやき君

フリーハンドでオブジェクトをかがやかせる

カーブは、フリーハンドで描ける機能があります。カーブのオブジェクトを選択した状態で、Tabキーを押してEdit Modeに入り、左に並ぶアイコンのDrawを選択します。

f:id:beesand:20220326195019p:plain
Drawアイコン

また、別のオブジェクトの表面上に描くことができるように、オプション(右側に表示されていなければnキーで表示)からTool-DepthSurfaceを選択しておきます。

f:id:beesand:20220326195022p:plain
Surface選択

この状態でマウスでドラッグすると、描いた線のうえにかがやき君がぶわーっと登場してくれます。また、別にオブジェクトを作り、その上に描くこともできます。サルを追加して、その上に描いてみました。

f:id:beesand:20220326200547g:plain
サルに群がるかがやき君

なかなかにキモいですね。よくできました。

ジオメトリノードは、大量のオブジェクトを効率よく生成したり、プロシージャルに複雑なことができたり、アニメーションが計算だけでできたりと、様々な可能性が感じられて楽しいです。なかなか各ノードをどう組み合わせると何ができるのかが理解しきれてないので、もっと勉強してみたいなと思います。

絵が描けないのに手描きアニメーションをつくる

昔「グリー・スペンシル」だと思ってた

新しく出た v2.83 はグリースペンシルが1から作り直されたそうで、いい感じになってるらしいですね。でも、グリースペンシルで絵を描くには、絵を描かないといけないわけです!(当たり前)

でも、Blenderには昔から 3Dオブジェクトモデルの輪郭を描いてくれる Freestyle という機能がありました。これを使えば、絵が描けなくてもイラストちっくなものが描けてしまうわけです。すごい。

その Freestyle なんですが、これまた v2.83 から「レンダーパス」に単体で抽出できるようになったようです。つまり、オブジェクトの線画だけで出力できるようになったと。これを使ってみようと思います。

まずは、サルの周りに円形カーブをおいて、カメラがサルを撮りながらカーブに沿って1周するステージを作成。

f:id:beesand:20200606144214p:plain

Freestyleを設定していく 手描き風で

Freestyleを使うには、レンダープロパティの「Freestyle」左のチェックを入れる。

f:id:beesand:20200606144233p:plain

これでレンダリングしてみるとこうなる。モデルに線画がついているけど、この線画だけを抽出しようと思うと、今まではマテリアルを透明にするなどして調整が必要だった。これが、今回簡単になる。

f:id:beesand:20200606144242p:plain

次に、ビューレイヤプロパティで線画のスタイルを設定する。いろいろできること多くて、細かい設定方法は全然理解できてないので、またそのうち…。

手描き風にするために、ストロークの形状を変えてみる。Freestyle Line Style を開き、StrokeTextureのボタンが並んでる中で、Geometryを選ぶ。ここだけUIが他と違う感じでわかりづらいけども、これはタブみたいなもの。選ぶと下部にオプション設定が出てくる。

f:id:beesand:20200606144253p:plain

Add Modifierドロップダウンから、Bezier CurveSpatial Noiseを選んでみた。他のもいろいろおもしろい効果が出てくるので試してみるといい。Spatial NoiseAmplituは振れ幅。デフォルトの5.000だとちょっと大きすぎるので、3.000にした。

またレンダリングしてみる。

f:id:beesand:20200606144314p:plain

ランダム性のあるふわっとした線画になり、手描き風になった。むしろ手描きのほうが線がきれいなぐらいにw

ここまでは、今までのバージョンでもできた。ここから先が v2.83 からの機能。

レンダリングで線画だけを抽出する

レンダーパスに登場させるためのオプションをチェックする。ビューレイヤプロパティの「Freestyle」に As Render Pass というオプションが v2.83 から追加されているのでこれをオンにする。これで、説明にある通り、レンダリングが別のパスとして行われる。

f:id:beesand:20200606144327p:plain

では、レンダリングしてコンポジット画面を見てみる。Render Layers に今までなかった Freestyle という出力ができている。ビューアで見ると、(画像では見えづらいけども)ちゃんと線画だけが抽出されているのがわかる。

f:id:beesand:20200606144338p:plain

あとは好きにコンポジットすればいい。このままレンダリングすると、線画以外の部分は黒地で、ただのマックロ画像になってしまうので、Alpha Overで緑色の下地につないだ。

f:id:beesand:20200606144404p:plain

で、アニメーションレンダリングしてみたものがコレ。

f:id:beesand:20200606144421g:plain

モノの噂によると、TVアニメは24fpsで3フレームごとというのが多いらしいので、同じ設定にしてみた。なかなか手描き風アニメっぽい感じじゃないでしょうか(フリースタイルの線幅は 1px だと細すぎたので 2px にした)

比較用に、サルにsubdivかけてFreestyleのノイズなど消して24fpsフルフレームでも作ってみました。ぬるっとしてて、CG感がある。やっぱりアナログ感が残る方がいいな。

f:id:beesand:20200606144444g:plain

モノをつかんで移動して置くアニメーション

意外と見つからない「置く」

オブジェクトをつかんで他のところへ移す、というアニメーションを作ってみたい。とりあえず試してみると、キャッチして移動させるところまでは "child of" コンストレイントを使うとできた。ところが、離すときにこのコンストレイントの影響を0にする必要があり、そうするとオブジェクトが元の場所にいきなり戻ってしまう。「置く」動作ができない。

"pickup release hold drop"などのキーワードでやり方をぐぐってみたのだけど、同じ場所に「置く」(つまり、元の場所に戻すだけ)だったり、「置く」動作の時にそれっぽい位置に手動で移動させるみたいなチュートリアルがいくつかあるばかり。なんかしっくりこない。空のオブジェクトを置く位置に作って、置く際にその空オブジェクトの位置と角度をコピーするというのもあった。なんかすごそうだけど難しい。

そうだ、物理処理をしてしまえばいいのでは?

オブジェクトをアニメーションさせる際に、シミュレーションの世界で処理してしまえば、置いた位置にそのまま残るのでは?というかこれは確実に残るだろう。そこをベースにちょっと考えてみた。

f:id:beesand:20200324001717p:plain

まずは、適当に舞台を作る。UFOキャッチャーのアームぽいのとつかまれるサル、そして床。最初、床にも物理設定をして落とすイメージでいたけども最終的にそうしなくてもできることがわかった。

アームに他の位置へ移動させるアニメーションをつけるのだけど、その前に、サルにアームの子供になるよう Child Of コンストレイントを設定しておく。子供にした途端、サルが親のオブジェクトとなったアームの位置や回転の状態にひっぱられて変なところにいってしまう。これを Set Inverse ボタンを押して初期位置になおす。

f:id:beesand:20200324001733g:plain

で、アームに適当に位置・回転の LocRot キーフレームを打ってアニメーションをつけた。サルは Child Of がつきっぱなしなので、当然ずっと持ったままになってしまっているが、とりあえず今はOK。

f:id:beesand:20200324001812g:plain

こどもになったりこどもじゃなくなったり

ここで、サルに物理設定をしておく。[物理演算プロパティ]から Rigid Body ボタンを押して、 Type Active の剛体にする。ただ、物理シミュレーションをするわけではなく、アニメーションの制御は基本的にこちらでしたいので、Dynamicのチェックをはずし、Animatedのチェックをつけておく。

f:id:beesand:20200324001833p:plain

ここから、つかんだり離したりする際の設定をしていく。基本的に以下の通りにする。

  • つかむ:直前のフレームおよびその直後のフレームで・・・
    • Child OfInfluence0.000 → 1.000 にする。
    • Rigid BodyAnimatedを オフ → オン にする。
  • 離す:直前のフレームおよびその直後のフレームで・・・
    • Child OfInfluence1.000 → 0.000 にする。
    • Rigid BodyAnimatedを オン → オフ にする。

f:id:beesand:20200324001841p:plain

画像がちょっとわかりづらいけども、これは離してる状態から掴む状態に移行するところ。左が10フレーム目で、離した状態の最後。Child Ofの影響が0(子供になっていない)で、かつAnimatedをオフにしてアニメ制御していない状態。右が次の11フレーム目で、掴む状態の最初。Child Ofの影響を1(子供にする)にして、かつAnimated をオンにすることでアームの動きに追従してアニメーションすることができる。

離すときは、コレの逆(「つかむ」→「離す」)のキーフレームを打てばよい。んでできたアニメーションがこれ。

f:id:beesand:20200324001856g:plain

問題なくキャッチ&リリースができた。つかむ・離すをまた繰り返したいときは、前述の通りキーフレームを何度でも打つことができる。

物理設定、いいんだろうか

正直、物理設定(Rigid Body)をした際のコストがわからない。シミュレーションはしていないので動作が重くなることはないと思うけども、本当は最初にあげた「離すときにそれっぽい位置に移動させる」とした方がいいのかもしれない。

ただ、移動先の正確な位置や角度を見つけ出すのは若干めんどくさい。親子付けして移動されたオブジェクトは、位置などのパラメタが変わらない。なので、離す位置で Apply(Ctrl+A) - Visual Transform を選び一旦確定させる。すると、ツールシェルフの Item にパラメタが反映されるので、それを「メモ」しておく。メモしたら Ctrl+Z で動作を確定前に巻き戻して、手でメモどおりに入力していく。という方法しか思いつかなかった。

これをいっぺんにやってくれるアドオンがあった。これが一番ラクなのかも。

blender-addons.org