トップ | puarts.com
メモ  |  制作記  |  開発記  |  日常の記録  |  デジタルコンテンツ制作  |  ファイアーエムブレム  |  ゲーム  |  C/C++  |  C#  |  PC/ソフトウェア  |  Web 開発  |  スクリプト言語  |  その他プログラミング  |  
「Maya」に関連する記事一覧

0  1  2  3  4  5  6  

Maya 歯車モデル、アニメーション生成スクリプト 「Davveys Gear Generator」

2016/07/27

Maya で歯車のアニメーションを簡単に作れるスクリプトないかなーと探していたところ、「Davveys Gear Generator」というフリースクリプトを見つけたので紹介します。2006 年に作られた古いスクリプトですが、よくできていて、今でも十分使えます。

https://www.creativecrash.com/maya/script/davveys-gear-generator

若干ウィンドウの起動の仕方の説明が不親切ですが、それ以外は特に説明を読まなくても、なんとなく触っていたら使うことができました。

ダウンロードしたスクリプトを MAYA_SCRIPT_PATH に配置して、以下の MEL コマンドを実行すれば GUI を起動します。

DVY_Gears();

このスクリプトでは歯車の大きさ、種類、歯車の数を設定して歯車モデルを作成できます。また、歯車の回るスピードをアトリビュートで変更可能なリグの作成できます。

mayabatch から Mental Ray レンダリング時に VC++ ランタイムエラー

2016/07/03 11:30

Mental Ray で mayabatch からレンダリングしたときに下記のようなエラーが出ることがありました。

---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Runtime Error!

Program: C...

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

OK ボタンを押すと mayabatch が強制終了してしまいますが、OK を押さなければなぜか最後まで処理が実行されました。

8K サイズのテクスチャを使用したりしていたのですが、テクスチャ解像度を下げてみると出なくなったりしたので、メモリー使用量に関係していそうです。

詳しい原因はわかりませんが、同様のエラーに遭遇した場合は、テクスチャの解像度を下げたり、描画するモデルを複数に分けてレンダリングするなどで解決する場合はありそうです。

Maya キューブ上に分割されたオブジェクトをアニメーションする MEL スクリプト改良

2016/06/29

Maya キューブ上に分割された壁の一部が飛び出すアニメーションを作る で作成した MEL スクリプトを改良して、複数のコントロールでキューブ上に分割されたオブジェクトを操作できるようにしました。

スクリプトを載せておきます。$targets にオブジェクトのパーツ群の名前配列を指定し、$locators にコントロールとなるlocatorの名前配列を渡します。


global proc CreateRepulsiveAnimation(string $targets[], string $locators[])
{
    int $index = 0;
    for ($locatorName in $locators)
    {
        addAttr -k true -ln "distanceThreshold"  -at double  $locatorName;
        setAttr ($locatorName+".distanceThreshold") 10.0;
    }
    
    for ($target in $targets)
    {
        print("Creating expression for "+$index + "\n");
        string $expName = "RepulsiveExpression";
        string $exp="float $resultX = 0.0;\nfloat $resultY = 0.0;\nfloat $resultZ = 0.0;\nfloat $targetPos[] = {"+$target+".originX, "+$target+".originY, "+$target+".originZ};\n";
        xform -cp $target;
        addAttr -k true -ln "originX"  -at double  $target;
        addAttr -k true -ln "originY"  -at double  $target;
        addAttr -k true -ln "originZ"  -at double  $target;
        float $rotatePivot[] = `xform -q -ws -rp $target`;
        setAttr ($target+".originX") $rotatePivot[0];
        setAttr ($target+".originY") $rotatePivot[1];
        setAttr ($target+".originZ") $rotatePivot[2];
        
        for ($locatorName in $locators)
        {
            $exp+="{\n    float $dx = $targetPos[0] - "+$locatorName+".translateX;\n    float $dy = $targetPos[1] - "+$locatorName+".translateY;\n    float $dz = $targetPos[2] - "+$locatorName+".translateZ;\n\n    float $dist = sqrt($dx * $dx + $dy * $dy + $dz * $dz);\n    if ($dist < "+$locatorName+".distanceThreshold)\n    {\n        float $normMult = 1.0 / $dist;\n        float $normDx = $dx * $normMult;\n        float $normDy = $dy * $normMult;\n        float $normDz = $dz * $normMult;\n        float $t = ("+$locatorName+".distanceThreshold - $dist);\n        $resultX += $normDx * $t;\n        $resultY += $normDy * $t;\n        $resultZ += $normDz * $t;\n    }\n}";
        }
        
        $exp += $target + ".translateX = $resultX;\n"+$target+".translateY = $resultY;\n"+$target+".translateZ = $resultZ;";
        expression -s $exp -n $expName;
        ++$index;
    }
}

使用例


string $locatorNames[];
int $i;
for ($i = 0; $i < 3 ++$i)
{
    string $tmp[] = `spaceLocator`;
    $locatorNames[$i] = $tmp[0];
}
string $selections[] = `ls -sl`;
CreateRepulsiveAnimation($selections, $locatorNames);

Maya キューブ上に分割された壁の一部が飛び出すアニメーションを作る

2016/06/25 15:01

よくプロジェクションマッピングで見かける、キューブ上に分割された壁の一部が飛び出してくる演出を再現しようと思い、Maya のエクスプレッションで、そんな感じのアニメーションを作ってみました。コントローラとなる locator が一定距離近づいた壁は、locator に反発するような位置に移動して、飛び出した感じになります。

ついでに、この Expression を MEL で自動で作れるようにしたので、載せておきます。動画は 1600 分割したキューブに対してこの MEL で Expression を生成したものになります。


global proc CreateRepulsiveAnimation(string $targets[])
{
    string $locatorNames[] = `spaceLocator`;
    string $locatorName = $locatorNames[0];
    addAttr -k true -ln "distanceThreshold"  -at double  $locatorName;
    setAttr ($locatorName+".distanceThreshold") 10.0;
    int $index = 0;
    for ($target in $targets)
    {
        print("Creating expression for "+$index + "\n");
        string $expName = "RepulsiveExpression";
        string $exp="";
        xform -cp $target;
        addAttr -k true -ln "originX"  -at double  $target;
        addAttr -k true -ln "originY"  -at double  $target;
        addAttr -k true -ln "originZ"  -at double  $target;
        float $rotatePivot[] = `xform -q -ws -rp $target`;
        setAttr ($target+".originX") $rotatePivot[0];
        setAttr ($target+".originY") $rotatePivot[1];
        setAttr ($target+".originZ") $rotatePivot[2];
        
        $exp+="{float $targetPos[] = {"+$target+".originX, "+$target+".originY, "+$target+".originZ};\n\nfloat $dx = $targetPos[0] - "+$locatorName+".translateX;\nfloat $dy = $targetPos[1] - "+$locatorName+".translateY;\nfloat $dz = $targetPos[2] - "+$locatorName+".translateZ;\n\nfloat $dist = sqrt($dx * $dx + $dy * $dy + $dz * $dz);\nfloat $normMult = 1.0 / $dist;\nfloat $normDx = $dx * $normMult;\nfloat $normDy = $dy * $normMult;\nfloat $normDz = $dz * $normMult;\nif ($dist < "+$locatorName+".distanceThreshold)\n{\n    float $t = ("+$locatorName+".distanceThreshold - $dist);\n    "+$target+".translateX = $normDx * $t;\n    "+$target+".translateY = $normDy * $t;\n    "+$target+".translateZ = $normDz * $t;\n}\nelse\n{\n    "+$target+".translateX = 0.0;\n    "+$target+".translateY = 0.0;\n    "+$target+".translateZ = 0.0;\n}}";
        expression -s $exp -n $expName;
        ++$index;
    }
}

使用方法

  1. キューブ上に分割したポリゴンモデルを用意(Freeze Transform しておく)
  2. ポリゴンモデルのトランスフォームノード選択
  3. 下記 MEL スクリプトを実行


string $selections[] = `ls -sl`;
CreateRepulsiveAnimation($selections);

この MEL を実行すると、locator が作られて、選択したトランスフォームノードに originX、orignY、originZ というアトリビュートが追加されます。ご注意ください。

壁が飛び出る距離の閾値は自動で作られた locator の distanceThreshold というアトリビュートで調整できます。

Maya 粉砕モデル作成ツール改良中

2016/06/25 10:08

昔作った粉砕モデル作成ツールを改良中です。 以下を改善しました。

もし需要があれば、整理して公開するかもですが、まぁ、市販のツール使ったほうが断然効率的です。すごく処理時間かかるし、メモリ食います。

ポリゴン編集系スクリプト実行により Maya がメモリ不足でクラッシュしてしまう問題を回避する

2016/06/11

Maya の polyCut コマンド等のポリゴン編集コマンドは Undo キューのメモリを多く消費してしまいます。

そのため、MEL でポリゴン編集系のコマンドをループで処理するようなスクリプトを書くと、Maya がメモリ不足で落ちることがあります。

当たり前なのですが、これが原因の場合、Undo を無効化すればメモリ不足が原因で Maya がクラッシュすることを回避することができます。

GUI 上からであれば Window メニュの

Settings/Preferences → Preferences → Settings → Undo

から無効化することは可能です。

ただ、デザイナにスクリプトが実行される前にわざわざ無効化してもらうのは難しいので、下記のようにスクリプトで Undo を無効にしてから、処理後に元の状態に戻してあげるのが良いです。


// 処理をする前に、デザイナに対して、Undo できなくなることを警告して承認をもらうようにした方がいい
// ...

// 今の Undo 有効/無効状態を保存しておく
int $is_undo_enabled = `undoInfo -q -state`;

// Undo を無効化
undoInfo -state off;

// ...
// ポリゴン編集系のコマンド処理
// ...

// Undo 有効/無効状態を処理前に戻す
undoInfo -state $is_undo_enabled;

これの弊害により、当然スクリプトで実行される処理が戻せなくなるので、処理前にポリゴンをデュプリケイトしてバックアップを取るなりしておくのが良いです。

Maya パーティクルインスタンシング周りで思い出したことのメモ

2015/08/21

数年ぶりにMayaのパーティクルを触って、ほとんど記憶がなくなっていることに気が付きました。昔普通にやっていたことがどうやるんだっけ状態でした。ということで思い出したやつをメモっておきます。

パーティクルのインスタンスモデルをある1つの軸だけ回転させる
1. ParticleShape のアトリビュートエディタで RotationXyzPP (名前は適当)という vector 配列のPer Particleカスタムアトリビュート追加
2. Particles → Instancer のダイアログで Rotation に RotationXyzPP アトリビュート指定
3. Runtime Expression で下記のようにすると x 軸だけ回転できる

vector $rot = particleShape1.RotationXyzPP;
particleShape1.RotationXyzPP = <<$rot.x + 10.0, 0.00, 0.0>>;


Instancer に複数のモデルを登録して表示する
1. ParticleShape のアトリビュートエディタで Index (名前は適当)という float 配列のPer Particleカスタムアトリビュート追加
2. Creation Expression で下記のように書いてパーティクル生成時にIndexがモデル数の中で適当に割り振られるようにする

Index = id % 4;

3. インスタンス化するモデルをすべて選んで、Particle → Instancer のダイアログ開く
4. Object ID のところに先ほど作った Index を指定してInstancerを作るとパーティクルそれぞれに複数のモデルが割り当てられる

Maya 花の開花アニメーション用リグ

2015/07/19 09:00

Maya で花が咲くアニメーション用のリグを作ったので、作成過程を載せておきます。リアルタイムレンダリング用モデルなのでローポリです。

まず、花びら一枚で開閉するリグを作りました。

それをリファレンスで読んで、花びらリグを4個並べました。

さらにこのファイルをリファレンスとして別のファイルで複数読み込んで上記の動画のようなリグになりました。

リファレンスで読む単位は花びら一枚にしておくと、リグに問題があったときに、修正範囲が一枚分で済むので安全です。ただし、その反面、花びらそれぞれに個性がないです。何か変形させるなどで個性をつけるようなアトリビュートを追加してリファレンスを読んだ側で調整すればその辺りは解決しそうです。

Maya 子階層ジョイントにスケールを反映させる

2015/07/19

Maya でジョイントのスケールを下の階層のジョイントスケールにも反映させる方法をたまに忘れてしまうので、備忘用にメモしておきます。

子階層ジョイントのアトリビュートの Segment Scale Compentsate のチェックを外せば OK。

Maya 連番Objファイルをエクスポートするスクリプト

2015/07/15

毎回自作プログラムに.objのジオメトリアニメーションをロードするために、Mayaから1フレームずつモデルをエクスポートするのが面倒だったので、.obj形式の連番ファイルをエクスポートする Python スクリプトを書きました。

誰かの役に立つかもしれないので貼っておきます。

選択中のモデルを現在のタイムスライダーの区間内すべての整数フレームでobjエクスポートします。 オプションは全部オフにしてあるので、必要であれば、export_optionsの文字列を編集して下さい。


import maya.cmds as mc;
import maya.mel as mel;

def ExportSelectionAsObjFileForAllFrames(export_dir, file_name_without_ext):
	min_time = mc.playbackOptions(minTime=True, q=True);
	max_time = mc.playbackOptions(maxTime=True, q=True);
	export_options = "groups=0;ptgroups=0;materials=0;smoothing=0;normals=0";
	for frame in range(min_time, max_time + 1):
		mc.currentTime(frame);
		file_path = "%s/%s-%04d.obj"%(export_dir, file_name_without_ext, frame);
		mc.file(file_path, force=True, options=export_options, typ="OBJexport", pr=True, es=True);

export_dir = "D:/Oputputs";
file_name = "object";
ExportSelectionAsObjFileForAllFrames(export_dir, file_name);
0  1  2  3  4  5  6  

にほんブログ村 ゲームブログ ファイアーエムブレムへ にほんブログ村 デザインブログ コンピュータグラフィックスへ

0.0531 sec

Copyright(C)2006-2018 wsp All Rights Reserved