この記事にはプロモーションが含まれています。

【Blender4.3】Geometry Nodesでの回転系ノードまとめ

blender

Blender 4.3 Geometry nodeの回転についてまとめたい(途中)

この記事では、BlenderのGeometry Nodesにおける回転系ノードについて解説します。回転は3Dモデリングやアニメーションにおいて非常に重要な操作であり、Geometry Nodesを使用すると、ノードベースで簡単に回転を制御することができます。

具体的には、「Rotate」ノード「Align Rotation to Vector」ノードなど、回転に関連するさまざまなノードを使用して、オブジェクトの向きや回転をどのように操作するかについて説明します。
Geometry Nodesでの回転に関する基本的な理解と、複雑な回転操作ができるようになることを目指します。

バージョンが変わり、回転のノードも変わったところがあるので自分の理解のためのメモです。回転は苦手なので間違っているところもあるかもしれません。

この記事は、BlenderのGeometry Nodesにおける回転系ノードについて詳しく知りたい中級者~上級者向けの記事です。

難易度 4.5

スポンサーリンク

Blender 4.3にある回転系のノード

現在BlenderのGeometry Nodes回転系ノードは以下のものがあります。

Instances Nodes
・Rotate Instances Node

Utilities Nodes

回転運動をさせるようなものを集めました。フィールドなどの回転情報などは扱いません。
なぜかBlender4.3Manualにないものもありましたが、一応入れておきます。

Align Euler to VectorRotate EulerノードはDeprecatedと注意が出ており、廃止となるため今後は使用非推奨です。(今も一応使えますが、各自使用している場合は新しいノードに変更することをお勧めします。)

スポンサーリンク

出力の違い

回転系ノードの出力には

  • Rotation
  • Vector
  • Axis
  • Euler
  • Quaternion

があります

データの種類役割ジンバルロックの影響
Rotation (回転情報)回転の向きや量を指定する。ジンバルロックがかかる(180°, 0, 0)(オイラー角の場合)
Vector (ベクトル)回転後の位置を表す。(Rotationにつないだときは回転方向のベクトルとなる)ジンバルロックがかかる(1, 0, 0)(X軸方向の単位ベクトル)
Axis (回転軸)回転の軸を表す単位ベクトル。回転量と組み合わせて使うことで、軸回転を表現する。ジンバルロックがかかる(0, 1, 0)(Y軸回転の軸)
Euler (オイラー角)XYZの3つの角度で回転を表す。ジンバルロックがかかる(90°, 45°, 0°)
Quaternion (クォータニオン)回転を4次元のデータとして表す。回転の累積計算がスムーズで、ジンバルロックの影響を受けない。ジンバルロックがかからない(0.707, 0.707, 0, 0)(X軸90°回転)

ジオメトリーノードの中では、ビューポートでオイラー回転の順番を変えていても、XYZになり、その順番でジンバルロックがかかります。(ノードを組み合わせることで回避することができると思います)

Rotation

Rotationは回転情報を回転行列(X, Y, Z)として出力しています。

回転角度(単位:度、°)を入れるとそのままその軸の回転をしてくれるので視覚的にもわかりやすいと思います。

Combine XYZなどで各軸の回転角度を入力しようとするときはラジアンとして入力することになるので注意が必要です。

Vector

Vectorで出力されているのは、オブジェクトが回転した後の位置です。

基本的に回転させたいオブジェクトのPosition情報を入力して、そこに回転をかけて、回転後の位置のベクトルを出力するという使い方をします。

下の図でもわかるように、ベクトルが出ているので、Vector mathノードでさらにトランスフォームさせることができます。

Transform GeometryノードのRotationなどにVector出力を回転行列として入力することもできますが、これはただベクトルを回転方向ベクトルとして解釈しているだけなので、ただのベクトルノードでも回転させることができます。

Quaternion

wxyzを出すQuaternionの出力なんですが、結局Rotationにしないとつなげるノードがないので、ほぼRotationに変換されます。

最初にオイラー角からw,x,y,zを出力するときに普通にジンバルロックがかかるので、w,x,y,zを手計算で回せという鬼畜仕様だと思います。

クォータニオンの基本構造

クォータニオン (w,x,y,z) は、回転軸と回転角を次のように表現します:

w=cos(θ/2​)

(x,y,z)=sin⁡(θ/2)⋅(Vx, Vy, Vz)

  • θ は回転角(ラジアン)
  • (Vx,Vy,Vz)は回転軸の単位ベクトル

例えばX軸周りに180°回転させたいときは、

w=cos(π/2​)=0
x=sin⁡(π/2)⋅1=1
y=sin⁡(π/2)⋅0=0
z=sin⁡(π/2)⋅0=0
※π=pi

なので(0,1,0,0)を入れます。

特定の軸で回したいとき

以下のようにノードを組んだりして工夫すると計算はノードにまかせることができ、角度を入れるだけでクォータニオン回転ができるようになります。

ある軸で回したいという場合は上のように計算して組めばいいんですけど、わざわざクォータニオンを使いたいという人は回転アニメーションとか複雑に回転させたい場合が多いですよね。

①X軸回転(90°)させてから②Y軸回転(90°)させたい場合は?(保留)

①X軸回転(90°)…q1
W1 = cos(π/4) = √2/2 ≈ 0.707
X1 = sin(π/4) = √2/2 ≈ 0.707
Y1 = 0
Z1 = 0

②Y軸回転(90°)…q2
W2 = cos(π/4) = √2/2 ≈ 0.707
X2 = 0
Y2 = sin(π/4) = √2/2 ≈ 0.707
Z2 = 0

回転を合成するにはクォータニオンの積(合成回転)を計算します:

q=q1⋅q2

すいません、合成回転はもうちょっと調べます

クォータニオンの掛け算は以下のようになります:

(w1​,x1​,y1​,z1​)⋅(w2​,x2​,y2​,z2​)
=(w1​w2​−x1​x2​−y1​y2​−z1​z2​,
w1​x2​+x1​w2​+y1​z2​−z1​y2​,
w1​y2​−x1​z2​+y1​w2​+z1​x2​,
w1​z2​+x1​y2​−y1​x2​+z1​w2​)

q=(0,0,1,−0.5) となります。 

wを出力するノードグループの中身

ノードを組んでみました。

(図の中ではq1でY軸回転してますが、これはただの例なのでさっきの計算の角度とは関係ないです)

確かにジンバルロックは起こらず回せますが、こんなことするくらいならRotate Rotationとかでローカル回転させるのとあまり違いがない気がして…。

間違ってる確率が高いので真似しないでください

計算が大変で、今はやめます。すいません

スポンサーリンク

instance回転

インスタンスを回転するときによく使うノード

Rotate Instances Node

これはインスタンスを回転させるノードで、インデックスに応じてとか、個別にランダムな値を入れることもできるし、pivot pointが操作できるところもポイントです。

Align Rotation to Vector Node

インスタンスを配置するときに、tangentやnormal方向に揃えたい場合がよくあるので、そんなときに使うノードです。TangentやNormalのベクターがわかれば、x、y軸をそこに揃えてくれます。(Autoでz軸回転)

z軸を揃えようとするとうまくいかないので、Rotate Rotationノードを使って、x軸Tangent揃えでnomal方向にy軸が揃った状況でy軸を回転すると、うまくz軸を揃えることができます。

以前はこのインスタンスを揃えるノードとしてAlign Euler to VectorRotate Eulerノードが使われていましたが、廃止となるため今後は使用非推奨です。(今も一応使えます)

スポンサーリンク

Axisを設定して回転

Axis Angle to RotationAxes to Rotationノードも軸をあるベクトルに合わせて回転させることができるノードです。前者は一つの軸、後者は二つ軸を決めることができます。例えば上記でz軸をtangentに揃えるときはノードが2個必要でしたが、二軸を決めることができるAxes to Rotationの場合はnormalを第二回転軸に選ぶことにより、一個のノードで揃えることができます。ただ細かい回転量などを設定する項目はないので、細かい調整をしたい場合は上記の二個のノードで設定すると万能です。

スポンサーリンク

回転から軸と角度を割り出す

Rotation to Axis Angle

どこで使うのか思いつかないんですが、このノードはRotation出力から、軸と角度を割り出すことができます

スポンサーリンク

逆回転

Invert Rotation

RotationはBlenderの内部ではクォータニオンとして処理されてるらしく、その逆行列(ある回転に作用させると元の位置に戻る回転)を作れるのがInvert Rotationらしいです。以下のように軸と角度を切り離して、角度に-1をかけると、逆回転と同様になりましたので、イメージとしてこんな感じなんじゃないでしょうか(細かい検証はしていないので適当ですいません。)回転を打ち消したいとか、逆回転させたい、などのときに使うと良いと思います。