追加入力ソケット付きMappingノード

はじめに

この動画の5:30あたりで、マッピングノードのRotationを個別に操作できないため、
グループ化しないままノードをコピーして使用している。
これを回避するためにLocation, Rotation, Scaleに対する入力ソケットを持つMappingノードがほしい。

マテリアルノードを使用

Blender標準のマテリアルノードを使用する。
回転行列に対応するノードが無いため、Mathノードなどを多用する。

img

外観

img

位置、回転、拡大縮小を別グループに

img

位置の変更は加算

img

拡大縮小は乗算

img

回転はそれぞれの軸に沿った回転でグループ分け

img

x軸周りの回転

img

Radian→Degree変換

サンプルプロジェクト : ideal_mapping_node.blend

Python Nodesを使用

Pythonスクリプトでカスタムノードを追加する。
しかし、テクスチャ座標のデータが取得できず、望むノードを作ることができなかった。

img

図のようにつないで接続を変更しても、default_valueとして常に[0.0, 0.0, 0.0]のベクトルを取得してしまう。
接続元の名前は正しく取得できるが、ベクトルデータがうまく取得できない。
以下は調査時に作成したスクリプト。

サンプルコード : https://gist.github.com/TakosukeGH/47520085854e360f0b83

Animation Nodesを使用

img

Animation Nodesには行列計算ノードがあるのでこれをうまく使いたい。
しかしこちらもうまくいかない。

img

マテリアルに設定したノードに対し、入力ソケットが接続されていない場合はAnimation Nodesで操作可能。
上の図のように接続された入力ソケットに対してはその入力が優先され、Animation Nodesで操作ができない。

Animation Nodes側にテクスチャ座標ノードがあればうまくいきそう。
現状ないので作成する必要があるが、テクスチャ座標の取得方法が分からない。

OSLを使用

img

レンダリングがCPUに限定されてしまうが、OSLを使って機能を実現することができる。

shader pattern (
point Vector = point(0, 0, 0),
float LocationX = 0.0,
float LocationY = 0.0,
float LocationZ = 0.0,
float RotationX = 0.0,
float RotationY = 0.0,
float RotationZ = 0.0,
float ScaleX = 1.0,
float ScaleY = 1.0,
float ScaleZ = 1.0,
output point Vector_out = point(0.0, 0.0, 0.0)
)
{
point zero = point(0.0, 0.0, 0.0);
point x = point(1.0, 0.0, 0.0);
point y = point(0.0, 1.0, 0.0);
point z = point(0.0, 0.0, 1.0);
float rx = radians(RotationX);
float ry = radians(RotationY);
float rz = radians(RotationZ);
point tmp = Vector;
// Location
tmp = point(LocationX + tmp[0], LocationY + tmp[1], LocationZ + tmp[2]);
// Rotation
tmp = rotate(tmp, rx, zero, x);
tmp = rotate(tmp, ry, zero, y);
tmp = rotate(tmp, rz, zero, z);
// Scale
tmp = point(ScaleX * tmp[0], ScaleY * tmp[1], ScaleZ * tmp[2]);
Vector_out = tmp;
}

コードはとてもシンプル。

おわりに

スクリプトでいろいろやるのが難しい。
力技だがマテリアルノードで組めてはいるので当面はそれを使用する。