MASHで複製されたメッシュ上にロケータを配置

タイトルがこれでいいのか分からない…

現在時刻の位置、回転を参照してロケータを配置します。

MASH Waiterノードを選択して以下(Shelfにでも登録して下さい)を実行です。Maya2018.2で動作確認済み。

import pymel.core as pm

def createLocatorOnMashPoint():
    if len(pm.selected()) == 0:
        return
        
    if pm.selected()[0].nodeType() == "MASH_Waiter":
        waiter = pm.selected()[0]
        #print pm.listAttr(waiter)
        
        rotations = waiter.inRotationPP.get()
        positions = waiter.inPositionPP.get()
        visibilites = waiter.inVisibilityPP.get()
        
        for i,p in enumerate(positions):
            if visibilites[i][0] == 0:
                continue
            locator = pm.spaceLocator()
            locator.setTranslation(p,space='world')
            locator.setRotation(rotations[i])

createLocatorOnMashPoint()

MASH APIを使うのかと思ったらいらんかった。


nParticleの初期状態の保存とAgeアトリビュート

MayaのnParticleで、ある程度シミュレーションして初期状態を作成する時、困ったことが起こります。

「Fields/Solvers > Initial State > Set for Selected」(日本語のメニューは知らん!)を実行し初期状態を保存したのちアニメーション開始フレームに戻ると、位置などは保たれたままですが、ageアトリビュートにおかしな数値が入った状態になります。

2016.5、2017、2018で確認しましたがどれもこの現象が発生します。ageを正しく保持できないという事は初期パーティクルに関して、LifeSpanで消滅させたり、ArrayMapperによる評価が正しくできません。僕だけの問題?ネット検索しても引っかからないんですけど。

以下その検証と解決方法です。

検証用のパーティクルシステム一式の作成は以下のスクリプトです。

import pymel.core as pm
myemitter = pm.emitter(pos=(0,0,0),type="omni",r=10,sro=0,nuv=0,cye="none",cyi=1,spd=1,srn=0,nsp=1,tsp=0,mxd=0,mnd=0,dx=1,dy=0,dz=0,sp=0)
npList = pm.nParticle()
np = npList[1]
pm.connectDynamic(np,em=myemitter)
np.ignoreSolverWind.set(True)
np.ignoreSolverGravity.set(True)

毎秒10個パーティクルを発生させる単純なエミッタです。パーティクルはソルバのWindとGravityの影響を受けません。これを30フレーム分シミュレーションすると以下のような状態になります。ちなみにシーンの開始フレームは1、終了を30としています、フレームレートはntsc、つまり毎秒30フレームです。

ageアトリビュートを表示した状態です。この状態(タイムスライダが30フレームの位置)でinitial stateを保存します。そして開始フレーム(1フレーム目)に巻き戻すと次のようになります。

なんかageが増えました。期待する値は初期状態を保存した時の値です。変わってもらっては困りますよね。

なぜこの値になったか、推測するに以下のような式になっているように見えます。 続きを読む “nParticleの初期状態の保存とAgeアトリビュート”


Sverchok

Animation nodeのモデリング版「Sverchok」、建物を量産できないかと挑戦してみましたがなかなか慣れることができず。データの組み立て方はRhinocerosのGrasshopperと似ているような気がします、こちらも使いこなせていないので自信はないですが。

内部的にはリストを複雑に組み合わせてジオメトリを作っていく感じなのですが、その構造やそこから必要なデータの取り出し方がなかなか理解しづらい。

お盆休みの宿題にします。


Animation Nodes:アニメーションの取得

Animation nodesでアニメーション(FCurve)を取得する場合、チャンネルを指定して取得はできませんが、FCurves from ObjectノードでFCurveのリストを簡単に取得可能です。ただしリストのインデックスは位置・回転・スケールそれぞれ固定されたものとはなりません。位置のアニメーションが無い場合はリストの先頭はオイラー回転xから始まりますし、Insert Single Keyframeで各軸ごとにキーを打つ事も考えられます。AN2_SimpleSplineTrail

Animation nodesと名付けられた割にはちょい残念なところですが、Scriptを通して特定のFCurveを得ることはできます。

上はアニメーションの軌跡をスプラインオブジェクトにする例です。位置アニメーションを取得し過去の位置をリストにしスプラインとして出力します。ローカル位置をスプラインにするだけでペアレントしたオブジェクトでは期待通りには動かないので、今のところあまり実用性はありませんが、位置アニメーションが無いオブジェクトを入力しても問題無いようにしたかったので確実に位置アニメーションのFCurveを得られるようにしました。

で、そのスクリプトノードの内容が以下です。

if Object.animation_data is None:
    return

FCurveList = [f for f in Object.animation_data.action.fcurves if f.data_path == 'location']
for f in FCurveList:
    if(f.array_index == 0):
        FCurve_x = f
    if(f.array_index == 1):
        FCurve_y = f
    if(f.array_index == 2):
        FCurve_z = f

オブジェクトのFCurveから「location」というデータパスを取得して後はarray_indexを見てX/Y/Zどの情報なのかを評価しています。array_indexはちょっと勘違いしそうですが、配列のインデックスという意味ではなく、rna_array_indexと呼ばれるものです。この場合Xなら0、Yなら1といった具合の定数になっているようです。

AN2_SimpleSplineTrail.zip(Blender2.87c+Animation nodes2)


Maya V-Ray:OpenSubdiv一括適用スクリプト公開中

こちらでは無く会社のホームページへアップロードしました。 VRayAddOpenSubdivAttrGrp[canplaize.com]

モデルデータはスタッフからの借り物

表題の通り一括で適用です。任意のアトリビュートのみを一括修正することも可能です。プレビュー用のスムースメッシュも自動で適用されます。

Mayaは一括修正が面倒ですねえ、Attribute Spread SheetかChannel Boxがその役割なのですがこの件を例にとるとシェイプノードを選択する必要がありますね。他にもスライダーやカラーピッカーが使えなかったりと操作に難ありです。選択したノードの共通アトリビュートとその型に応じたUIを自動生成なんてことができると便利なのですが、残念ながら技術不足!かといって○○を一括操作する為のスクリプトをやたら作るのは非効率すぎます。

選択したノードのAETemplateを引っ張ってこればなんとかなるか?