2016年8月3日水曜日

blender - MMDボーン名をLRにする

絶対誰か作ってるだろうと思うけど、それ探して入れるより書いたほうが圧倒的に速い気がしたので、
ちゃちゃっと作成。

to_blender
右~→~.R
左~→~.L

to_mmd
~.R→右~
~.L→左~

となります

使い方:
テキストエディタに張り付けてメッシュとボーンを全部選択して実行。
元に戻すときは、最後のあたりを
#to_blender()
to_mmd()
にして実行。

免責事項:
数分で書いたかき捨てスクリプトなので必ず保存してから実行してください
どうなっても責任とれません

# -*- coding: utf-8 -*-
import bpy

def to_blender():
 for obj in bpy.context.selected_objects:
  if (obj.type == "ARMATURE"):
   for bone in obj.data.bones:
    if ("右" in bone.name):
     bone.name = bone.name[1:] + ".R"
    if ("左" in bone.name):
     bone.name = bone.name[1:] + ".L"
  if (obj.type == "MESH"):
   for group in obj.vertex_groups:
    if ("右" in group.name):
     group.name = group.name[1:] + ".R"
    if ("左" in group.name):
     group.name = group.name[1:] + ".L"

def to_mmd():
 for obj in bpy.context.selected_objects:
  if (obj.type == "ARMATURE"):
   for bone in obj.data.bones:
    if (".R" in group.name):
     bone.name = "右" + bone.name[0:-2]
    if (".L" in group.name):
     bone.name = "左" + bone.name[0:-2]
  if (obj.type == "MESH"):
   for group in obj.vertex_groups:
    if (".R" in group.name):
     group.name = "右" + group.name[0:-2]
    if (".L" in group.name):
     group.name = "左" + group.name[0:-2]


to_blender()
#to_mmd()

2016年7月25日月曜日

blender - 軸を変えずにボーンの長さを変更する技

以下 twitterで教えてもらった手法(@tarava777 さんありがとうございます)

1. ボーン編集モードで、マニピュレータをノーマルにして、左のやつをアクティブ要素にします
2. 長くしたいボーンのヘッドと、その子ボーンすべてを選択します。
違う軸のマニピュレーターが出てしまった場合は、
ヘッドの丸ぽち目がけてshift押しながらマウス右クリックを何回か押すとうまく選択できたりします。
3. マニピュレーターでy軸方向に移動させます。
以上です。




以下古い手法 結構悩んでたどり着いた技。



(わかりやすいように、ちょっとオーバーにしてます)

これではMMDのモーションが同じように適用できない!
そこで全てのユーザトランスフォームをリセットした状態で、

ポーズモードで、スケールを継承のチェックを外し、

ポーズモードで、スケールさせます。
Ctrl + A で、デフォルトのポーズに適用します
これでようやく軸を維持したままボーンの長さを変えることができます。めんどい

2016年5月8日日曜日

blender - ディフュージョンフィルタ

アニメ表現を目指す上で欠かせない(?)、ディフュージョンフィルタを試してみました。
元ネタはググったらいっぱい出てきます。

元画像

ノード

結果画像


それっぽいですね!

ちなみにDiffusionって書いてあるフレームの中だけだとこんな感じ。
フレームの外の部分は、参考にしたブログの人がこんな感じにしてたのでやってます。
見比べてみると、フレームの中だけのほうが良いかな…。

2015年12月6日日曜日

Blender - Blenderバーガーオフ2

Blender Advent Calender 2015 12月6日の記事です。

みなさん、そろそろ忘年会シーズンですが、いかがお過ごしでしょうか??

さて、本日、2年ぶりに、Blenderバーガーオフ!を開催したので、その模様をお伝えしたいと思います。

Blenderバーガーオフ会とは


Blender使いが集まってハンバーガーを食べるオフ会です。

なぜハンバーガーなのか?


主催者がハンバーガー好きだからです。

Blenderと関係あるのか?


バーガーは、パーティクル(ゴマ)、ソフトボディ(バンズ)、弾性/流体計算(チーズ)、サブサーフェススキャタリング(パティ/レタス)
などの様々なCG要素で構成されています。
かの有名なビルゲイツですらハンバーガーを食べながら仕事をしていたと言われています。
また、Blenderを通じて、以下のような様々なバーガーに対するアプローチが行われています。

http://blenderartists.org/forum/showthread.php?351419-Burger
http://gman20999.deviantart.com/art/Blender-cycles-3D-model-burger-render-568035930
http://real3d.fr/3rd-day-with-blender-food/
https://inevitablecrafts.wordpress.com/2012/06/01/blender-camera-t-r-a-c-k-i-n-g/


みなさんもCGをやる傍ら、バーガーを食べて健康を保ちましょう!

Blenderバーガーオフ2の模様



こちらがバーガーオフの模様です!


とても美味しそうですね!

やはりこの魅力は静止画だけでは伝え切れません。
そこで動画を撮ってみました。こちらです!
(酔っ払っていて微妙な撮り具合ですみません)


どうでしょうか。おいしいハンバーガーを食べたくなってきましたでしょうか?
一旦Blenderの手を止めて美味しいバーガーを食べましょう!
Blenderで行き詰っていた問題が解決するかもしれません!!

さて、明日12/7のBlender Advent Calenderは、@psi_ni_phi さんです!

2015年12月5日土曜日

Blender - Animation Nodes

Blender Advent Calender 2015 12月5日の記事です。

最近リリースされた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軸中心 で回転します!

https://gyazo.com/1bf6779cf2a2e9fda1323a17b1841c87

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"!!!

隠しノードですかね???

さて、明日12/6のカレンダーは uimacさんによるBlenderバーガーオフ2 です!

2015年1月8日木曜日

blender - Bezier曲線を生成する(2)

進捗




2015年になりました

前回、一続きの頂点群を与えて、それにフィットするようなBezier曲線を1つ(=アンカー2点+ハンドル2点)作成できるようになりました。
しかし、複数の曲線を生成してないので、かなり結果がしょぼいです。
複数の曲線を生成するのは簡単で、単に頂点群を適当に分割して、それにフィットさせれば良いだけです。

[オリジナルのfitcurve.cの場合]
1. 全ての頂点に対して、曲線を1回フィットさせます(前回の記事)
2.1 誤差が許容範囲であれば終わります。
2.2 誤差が許容範囲よりちょい大きいくらいであれば、
  任意の頂点 P に対応する t 軸上の点(前回の記事)をニュートン法で変更しつつ許容範囲に収まらないか調べます。
  2.2.1 許容範囲に収まったら終わります。
2.3 誤差が許容範囲外であれば、一番誤差が大きい点で分割し、深さ優先で再帰させます。

この方法で同じように実装して検証してみたところ、確かに 2.2 によって早く収束します。
2.2 によって収束した場合は、その部分の曲線が許容誤差ぎりぎりになってしまいます。
2.2 を行わないほうが、どんどん曲線を増やしながら分割していくので、線の数は増えますが、かなりぴったりの曲線になりました。

また、2.3で、一番誤差が大きい点をアンカーにして分割していくのは、確かに効果的な気がします。
が、実際にやってみたところ、点群のインデックスを半分に分割していったほうが、曲線が少ない場合に良い結果が得られました。
Bezier曲線は、自由度が高いので、細かい範囲で使うよりも、ある程度大きな範囲で使ったほうが、効果的なのかもしれません

さらに、今回自分が考えている用途では、指定した曲線数で近似する、という機能も欲しいため、
2.3 で、深さ優先ではなく、幅優先で再帰させ、分割数をカウントしていくようにしました
まとめると、

[uimacの場合]
1. 全ての頂点に対して、曲線を1回フィットさせます(前回の記事)
2.1 分割数が指定数に達していれば終わります。
2.2 誤差が許容範囲であれば終わります。
2.3 分割数をインクリメントします
2.4 誤差が許容範囲外であれば、頂点群のインデックスの半分で分割し、幅優先で再帰させます。


結果的に、オリジナルで実装されていたニュートン法は要りませんでした。
文字ばっかりですみませんが、そろそろプラグイン化して配布を予定しています。