ArduinoでMayaを操作する

簡単なトコロから、ボタン付きロータリーエンコーダでタイムスライダをスクラブ、ボタンで再生、停止出来るようにしてみました。

間にProcessingで作成したアプリを入れていますが、MayaへpyserialモジュールをインストールしてArduinoとMayaを直接シリアル通信でつなげる事もできるかも。 続きを読む “ArduinoでMayaを操作する”


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アトリビュート”


Maya:ノードタイプの階層構造を取得する

記事投稿の頻度が少ないせいで、いつも記事の書き始めに困ります。一か月ぶりのくせして唐突に天気の話は無いし同じ理由で時事から始めるのもね。かといっていきなり本題から切り出すのも冷たい感じがします。

日を置かずに書くのが一番なんですけどね。

それでは本題、

containerBaseノードタイプをルートとした階層構造

Mayaのノードタイプの階層いわゆる上の図のような継承関係を知るには以下の2つがあります。(スクリプトはMaya2017で検証したものです)

一つ目、下は「mesh」ノードの継承元を調査します。

import pymel.core as pm
print pm.nodeType('mesh', inherited=True, isTypeName=True)

結果は、

[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'mesh']

「containerBase」ノードをルートとして機能やアトリビュートを継承していることが分かります。(ホントのルートは「node」というノードタイプのはずなのですが、何故かここでは得られません)

二つ目は逆、「deformableShape」ノードを継承しているノードを調査します。

import pymel.core as pm
pm.nodeType( typeName, derived=True, isTypeName=True )

結果は(長いので適当に改行します)

[u'nParticle', u'nRigid', u'nCloth', u'nBase', u'particle',
u'motionTrailShape', u'snapshotShape', u'bezierCurve', u'nurbsCurve', u'curveShape',
u'gpuCache', u'aiVolume', u'aiStandIn', u'VRayMetaball', u'VRayFurPreview',
u'VRayVolumeGrid', u'VRayPlane', u'VRayMeshPreview', u'VRayClipperShape', u'xgmSplineDescription',
u'xgmSplineGuide', u'xgmSphereGuide', u'xgmCardGuide', u'xgmArchiveGuide', u'xgmSubdPatch',
u'xgmNurbsPatch', u'xgmSplineGuide', u'xgmSphereGuide', u'xgmCardGuide', u'xgmArchiveGuide',
u'xgmGuide', u'xgmSubdPatch', u'xgmNurbsPatch', u'xgmPatch', u'xgmDescription',
u'bifrostShape', u'THsurfaceShape', u'fluidTexture2D', u'fluidTexture3D', u'fluidShape',
u'subdiv', u'nurbsSurface', u'greasePlaneRenderShape', u'mesh', u'heightField',
u'surfaceShape', u'lattice', u'controlPoint', u'deformableShape']

2つ組み合わせると、例えば「deformableShape」を継承するノードタイプの継承元をすべて知る事が出来ます。

import pymel.core as pm
nodetypes = pm.nodeType( 'deformableShape', derived=True, isTypeName=True )
for nodetype in nodetypes:
    print pm.nodeType( nodetype, inherited=True, isTypeName=True )

結果は(前半略)、

[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'subdiv']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'nurbsSurface']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'mesh', u'greasePlaneRenderShape']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'mesh']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape', u'heightField']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'surfaceShape']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint', u'lattice']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape', u'controlPoint']
[u'containerBase', u'entity', u'dagNode', u'shape', u'geometryShape', u'deformableShape'] 

のようになります。ひとくちに「deformableShape」ノードと言っても上のように継承したノードタイプがたくさんあることが分かります。

さてここからが本題、上記をもってある程度継承関係を知ることはできますがこれを木構造(階層)構造で取得したい場合は残念ながらコマンド一発でとはいきません。

続きを読む “Maya:ノードタイプの階層構造を取得する”

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

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

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

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

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

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


Maya Asciiファイルをパースしてみた

そして一覧できるようにして見た。

Maxのシーンファイルの中からオブジェクト選択して読み込みと同じく、maファイルから欲しいものだけ選択して読み込み&上書きみたいな事ができれば良いなと考えています。

DAG階層をたどるのは難しい事では無いですが、DGをトラバースするのは厄介ですね。またアトリビュートが規定値の場合、maファイルにはそのアトリビュートは記述されないので、ちょっと一手間必要になりそうです。