最近リリースされたBlenderのアドオンで、Animation Nodes という凄そうなものがあります。
今回はAnimation Nodesについて、導入から、何が出来るかまで調べていきたいと思います。
まずAnimation Nodesを使うとどのような表現が可能か?
こちらに良くまとまった動画があるようなのでご覧ください!
かっこいいですね!
インストール
Blenderにインストールを行います。この記事でインストールする環境は以下のとおりです。・Windows7 (64bit)
・Blender2.76b
1. まずGitHubのサイトから animation_nodes.zip をダウンロードします
https://github.com/JacquesLucke/animation_nodes/releases
2. BlenderのUserPreferencesを開いて、Addonsのページで、Install from File..で、先ほどダウンロードしたzipファイルを選択して開きます。
3. 読み込まれたアドオンにチェックを入れて使用可能にします
4. 重要:File タブの「Auto Run Python Scripts」にチェックを入れ、問題無さそうならSave User Settingsを押して設定を保存します。
5. 以上でインストール完了となります。ノードエディタを開くと Animation Nodes が追加されています。
使ってみる
早速使っていこうと思います。 ノード主体でいじるので、画面構成は、Compositingのレイアウトがお勧めです。
1. Newのボタンを押して新規ノードツリーを作成します。
2. addメニューからノードを追加します。
・Object → Transforms Output
・Animation → Time Info
を追加してください
3. ObjectTransformsOutputのRotationのXにチェックを入れます。
ObjectTransformsOutputのオブジェクト入力ボックスで Cube を選択します。
TimeInfoのFrameを、ObjectTransFormsOutputのRotationに繋ぎます。
4. すると以下のように Combine Euler というノードが間に現れます。これは、種類(=色)の違うノードを接続しようとしたため、Animation Nodesが両者を変換するノードを間に挿入してくれているようです。
5. ノードが出来ましたので、Alt + A キーを押してアニメーションさせるか、タイムラインをドラッグしてください。
結果、ボックスが x軸中心 で回転します!
6. 何が起こっているのか?
・TimeInfoノードは、現在のフレームを入力するノードです。
タイムラインをドラッグすると"Frame" の端子に、1、2、3、4・・・と次々にフレーム番号が入ってくるわけですね。
Blenderでは標準のコンポジットノードに、Timeというノードがありますが、そちらは0~1に正規化された値が入ってくるので若干違います。
・TransformsOutputノードは、オブジェクトのトランスフォームを出力するノードです。
指定したオブジェクトの、移動、回転、拡縮を入力できるます。
今回x軸回転を有効にしましたが、"Rotation"の端子はオイラー(Euler)角での入力になるので、3.14…で1回転ですね。
なので上記のフレーム数を入れるとなんだか良く分からない回転になっていたわけです。
7. おまけ
Propertiesパネルの、Inputs/Outputsでノードの端子の表示非表示や、並び替えなどが出来るようですね。
今回はx軸以外使っていないので、以下のようにy、zを非表示にすると若干見やすくなります。
ノード一覧
さて、基本的な使い方がなんとなく分かったので、片っ端からノードの性質を調べていきます。カレンダー当日に初めて触りながら作ってるので間違いがあったらすみません。ご指摘ください。
Number
Integer
整数(Integer)を入力するノードです。Float
浮動少数(Float)を入力するノードです。Integer List
Integerノードを複数入力し、リスト形式で出力します。Float List
Floatノードを複数入力し、リスト形式で出力します。Integer Range
StartからStepごとにAmount個の要素のリストを作って出力します。画像の状態では、リスト [0, 1, 2, 3, 4] が出力されます。
Float Range
同上.Randomize
Seed(乱数の種)を元に、Min~Maxの範囲内の値をランダムに作って出力します。Node Seedは、ノードを複製したときに全く同じ乱数が生成されないようにするための値です。
ノードを複製すると、Node Seedは自動的に違う値になります。
Wiggle
ぷるぷるする値を出力するノードです。パーリンノイズベースで漸進計算を行い、ある程度周期性のある値を出力します。
Evolutionには通常の使用ではフレーム番号を入れることが多いようです。たぶんEvolutionの値が近いほど近い値になります。
Seed(種)、Evolution(世代数?)、Amplitude(どのくらい動くか)、Octaves(パーリンノイズの係数)、Persistence(パーリンノイズの係数)
OctavesはノイズのMipMapみたいなものでしょうか。
Evolution間のでのノイズ変化のマップをどの程度作りこむかと言う値で、大きくするとEvalutionが近くても細かく変化するようになりますが、処理時間が増えます。
Persistenceは、Octaveの影響をどの程度拾うかで、大きいほど細かい変化(=Octaveの大きいマップ)を良く拾うようになります。
なんだか良く分からないので、使用している動画を探してみました(動画ではVectorのWiggleですが)。
Mix
Floatの値、A、Bを、Factorによって合成します。A * Factor + B * (1.0 - Factor)ですかね。
ClampFactorにチェックを入れると、Factorが0~1以外であれば0か1に丸め込まれます。
MapRange
Output = ((Value - InputMin) / (InputMax - InputMin)) * (OutputMax - OutputMin) + OutputMinです。
Clamp
ValueをMin-MaxでClampします。たとえば画像の状態では、入力Value = -1 なら 出力Value = 0、入力Value = 0.5 なら 出力Value = 0.5、入力Value = 1.5 なら 出力Value = 1
となります。
ConvertAngle
DegreeをRadianに変換します。たとえば、Degree = 90(90度)なら、Radian = π/4 となります。
Convert Float To Integer
浮動少数を整数に変換します。割と自動で挿入されます。Round
number を小数点以下 Decimals桁で丸めた浮動小数点数の値を出力します。Math
数学関数がいろいろ使えるノードです。List Math
Mathノードを、リスト形式の入力に対して使えます。Vector
Separate
Vectorを x, y, z の数値に分解します。Combine
x, y, zをVectorに統合します。Float Value
ValueをVector(value, value, value)に変換します。List
複数のVectorをリスト形式で出力します。Randomize
Number-Randomizeを参照.Wiggle
Number-Wiggleを参照.Mix
Number-Mixを参照.Length
Vectorの長さ√(vector^2)を出力します。Distance
Vectorの距離 Length(B-A) を出力します。Math
数学関数がいろいろ使えるノードです。Transform Vector
VectorをMatrixによりトランスフォームします。移動、回転、拡縮要素が入ったMatrixを入れることで任意の変換が行えます。Transform Vector List
VectorのリストをMatrixによりトランスフォームします。Rotation
回転の各種型変換。Combine Euler
Combine Quaternion
Direction to Rotation
Euler to Quaternion
Quaternion to Euler
Quaternion to Matrix
Matrix to Quaternion
Euler to Matrix
Matrix to Euler
Euler to Vector
Vector to Euler
Matrix
Decompose
Matrixを移動、回転、拡縮のVectorに分解します。性質上、可逆ではないです。Compose
移動、回転、拡縮のVectorを合成してMatrixを作って出力します。List
Matrixのリストを作ります。Translation
Matrixを移動させて出力します。Rotation
Matrixを回転させて出力します。Scale
Matrixをスケーリングして出力します。Combine
Matrixのリストを合成して1つのMatrixにして出力します。使いどころあるのか謎。Mix
複数の行列を合成します。使いどころあるのか謎。Invert
逆行列を出力します。Math
各種行列計算するノードです。ってMultiplyしか無いですが…Text
Input
Text入力ノードです。List
複数のテキストをリスト形式で出力するノードです。Randomize
Charaの文字列中からランダムなテキストを生成して出力します。Characters
指定した文字列セットを出力します。たとえばLowerCaseは"a, b, c ... z"といった小文字の文字セットを全部返すと言う具合です。Randomizeなどの入力(Chara)用だと思われます。
Split
TextをSplitByの文字列で分割してリスト形式で出力します。Join
リスト形式のTextをSeparaterの文字列を区切り文字として結合し、1つのテキストとして出力します。Replicate
TextをAmount個複製して1つのテキストとして出力します。Replace
Text中の文字列Oldを文字列Newに置換して、出力します。Trim Text
TextのStart文字目からEnd文字目までの文字列を出力しいます。Fill
TextをLength文字になるように、指定方向をFillの文字列で埋めます。たとえば、方向:Left、Length = 5、Text = abc、Fill = piyoの場合
"piabc"が出力されます。
Length
Textの長さを出力します。Object Separate
Sourceで選択したTextオブジェクトの指定したマテリアルの文字列を、Text、Curve、またはMeshとして、1文字1文字分割します。
Block Reader
TextBlock(Text Editorに読み込んでるテキスト)をTextとして出力しますBlock Writer
入力されたTextを指定したText Blockに出力します。Sequence Output
???Object Output
指定したオブジェクトに入力されたText, Size, Extrudeを適用します。□のトグルボタンを押しておかないと反映されない点に注意です。
Boolean
Booleanとは、true(真)かfalse(偽)かを表す型です。Boolean
Booleanを入力します。チェックを付ければtrue、チェックが無ければfalseが出力されます。Invert
Booleanを逆にします。Compare
A、Bに、指定したTypeの比較演算を行い、Booleanを出力します。Logic
2つのBooleanに論理演算を行い、Booleanを出力します。Switch
Conditionに入力したBooleanがtrueの場合、if Trueの値が出力されます。Conditionに入力したBooleanがfalseの場合、if Falseの値が出力されます。
Boolean to Integer
Booleanを整数 0 (false) または 1 (true)に変換して出力します。Color
Choose Color
カラーピッカーでColorを選択して出力します。Combine Color
RGBAなど、それぞれの値を結合して1つのColorにして出力します。Separate Color
ColorをRGBAなどの値に分割して出力します。Mix
複数のColorをFactorにより合成して出力します。Set Vertex Color
指定したオブジェクトの頂点カラーをセットします。List
Create
入力値をListにして出力しますCombine
複数のListを結合しますAppend
Listに要素を追加して出力しますSearch
Listから値を検索し、見つかった最初のIndex(First Index)、全てのIndexリスト(All Indices)、見つかった要素数(Occurrences)を出力します。Get Element
Listの指定したIndexの要素を出力しますGet Length
Listの長さを出力しますShuffle
ListをSeedによる乱数によって並び替えて出力しますReverse
Listを逆順にして出力しますSlice
ListをStartインデックスからEndインデックスまで切り取って出力しますたとえば[ 1, 2, 3, 4 ]というリストに対して、Start = 1、End = 3とすると、[ 2, 3 ]が出力されます
Object
Create
指定したNameのObjectを新規作成しますInput
Objectを選択して入力しますList
Objectのリストを作成して出力しますFrom Group
指定したGroupからObjectのリストを取得します。Transform Input
指定したObjectの位置(Location)、回転(Roatation)、拡縮(Scale)のプロパティを取得しますTransform Output
指定したObjectに位置(Location)、回転(Roatation)、拡縮(Scale)のプロパティを出力しますMatrix Input
指定したObjectのWorld Matrixを取得します。Matrix Output
指定したObjectに指定したTypeのMatrixを設定します。Attribute Input
指定したObjectの指定したAttributeの値を取得します。Attribute Output
指定したObjectに指定したAttributeの値を設定します。Visibility Input
指定したObjectのShow/Hide状態を取得します。Visibility Output
指定したObjectにShow/Hide状態を設定します。Data Path Output
指定したObjectのDataPathに値を設定します。DataPathというのは、Objectを選択した状態で、Object内に保存されてそうな値のGUIの入力ボックスを、右クリックして、Copy Data Pathで取得できます。
Object ID Key
Animation Nodes上で、あるObject(A)に関連付けて作成したObject(B)がある場合、このノードで(B)を選択することにより、(A)の情報が取り出せる模様。
たとえば、Text - Object Separateで、あるTextを分割した場合など。
Copy Object Data
Fromで選択したObjectのObject DataをToのObjectにコピーする。Set Keyframes
指定したObjectの指定したプロパティに、キーフレームを設定する。Animation Nodesで作ったアニメーションをキーフレームにベイクできるようだ。
http://blendersushi.blogspot.jp/2015/11/an-intermediate-procedural-animation.html
Layer Visibility Output
Objectの表示レイヤーを変更できるUtils - Move
Objectを移動させるUtils - Transform
ObjectをMatrixによりトランスフォームさせるUtils - Update Matrix
Objectのupdate()を行う.Utils - Reset Transformation
ObjectのトランスフォームをリセットするUtils - Copy Transformation
Objectのトランスフォームを指定したオブジェクトにコピーする.Utils - Get Bounding Box
ObjectのBounding Boxを取得する。Mesh
Object Mesh Data
指定したObjectのMesh Dataを取得しますSeparate
Mesh DataをVertex Locations/Edge Indices/Polygon Indicesに分割しますCombine
Vertex Locations/Edge Indices/Polygon IndicesをMeshDataに結合をしますGenerators - Line
Lineを生成します。Generators - Grid
Gridを生成します。Operators - Find Close Vertices
頂点群のうち、Min/Max Distanceを元に近い頂点を探し、指定した数のClusterに分割し、入力した接続数のEdgeリストを作って出力しますパーティクルと組み合わせて次のようなことができるようです。
http://www.local-guru.net/blog/2015/11/20/Animation-Node-experiment---curve-cluster
Operators - Edge to Planes
頂点リスト、辺リストを元に、ポリゴンを生成します。Operators - Create Edge Indices
頂点インデックスからEdgeを生成します。Operators - Create Polygon Indices
頂点インデックスリストからポリゴンインデックスを生成します。Operators - Edge to Polygons
ポリゴンインデックスリストからエッジリストを取得します。Operators - Transform Polygons
ポリゴンをMatrixによりトランスフォームさせますMesh Data from Polygons
ポリゴンリストからMesh Dataを取得します。BMesh from Mesh Data
Mesh DataからBMeshを取得しますTools - Remove Doubles
入力されたBMeshのうち、Distanceで指定した距離範囲内の頂点を重複頂点とみなして1つにして出力しますTools - Recalculate Normals
入力されたBMeshの法線を再計算したBMeshを出力しますTools - Shader Object Smooth
指定したObjectのスムージングの有効/無効を設定します。Vertex Locations
指定したObjectの頂点位置をVerticesを元に設定します。Mesh Data
指定したObjectのMesh Dataを設定します。BMesh
指定したObjectのBMeshを設定します。Spline
Get from Object
指定したObjectからSplineリストを取得しますCreate from Points
ポイントリストからSplineを生成しますCreate from Edges
エッジリストからSplineを生成しますList
複数のSplineを1つのリストとして出力します。Append Point
指定したSplineにポイントを追加しますSmooth Bezier
指定したベジェSplineをスムースにしますTransform
指定したSplineをMatrixによりトランスフォームしますConnect
指定したSplineリストを接続しますTrim
指定したSplineをStart~Endの範囲で切り取ります。Start, Endは、Splineの始点から終点を0~1としたときの値です。
Make Cyclic
指定したSplineの始点と終点をつなげてCyclicにしますInfo
指定したSplineの情報を取り出しますEvaluate
指定したSplineの、(始点から終点を0~1としたときの)Parameter位置での、LocationとTangentベクトルを出力します。Project
指定したLocationから、指定したSpline上のもっとも近い点のPosition、Tangent、Spline Parameterを出力します(たぶんGet Length
SplineのStart~EndまでのLengthを出力します。Get Samples
Spline上の、StartからEndまでの区間のうちAmount個の点のPositionリストとTangentリストを出力しますSet on Object
指定したObjectに指定したSplineを設定しますCurve Object Output
指定したCurve ObjectをBevel,Extrudeなどのパラメータを元にShape/Geometry(PropertiesパネルのDataタブ参照)を設定しますLoft
???(調査中Revolve Spline
???(調査中Animation
Time Info
現在のフレームを出力しますDelay
(Time - Delay) が出力されます。Repeat
Type=Loopの場合、TimeをRateで割った余りが出力されます。Rateは0.0001以下であれば0.0001に丸め込まれます。Type=PingPongの場合、Timeの増加に応じて、0~Rateの間でいったり来たりする値が出力されると思われます
Animate Number
入力したStart、Endの値を期間Durationで、指定した補間方法で補間し、Resultとして出力する。どうやらTimeは0から始まるのを前提としているらしく、図の例では0~20の間にTimeの値が入ったときResultが変化し、
0以下の値を入れるとResult = Startであり、Duration以上の値を入れるとResult = Endとなる。
出力値のTimeは、Animateノードを連続して繋げることを想定しているようで、(入力Time - Duration)が出力Timeとして出力される。
以下のような使ってる動画があったけど、慣れないと使うのきつそう。
Animate Vector
同上. 2つのVectorを補間するAnimate Color
同上. 2つのColorを補間するAnimate Matrix
同上. 2つのMatrixを補間するInterpolation
Construct
補間方法を入力します。From Curve Mapping
補間の具合をカーブで指定します。From FCurve
FCurveから設定されている補間方法を取得しますEvaluate
0~1の値をpositionに入力すると、指定した補間方法で補間された値が出力されます。0以下、または1以上の値を入力すると、0または1入力されたとみなされます
Mix
2つの補間をFactorにより合成します。Material
Cycles Material Output
指定したCycles Materialの指定したプロパティに値をセットできるようです以下のリンクの一番したのほうに使用例があります。 http://blender.stackexchange.com/questions/26388/can-i-refer-to-another-objects-properties-from-a-cycles-node-shader-drivers-i
Viewport Color
指定したMaterialのViewport Color(CyclesRenderのときにMaterial->Settingsにあるやつです)を設定できるようですParticles
System Input
Particleオブジェクトを入力し、Particle Systemのリストと、activeなParticle Systemを出力します。Get Particles
Particle SystemからParticleリストを取得します。Particles from Object
指定したObjectからParticleリストを取得しますState Filter
ParticleのStateによりフィルタリングしたParticleリストを取得しますParticle List Info
ParticleリストからLocationリストを取得しますParticle Info
ParticleからLocationとRotatonを取得しますFCurve
From Object
指定したObjectからFCurveリストを取り出します。Evaluate
FCurveの指定したフレームでの値を取得しますInfo
FCurveのData PathとArray Indexを取得しますKeyframes
FCurveのキーフレームリストと、値リストを取得しますSound
Bake Sound
Sound from Sequences
Get All Sequences
Sequences from Channel
Evaluate Sound
KDTree
Construct
VectorのリストからKDTree(空間構造の1つです)を構築します。Blender Standard ModuleのKDTreeを使用していると思われます。
http://www.blender.org/api/blender_python_api_2_76_2/mathutils.kdtree.html
Find Nearest
KDTreeにより、入力した座標から最も近い点を探し、その座標(Vector)、距離(Distance)、Indexを出力します。Find Amount
KDTreeにより、入力した座標から近い点をAmount個探し、その座標リスト(Vectors)、距離リスト(Distances)、Indexリストを出力します。Find in Radius
KDTreeにより、入力した座標から半径Radiusの範囲内にある点を探し、その座標リスト(Vectors)、距離リスト(Distances)、Indexリストを出力します。Subprograms
Invoke Subprogram
Group Input
Group Output
Loop
Script
MyScript
MyGroup
MyLoop
Debug
デバッグ用ノード。詳細不明。使わないのが吉。ところで、expressionノードとか無いの?
ノードを繋げてコードや数式を作るというのは、大変な作業です。直接数式かコード書けるノードは無いのか?まず最初にこれが気になりました。
ざっとみた感じ、無いです…。
Pythonスクリプトを参照するノードではなくて、HoudiniのWrangleみたいに、ノードの中にコードか数式が書きたいんです。
sin(frame-floor(frame)) * 20 とかどう考えても数式で書いたほうが効率良いです。
・・・。作るか・・・・・・
ちなみにここに新しいノードの作り方が書いてあります
http://animation-nodes-manual.readthedocs.org/en/latest/dev_guide/getting_started/first_node.html
さて、作ろうかと思っていたところ、なんと!発見しました!!
Add(またはShift-A)→Search→"expression"!!!
隠しノードですかね???
0 件のコメント:
コメントを投稿