はじめに
この動画の5:30あたりで、マッピングノードのRotationを個別に操作できないため、
グループ化しないままノードをコピーして使用している。
これを回避するためにLocation, Rotation, Scaleに対する入力ソケットを持つMappingノードがほしい。
マテリアルノードを使用
Blender標準のマテリアルノードを使用する。
回転行列に対応するノードが無いため、Mathノードなどを多用する。
外観
位置、回転、拡大縮小を別グループに
位置の変更は加算
拡大縮小は乗算
回転はそれぞれの軸に沿った回転でグループ分け
x軸周りの回転
Radian→Degree変換
サンプルプロジェクト : ideal_mapping_node.blend
Python Nodesを使用
Pythonスクリプトでカスタムノードを追加する。
しかし、テクスチャ座標のデータが取得できず、望むノードを作ることができなかった。
図のようにつないで接続を変更しても、default_valueとして常に[0.0, 0.0, 0.0]のベクトルを取得してしまう。
接続元の名前は正しく取得できるが、ベクトルデータがうまく取得できない。
以下は調査時に作成したスクリプト。
サンプルコード : https://gist.github.com/TakosukeGH/47520085854e360f0b83
Animation Nodesを使用
Animation Nodesには行列計算ノードがあるのでこれをうまく使いたい。
しかしこちらもうまくいかない。
マテリアルに設定したノードに対し、入力ソケットが接続されていない場合はAnimation Nodesで操作可能。
上の図のように接続された入力ソケットに対してはその入力が優先され、Animation Nodesで操作ができない。
Animation Nodes側にテクスチャ座標ノードがあればうまくいきそう。
現状ないので作成する必要があるが、テクスチャ座標の取得方法が分からない。
OSLを使用
レンダリングが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; | |
} |
コードはとてもシンプル。
おわりに
スクリプトでいろいろやるのが難しい。
力技だがマテリアルノードで組めてはいるので当面はそれを使用する。