2022-11-10

Rotate Euler(オイラー回転)ノードを解説【Blender - Geometry Nodes】

Rotationなどのソケットを使う時に使う「オイラー角で回転データを出す」ノード。ぱっと見難しいが、わかりやすく全解説する。

Article Image
使用ソフトウェアバージョン備考
Blender3.3.1

Rotate Eulerノード

日本語:オイラー回転

ノード外観

概要

ジオメトリを回転させるための角度を出力するノード。

接続先の例としてTransformInstance on PointsRotationソケットに繋いで使用する。

他にもRotate Vector to Eulerノードには直接キーボードで入力できないので、このノードが使える。

直接入力できないノード

またRotate Eulerノードの入力側にも更にRotationがあり数珠つなぎで使用したり、ローカル/グローバル角で切り替えるスイッチがあり少し複雑なこともできる。

こちらは学習しておかないと正しく使えないため、この記事で解説する。

出し方

Utilities(ユーティリティ) => Rotate Euler(オイラー回転)

Combineノードじゃダメなんですか?

日本語:XYZ合成

まず先に理解しておく必要がある項目から。

今回メインに使う次のジオメトリノードがある。

実行結果

ノード原型

単にローカル軸と同じ矢印を表示させるジオメトリノードを作った。

これをCombineノードを使いX軸に90度回転したく次の入力にした。

Combine XYZをつかった間違い例

しかし、これは次の結果となる

90度になってない

なぜ90度じゃないんですか?

そもそも入力ソケットがRotationとなっているところに注目。

このRotationとは3DCGで扱いやすいラジアンという単位で出力される。

したがって、ここでの角度は「90ラジアン」となり角度に治すと約5,157度というとんでもない数字になる。

こういった変換を間違えないためにもRotate Eulerノードは有用である(角度で入力できるため)

つまりRotationソケットは同じRotationソケットで繋ぐのが基本と覚える。

Rotationソケット同士で結ぼう

基本の角度入力

では、X軸に90度回転させるにはどうしたらいいのか。

Rotate Eulerには直接「角度」をキーボード入力できるため次で良い。

Rotate Eulerノードを利用

90度回った正しい実行結果

あれ?直接入力でいいんじゃない?

気づいたと思うが、これならTransformに直接入力しても同じである。

これと同義

Rotationの項目に直接入力した場合は表記が90°になっている。

つまりここは直接入力した値がそのまま度数になるのでラジアンを気にする必要はない。

つまりRotate Byとは

逆に言えばRotate EulerRotate By:と書いてある設定は単純に回転したい角度を直接入れればよいということがわかる。

Rotate Byの外観

上でも軽く触れたがRotate Euler to Vectorのような「直接入力する欄がないノード」に使うのも有用だ。

Align Euler to Vectorノード

このノードの強み

Rotationの入力ソケットを用いて何段階かに分けた回転を計算できるのがこのノードの強みとなる。

順に解説する。

Axis Angleモード

日本語:軸の角度

Axis Angle外観

こちらのモードセレクトはデフォルトでEuler(ここまでで解説したモード)になっており、必要に応じてこちらにスイッチする。

入力が変化する

Eulerモードだと入力ソケットがXYZRotationだったが、このモードだとAxisに変化する

入力が変化

Rotate By:は角度を入れるので直感的に分かり易いが、Axisはベクトルになっており何を入力したらいいのか分かりにくい。

例で確認

Axis Angleはどんな回転をするのだろうか。

分かりにくいので次の例を使って視覚的にわかりやすくする。

みどり玉

緑色の玉を別オブジェクトで用意して、その座標をAxisに繋ぐ。

Angleはフレームが進むと自動で増加するドライバを組んだ。

ノード例

この場合Axisは次の画像のようになり

回転軸のイメージ

この軸に対して回転する。

つまり原点と緑玉を繋いだ線を軸に回転する。

動画で確認

イメージしにくいと思うので、動画で確認

Axisに設定したベクトルを軸としてAngle分回転していることがわかると思う。

参考:特定の軸で回転させる

例えばX軸回転をしたい場合は次のようにX=1にして他を0にすれば良い。

Xだけ1

回転の図

参考として記事にしたがXYZのうちどれかを回転軸で利用する時はEulerモードにして各軸に度数を入れたほうが簡単なので覚えなくても良い。

ただ、Blenderではないソフトでもベクトルを軸とした回転で表現するものがあるので、知っていて損はない。

この場合X=1である必要はなく、X=0.1だろうが2だろうがXに値が入っていれば良い(ベクトルなので)

ただしXYZを複合的に指定する場合はベクトルの方向に影響するので数値は慎重に入れる。

(入力)Rotationソケット

Rotation外観

入力に別のRotationを入れることで何段階かに回転を分けることができる。

つまり先にRotation入力に入ってきた角度を回転した後でRotate Eulerに指定されている角度を回転する。

といっても分かりにくいと思うので順に説明する。

間違えないように注意

まず先に注意点から解説する。

例えば次のように繋ぐ。

数珠つなぎでx=45+45=90?

X軸で45度 x 2 = 90度だと思いがち。

90度

この場合は実際に90度回っているが、次の例でおかしくなる。

X軸もY軸も90度?

これならX軸に90度Y軸に90度回るように思えるが、実際は

謎の回転

変な角度になってしまった。

なぜこうなるのか...というのはあまり考えると混乱するのでサクッと理解すると

回転の順

1, 2の回転が終わった後、内部のXYZ軸をリセットして3, 4の回転となるのでねじれが生じているわけである。

このソケットいつ使うの?

つまり2段階(またそれ以上)で回転させたいときに使うソケットである。

例えば魚の例を挙げる

なんらかのプロセスで生成された魚は変な角度を向いてしまっているとする。

魚はジオメトリノードでランダムに生成されて、どの角度を向いているかわからないなど。

モデリングで直せないケースを想定。

picture 6

まずはこれを地面に平行に回転

まずは並行

さらに2段階目の回転として、泳ぐ動きを付け加える

ノード例

簡略的なので不自然な泳ぎ方だが...こんな使い方をすると便利かと思う

ノードを2つに分けることで回転を分けられるので理解しやすく、また後から進行方向なども考慮して改良しやすい。

Object/Localモード

Object/Local

まずこのオプションはRotationの入力ソケットになにか入っているときにだけ作用する

Rotationを使うときだけ

つまりRotation入力がない場合はどちらでも良い。

これに関しては複雑で自信がないので私が間違っている可能性もあるので注意。

どんな効果があるのか

次の例で確認する。

Rotate Eulerを数珠つなぎにして、先行する方に回転がはいっていて、後ろ側は0度になっている。

Rotate Euler数珠つなぎで回転が入っている

実行結果は

置き換わっている

X軸はZ軸に、Z軸はY軸に、Y軸はX軸に整列されているという例。

分かりにくいので1つ解説すると、赤の矢印(ローカルのX軸)がグローバルのZ軸に整列されているという状態。

この状態でObjectモードX=45度にしてみる

変更

すると次のように

グローバルX軸で回転

矢印の色に関係なく、元のX軸(グローバル)で回転する。

このままLocalモードに変更すると

Localに変更

今度は回転方向が変わり

ローカルX軸で回転

ローカルのX軸(赤い軸)で回転しているのがわかる。

このようにRotationに繋いだ回転がグローバル軸なのかローカル軸なのかを変えるスイッチだ。

XYZオイラー角であることに注意

このノードは「XYZオイラー角」という概念で回転している。

これに関して詳しくは他サイトに譲るが、X軸で回転 => Y軸で回転 => Z軸で回転という順番で回転している。

したがって

  • 角度を正確に入力したつもりでもねじれによって思わぬ方向に回っている
  • ジンバルロックにより特定の1軸でしか回転しなくなる

という現象が起きやすい。

少し分かりにくいノードであるのは間違いないので注意して試しながら作品を作ってもらえればと思う。

さいごに

正直なところここまで深く理解する必要があるノードでもないかと思う。

ただ、とても良く使うノードなのにもかかわらず思ったような回転にならないというケースも多い。

というわけで、なぜそうなってしまったのかを考えるための参考記事にもなれば幸いだ。



謎の技術研究部 (謎技研)