Maya 3d 攻略のヒント
「有 ベストショップ」  営業品目    1:PLCプログラム、メカ設計 機械図面から3D動画作成致します、見積もりは無料で致します。
   2:アプリケーション開発、マイコンボード設計

   開発実績 オリジナルアプリケーション アルゴちゃん、フードマン 電気機関車試験プログラム 

次のページに移動します

Maya 3Dスーパーテクニック Maya 3Dモデリング スーパーテクニック Maya スタジオプロジェクト Dynamics
Mayaで作成するリアルな大地、風、火、...
3DビギナーのためのMaya
MAYA 3D 共用掲示板

MAYA 3d 攻略のヒント
コーレル株式会社 Corel ストア
マウスコンピューター/G-Tune
  • MAYA 2011 で作成した蒸気機関車のメカの動きが出来上がりました、現在ユーチューブで公開中です。
    画質は高画質です、是非ご覧ください。
    ユーチューブへ

    このような動きは日本国内においていくら探しても見つかりませんでした、多分私が最初の人だと思います、今後皆さんの中から独創的な動きを行える方が多く出てくるのを私は望みます、又少しでもその方たちの力になれば幸いです、宜しければご覧ください。
    動作の方法をご説明いたします。
    最初に大事な事を言いますので直ぐにでも実行して下さい、それは英文メユーを絶対使わなければ行けません、日本語メニューは単に表面のほんの一部にしか過ぎないからです、私はだいぶ時間をロスしました、あなたは必ず英文のコマンドに遭遇してしまいます、その時に意味を調べるほど馬鹿らしい事はありません、だから日本語メニューは忘れてください。


    まず制御概要を簡単にご説明致します。

    私の場合は作成したジョイントにロケータを組み込みますが、コンストレイン>ポイントで設定を行いますこの時大事な事はフリーズしない(ロケータを配置したその位置を0にしない)でおきます、なぜかと申しますとAPIで位置移動する場合にリロケータブルになり絶対値では移動できないのです、すべてオフセット量になるようですこれはMAYA側でそうなっているようです。API側で一度すべてのロケータのパスをMAYAから取得します、これには作業するのに必要なすべての情報が含まれています、よって最初に取得していさえすれば後で何でも出来てしまいます。

    この構造体は以下のようなものにします。

    typedef struct DF1{
       int cuntNm;
       MDagPath mDagPath;
       MString mDagPathName;
       MString mFullPathName;
       MString mtypeName;
       MString mLocateNamber;
       //================================
       //================================
       double tax,tay,taz;//トランスレーション
       double tbx,tby,tbz;//ロテーション
       double tcx,tcy,tcz;//スケール
       //================================
       bool frg;
    }s_LocControl

    上記の構造体にすべての情報を取得してしまいます、この配列としては2〜3千あれば大抵の場合問題が無いでしょう。
    下記はMELのプログラム内容で、私の場合下記のようにキーを設定しています
    //=============================================================
    //T2120シリンダー制御コントロールMELプログラム
    //=============================================================
    global proc RotationHoil)
    {
    //===================================
    float $degLZ= 0.0;
    float $degRZ=90.0;
    float $degZ= 0.0;

    //===================================
    string $locator[18];
    $locator[0] ="locator1" ;
    $locator[1] ="locator2" ;
    $locator[2] ="locator3" ;
    $locator[3] ="locator4" ;
    $locator[4] ="locator5" ;
    $locator[5] ="locator6" ;
    $locator[6] ="locator7" ;
    $locator[7] ="locator8" ;
    $locator[8] ="locator9" ;
    $locator[9] ="locator10";
    $locator[10]="locator11";
    $locator[11]="locator12";
    $locator[12]="locator13";
    $locator[13]="locator14";
    $locator[14]="locator15";
    $locator[15]="locator16";
    $locator[16]="locator17";
    $locator[17]="locator18";

    //===================================
    string $locatorVen[20];
    $locatorVen[0]="locator48";
    $locatorVen[1]="locator46";
    $locatorVen[2]="locator23";
    $locatorVen[3]="locator81";
    $locatorVen[4]="locator40";
    $locatorVen[5]="locator86";
    $locatorVen[6]="locator65";
    $locatorVen[7]="locator80";
    $locatorVen[8]="locator62";
    $locatorVen[9]="locator53";
    $locatorVen[10]="locator49";
    $locatorVen[11]="locator47";
    $locatorVen[12]="locator87";
    $locatorVen[13]="locator25";
    $locatorVen[14]="locator41";
    $locatorVen[15]="locator82";
    $locatorVen[16]="locator84";
    $locatorVen[17]="locator83";
    $locatorVen[18]="locator56";
    $locatorVen[19]="locator57";

    //===================================
    //左動輪
    //===================================
    string $hoilLeftName[4];
    $hoilLeftName[0]="polySurface81";
    $hoilLeftName[1]="polySurface79";
    $hoilLeftName[2]="polySurface80";
    $hoilLeftName[3]="polySurface20";
    //===================================
    //右動輪
    //===================================
    string $hoilRightName[4];
    $hoilRightName[0]="polySurface72";
    $hoilRightName[1]="polySurface71";
    $hoilRightName[2]="polySurface82";
    $hoilRightName[3]="polySurface21";

    //===================================
    //===================================
    string $WheelAxle="polySurface481";

    //===================================
    //===================================
    //===================================
    float $rop;
    float $time=0.0;
    //===================================
    for( $rop=0.0;$rop <3600.0;$rop++){
    currentTime $time ;
    $time+=0.1;
    //==================================
    //==弁回転部が付属する軸を回転する==
    //==================================
    select $WheelAxle;
    setAttr ($WheelAxle + ".rz") $degZ;
    setKeyframe -at "rz" $WheelAxle ;

    //==================================
    //=============動輪を回転する=======
    //==================================
    for ($hol=0;$hol<4;$hol++){
    select $hoilLeftName[$hol] ;
    setAttr ($hoilLeftName[$hol] + ".rz") $degLZ;
    setKeyframe -at "rz" $hoilLeftName[$hol];

    select $hoilRightName[$hol] ;
    setAttr ($hoilRightName[$hol] + ".rz") $degRZ;
    setKeyframe -at "rz" $hoilRightName[$hol];
    }
    //==================================
    //============ピストンロケータを確認=======
    T2120_LocaterControl; //ここでプラグインを呼び出しています。
    //==================================
    //==================================
    for ($hol=0;$hol<18;$hol++){
    select $locator[$hol];
    string $lNameA=$locator[$hol];

    setAttr ($lNameA+".tx") `getAttr ($lNameA+".tx") `;
    setAttr ($lNameA+".ty") `getAttr ($lNameA+".ty") `;
    setKeyframe -at "tx" $locator[$hol];
    setKeyframe -at "ty" $locator[$hol];
    }
    //==================================
    //==============弁ロケータを確認========
    for ($hol=0;$hol<20;$hol++){
    select $locatorVen[$hol];
    string $lNameA=$locatorVen[$hol];

    setAttr ($lNameA+".tx") `getAttr ($lNameA+".tx") `;
    setAttr ($lNameA+".ty") `getAttr ($lNameA+".ty") `;
    setKeyframe -at "tx" $locatorVen[$hol];
    setKeyframe -at "ty" $locatorVen[$hol];
    }
    //==================================
    //============回転角度を加算========
    $degRZ+=1.0;
    $degLZ+=1.0;
    $degZ +=1.0;
    };
    }
    私の現在の動きとしてはスクリプト側で1度(0.1度でも構いません)回転してプラグインの関数を呼び出し、関数側では動輪が回転した回転角度(単位はラジアン)情報から現在の回転角度を取得してその取得した回転角度データに1度加算してロケータを移動(ポイントコンストレインなので配置したジョイントはそのロケータに追従して動きます)し終了します、その後スクリプト側では現在のロケータ位置情報をMAYAから取得してキーフレームを設定する。
    以上のような流れです、参考までにAPIは非常に高速に処理しますので時間はMAYA側の処理時間になります、デバックに付いては更に後でご説明致します。

    注意
    ジョイントボールを直接移動しようとしましたが色々訳の解らない事象に遭遇し困惑しました、その後色々試行錯誤した結果においてロケータを直接API側から直接移動する方法が好ましいと判断しました、又動作確認時において何か移動に問題がある場合に配置したロケータとジョイントボールとの離れている様子から色々推測できるのです(MAYAのバグもあります)。

    今後説明するAPIのプログラムはかなり有効な関数構造をしているために基本として色々な方向に応用が利くものと判断しています、理由は全てのデータ構造はMAYA上において構造体的に配置され、これは即ちDAGパスが全てだからです、皆さんの応用に期待したいと思います、私の開発環境はVC2500ですMAYAのサンプルアプリケーションの構文を見るとかなり古い形式が多々見つかりますのでもし皆さんの開発環境が古くても問題はないと思います。

    大きなネックはバグの方法ですが、私の場合MAYAデータ構造を自分で仮想的につくり仮想のプログラムで追いかけます、多分皆さんも三角関数の処理が多くなると思います、モデリング内部にORGN(基本原点)のロケータを配置しておきその差分を計算してその差分をロケータに加えて移動するような感覚になります、又内部の計算においては符号付きの計算が主体になりますので錯覚に陥りやすくなりますので注意してください。

    cout<<...で画面上に出力してそのデータを仮想プログラムに設定してデバックしていきます、この方法も詳しく説明していきたいと思います。
    下記ではMAYAのモデリングに対応したロケータを定義しています
    //=============================================================================
    //=============================================================================
    //=============================================================================
    #define DRIVING_RIVING_WHEEL_SHAFT_DIAMETER 0.417569/2.0 //動輪シャフト直径 弁制御用

    //=============================================================================
    //=============================================================================
    //=============================================================================
    //各ロケータの定義
    //各ジョイントが各ロケータに割り振られている、そのため特定のロケータを移動する事により
    //特定のジョイントがロケータに追従して動作する
    //============================================================================
    #define NOM1_ORGN "locator20" //動輪前側原点 locator20
    #define NOM2_ORGN "locator19" //動輪中側原点 locator19
    #define NOM3_ORGN "locator21" //動輪後側原点 locator21

    #define LeftTOP_LOC "locator18" //左ジョイント1番locator18
    #define LeftSECOUND_LOC "locator1" //左ジョイント2番locator1
    #define LeftTHIRD_LOC "locator2" //左ジョイント3番locator2
    #define LeftFOURTH_LOC "locator3" //左ジョイント4番locator3
    #define LeftFIFTH_LOC "locator4" //左ジョイント5番locator4
    #define LeftSIXTH_LOC "locator5" //左ジョイント6番locator5 動輪ピストン側の接続点
    #define LeftSEVENTH_LOC "locator6" //左ジョイント7番locator6 左動輪中側
    #define LeftEIGHTH_LOC "locator7" //左ジョイント8番locator7 左動輪前側
    #define LeftNINTH_LOC "locator8" //左ジョイント9番locator8 左動輪後側

    #define RightTOP_LOC "locator9" //右ジョイント1番locator9
    #define RightSECOUND_LOC "locator10" //右ジョイント2番locator10
    #define RightTHIRD_LOC "locator11" //右ジョイント3番locator11
    #define RightFOURTH_LOC "locator12" //右ジョイント4番locator12
    #define RightFIFTH_LOC "locator13" //右ジョイント5番locator13
    #define RightSIXTH_LOC "locator14" //右ジョイント6番locator14 動輪ピストン側の接続点
    #define RightSEVENTH_LOC "locator15" //右ジョイント7番locator15 右動輪中側
    #define RightEIGHTH_LOC "locator16" //右ジョイント8番locator16 右動輪前側
    #define RightNINTH_LOC "locator17" //右ジョイント8番locator17 右動輪後側

    #define LEFT_HOIL_NMBER1 "polySurface81" //左前動輪
    #define LEFT_HOIL_NMBER2 "polySurface79" //左中動輪
    #define LEFT_HOIL_NMBER3 "polySurface80" //左後動輪
    #define LEFT_HOIL_NMBER4 "polySurface20" //左小輪

    #define RIGHT_HOIL_NMBER1 "polySurface72" //右前動輪
    #define RIGHT_HOIL_NMBER2 "polySurface71" //右前動輪
    #define RIGHT_HOIL_NMBER3 "polySurface82" //右前動輪
    #define RIGHT_HOIL_NMBER4 "polySurface21" //右小輪
    //=============================================================================
    //=============================================================================
    //=============================================================================


    //左動輪
    #define LEFT_HOIL_NM1 "polySurface81" //1 前輪
    #define LEFT_HOIL_NM2 "polySurface79" //2
    #define LEFT_HOIL_NM3 "polySurface80" //3
    #define LEFT_HOIL_NM4 "polySurface20" //4 小輪

    //右動輪
    #define RIGHT_HOIL_NM1 "polySurface72" //1 前輪
    #define RIGHT_HOIL_NM2 "polySurface71" //2
    #define RIGHT_HOIL_NM3 "polySurface82" //3
    #define RIGHT_HOIL_NM4 "polySurface21" //4 小輪


    //=============================================================================
    //===================差分を取る為又回転方向の変化を取得========================
    //===================  但し左右は90度遅れて回転する  =======================
    //=============================================================================
    #define GAGE_DOURIN_LEFT "polySurfaceShape148" //停止した位置に この位置からどちらに回転するかで向きを判定する
    //起動時回転情報を取得する

    //=============================================================================
    //================== 中NOM2 動輪軸外周確認位置 =======================
    //=============================================================================

    //=============================================================================
    //=============================================================================
    //===================================NM1//NM2===================================
    //動輪(シリンダーに配置しているロケータで各ジョイントボールにコンストレインされています、但しフリーズ//はしていません)理由は制御がやりにくくなるからです。

    #define LEFT_BENC1 "locator48"
    #define LEFT_BENC2 "locator46"
    #define LEFT_BENC3 "locator23"
    #define LEFT_BENC4 "locator81"
    #define LEFT_BENC5 "locator40"//分岐点1
    #define LEFT_BENC6 "locator86"//分岐点2
    #define LEFT_BENC6_U "locator65"//後 上点
    #define LEFT_BENC6_D "locator80"//後 下点

    #define LEFT_BENC7 "locator62"//外側 中点
    #define LEFT_BENC10 "locator53"//内側 中点
    //=============================================================================
    //=============================================================================
    //=============================================================================

    #define RIGHT_BENC1 "locator49"
    #define RIGHT_BENC2 "locator47"
    #define RIGHT_BENC3 "locator87"
    #define RIGHT_BENC4 "locator25"
    #define RIGHT_BENC5 "locator41"//分岐点1
    #define RIGHT_BENC6 "locator82"//分岐点2
    #define RIGHT_BENC6_U "locator84"//後 上点
    #define RIGHT_BENC6_D "locator83"//後 下点

    #define RIGHT_BENC7 "locator56"//内側 中点
    #define RIGHT_BENC10 "locator57"//外側 中点

    #define BEN_ORGN "locator72"//弁原点

    //=============================================================================
    //=============================================================================
    //=============================================================================
    #define JOINT_23 "joint23"
    #define JOINT_24 "joint24"
    #define JOINT_25 "joint25"

    //=============================================================================
    //=============================================================================z
    //=============================================================================
    上記のように定義しておくと変更が大変楽になります、ファイルの種類はヘッダーファイルです。

    私が皆さんにプログラムの処理流れを説明致します。

    私のAPIが起動すると、すべてのDAGパス及びドライバーを自動的に収集します、これは今現在のモデリングma/mbの拡張子が付いたものを指します、特定のオリジナル構造体にすべて保存されて来ます、その保存された物の中から欲しい機能を検索して特定のドライバーから更にツールを作成し処理します、このプログラムには非常に高い拡張性があります、よってこのアルゴリズムを理解下されば正直どんな物でも出来てしまうと言う優れたものです、私の作成した物(蒸気機関車)も当然この関数を使い作成致しました。

    プロジェクト設定の基本は意外と単純ですなのでご心配なされないで結構です、この環境が出来ない限り開発はできません。

    開発環境設定の概要
    前準備:
          1:MAYAが格納されているフォルダーを探す。
          2:探されたフォルダー内部に(include)(lib)のフォルダーがある事を確認する。
          3:フォルダーの中にdivkitがある事を確認する.。

    第一手順としては上記の事が大事ですので探しておいてください、イメージ画面を表示してもシステムにより異なるために余り意味がないと思うので個々に考えながら進んでください。

    VC++設定に付いての概要
    調整が必要な個所

    1:includeパスを設定する
    2::Libパスを設定する
    3:MAYA基本ライブを入力する。
    4:実行ファイル型式を設定する
    5:入力ファイルを設定する
    6:DLLポートを設定する
    ほぼ上記の内容が必要です、順を追い説明して行きますので付いてきてください。

    次回につずく。

Adobe After Effects トレーニングブック サンプルデータを触りながら学べるハンズオン形式の解説書

新品価格
¥6,090から
(2011/10/5 07:44時点)

inserted by FC2 system