OpenMayaでいろいろぐぐっても、自分のBlogが出てくるばかりで目的の情報にたどり着けず涙目。
英語でのググり方わからんです(´・ω・)
ということで、最近Pymelばっかでしたが久々にOpenMaya。
時間とWaveLengthとAmplitudeを与えると、数値を返してくれるノードを作ってみました。
長いのでコマンドぜんぶは → https://gist.github.com/fereria/9528629
毎度の事ながら、コードは長いですが実際の計算部分は数行です。
その昔、お師匠様に「プラグインはほとんどお約束ごとだから」と言われた意味がよく分かります(´Д)
compute部分の処理が以下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
if plug == sinWave.outputAttr: #Attributeの値を取得 dHandle = data.inputValue(sinWave.waveLengthAttr) waveLen = dHandle.asDouble() dHandle = data.inputValue(sinWave.amplitudeAttr) amplitude = dHandle.asDouble() dHandle = data.inputValue(sinWave.offsetAttr) offset = dHandle.asFloat() dHandle = data.inputValue(sinWave.timeAttr) time = dHandle.asTime() #計算 #計算式は amplitude * sin( time * waveLength) output = amplitude * math.sin( (time.value() + offset) * waveLen ) outHandle = data.outputValue(sinWave.outputAttr) outHandle.setDouble(output) |
*注意点*
1行目の output処理を決めるif分は、 if plug == XXX: が XXX == plug のように、
逆だとエラーになってしまいます。
正しい順序は、 if plug == XXX: になります。
1行目の output処理を決めるif分は、 if plug == XXX: が XXX == plug のように、
逆だとエラーになってしまいます。
正しい順序は、 if plug == XXX: になります。
時間を与えてSin波を出すことを想定していたので、AttributeがkTimeですが、ここはFloatのほうが良さそうですね(´Д)
このサンプルコードだと、ノードの評価はinitializerのAffectsで指定したノードが更新されたときですが
そうではなく時間で評価もできるとか...
が、やり方がわかりませんorz
次は、このSin波を 1次のパーリンノイズを生成するノードに書き換えていくつもりですが、
パーリンノイズのアルゴリズム書き方分からん('A)
OpenMaya勉強してると、コードの書き方とかではなくアルゴリズムとかの勉強の必要性をひしひしと感じます。
もっと勉強せねば(`・ω・´)