ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

MAYA ぷろぐらみんぐコミュのMLL 質問箱

  • mixiチェック
  • このエントリーをはてなブックマークに追加
「MEL 質問箱」があるので分けておこうかなと作ってみました。

プラグイン関係はこちらに〜。

コメント(69)

プログラムは本業でないのですが、
大量の情報を操作するとmelでは遅いので
MayaAPIで頂点情報を編集するコマンドを作成しています。

そこそこ順調に進んでいたのですが、
ついにどうにもわからないところがでてしまい困っています。
もしよろしければ諸先輩方のご意見を聞けたらと思い、
勇気をだして質問させていただきたいと思います。

このコマンドはメッシュを選択して実行すると、
以下のようなコネクションを作成します。

 【オリジナルを複製したメッシュ】→【自前ノード】→【オリジナルのメッシュ】

自前ノードの値を変更すると、下流のメッシュから頂点カラー情報を取り出し、
必要な計算を済ませ、上流のメッシュに反映するというところまでできました。


困っているのは、このコネクション作成直後にUndoした場合です。
以下の二点が完全に戻らず、困っております。

・computeで使用している、MFnMeshの.setFaceVertexColorsがundoされない
・複製したメッシュが削除されない


質問の仕方からして自信がありませんが…。
簡単で構いませんので、ご教授ください。
よろしくお願いします。
ものすごく根本的な質問です。

自分の環境はXP32-bitしかないのですが、
Vista64-bitのMaya用にプラグインをコンパイルすることは、果たしてできるのでしょうか?

よろしくおねがいします。
Visual Studio 2005での話になりますが。

プロジェクトのプロパティを開き、構成マネージャのボタンを押してください。
そして、プラットフォームの項目が「Win32」となっているところから「新規作成」を選んでください。
次に表示されたダイアログから、新しいプラットフォームを
X64を選択して追加すればx64用のビルド設定ができます。

また、X64用のコンパイラをインストールしていない場合は先にインストールを行ってください。
「プログラムの追加と削除」から変更と削除を行い「機能の追加と削除」で追加できます。
x64用コンパイラは「言語ツール>Visual C++>X64コンパイラおよびツール」です。
>しばさん
どうもありがとうございます!早速見てみたのですがプラットフォームにはWin32と<空>しか無く
「プログラムの追加と削除」にもそれらしい設定はありませんでした。

調べてみるとExpressEditionはx64コンパイルは普通な方法では対応していないみたいです。
(すみません、聞く前に調べておくべき箇所でした)

でも64bit VistaにはExpressをインストールできるみたいですね。


ということは
-VisualC++ standardを買う
-Vista 64-bitを購入して、そこにExpressをインストールする
の2つの方法があるということ・・・であってますでしょうか?

よろしくおねがいします。
Expressは使ったことがないので、何とも言えません。

Standard Editionは、
http://www.microsoft.com/japan/msdn/howtobuy/vs2005/editions/stdexp/#stdexp_feature
を見る限り、X64コンパイルに対応しているようです。
>しばさん
Standardを買うことはなさそうなので、あきらめました。ありがとうございました。
MPxLocatorNodeでノードを作ったのですが、
displayLayerで色を変えてもDrawing OverridesでColorを変えても反映されません。
画像の球のようにDrawing Overridesが反映するようにしたいのです。

devkitに入っているfootPrintNodeというサンプルノードもコンパイルしてみたのですが
色変更を無視します。

自分が書いてるのはこの方法なのですが
http://maya.robthebloke.org/MPxLocators.html
やはりだめです。

何か特殊な方法が必要なのでしょうか?ご存知の方いらっしゃいましたらご教授ください。
64ビットのプラグインを正しくコンパイルするには64ビット版Mayaのライブラリ(lib)とリンクしなければなりません。ですので気をつけなければならないのはコンパイラだけではありません。
>ikatnekさん
了解です。
完全に諦めました。
array 型のプラグの長さを API で短くする(要素を消す)方法ってありますか。
MPlug::setNumElements() がそれっぽいのですが、残念な結果に、、

MPlug plug;
plug = ... ;

if( plug.isArray() ){
std::cerr << "plug.numElements() << std::endl; // 5
plug.setNumElements(0);
std::cerr << "plug.numElements() << std::endl; // やっぱり 5
}

------
MEL で、
MPlug elementPlug = plug[0]; // 例: 0 番目の要素

MString commnad = "removeMultiInstance -break true " + elementPlug.info();
MGlobal::executeCommand( command );

とやると消えるので問題は無いのですが、見た目がちょっと、、
MFnSkinCluster:: setWeightsを使用しているのですが
値をバーテックスごとではなくArrayとかで一気にセットすることは出来ないのでしょうか??

getする時は比較的速いのですが
バーテックスもしくはインフルエンスの数が増えるのに比例して異常に重くなってしまうのですが。。
何か良い方法は無いでしょうか?
よろしくお願いします。
setWeights() の引数、normalize を false にすると正規化の計算をいちいち行わないので速くなりそうです。
自分で正規化済の weight を設定するなら false のままで良いでしょう。
正規化済でなくともアトリビュート normalizeWeights を false にしてから値を設定して true にすると一気に再計算してくれそうです(未確認)。

weight の値を全て把握できているならアトリビュート weightList, weights を直接操作するという手もあるかと。
>麦角さん
normalize は常にfalseに設定して処理をさせていたのですが
高速化の実感はありませんでした。

weightの値はすべて把握しているので
weightList, weightsを調べてみたいと思います。

ありがとうございます!
別のコミュニティでも質問させてもらったのですが、
プログラミングはこちらでということで質問です。

あるプログラムをCで書いているのですが、その中でMayaを操作したいと思っています。
具体的には、Cの中でループをまわしており、そのループの中で
  1.シーンを読み込む
  2.movファイル(動画ではなくモーションデータ)をインポートする
  3.シーンを保存する
という操作をしたいので、いろいろな人のアドバイスから、Mayaの部分はバッチモードで処理することを考えました。
ところが、上記の2の部分はMELを使っているのですが、そのMELがバッチモードでは
   defineVirtualDevice
   readTake
のコマンドがバッチモードでは使用できないと、エラーを出してしまいます。

そこでまたアドバイスをいただきまして、スタンドアローンなC++アプリの readAndWrite を参考に
進めようと思ったのですが、C++の中でmovファイルのインポートは可能でしょうか?
あるいは、他に良い方法はあるでしょうか?
一度 readAndWrite のC++から MGlobal::executeCommand() でMELを実行しようと思ったのですが、
うまく動いてくれません。仮に動いたとしても、やはりバッチモードでエラーが出そうな気もしますが・・・

よろしくお願いします。
> かめさん

よく状況がわからないですけど、なぜmovファイルをインポートするのにdefineVirtualDevice と readTake がいるのですか?
普通にfileコマンドとmoveInを使えばよいのでは?

答えは今までに細切れであっても出ていると思うのですが、かめさんの取っ掛かり地点が間違っているか、きっかけになる知識が足りないかのどちらかのような気がします。

プログラムを書く前に、Mayaを起動し、バッチで行いたいことを実際にインタラクティブに操作しながら、スクリプトエディタに出るコマンドを確認してはいかがでしょう?

ここで出たコマンドは、Mayaのバッチモード(cmdプロンプト開いてmaya -promptとして起動)で同じように使えます。

Cを使わなくとも完結すると思いますよ。
> ikatnekさん

ありがとうございます.
Mayaに関しては(というかCGに関して)まったくの初心者です.
本来なら基礎から学ぶべきなのですが,時間の都合上必要な部分のみを操作しています.

movのインポートするMELスクリプトも,サンプルのものを動かしていただけなので
moveInコマンドを使って取り組んでみます.
はじめまして、ほっちんです。
最近、mayaのplug-inの勉強を始めたのですが、行き詰ったので質問させてもらいます。

■開発環境
Windows XP SP3
Visual Studio 2005
Maya2008

■やりたいこと
ポリゴン(今はplane)の頂点全てに、定めたフレームの間、毎フレームごとにキーフレームを打ちたい。

■今の状況
ポリゴンを選択して、そのポリゴンの頂点にキーフレームを打つことはできています。
複数のフレームに対して同じことを行うと、複数のフレームにキーフレームは打てるのですが、
一番最後のフレームの頂点情報で全てのフレームに対しキーを打ってしまっています。

■解決したい問題
フレームごとに設定した頂点情報に対して、きちんとキーフレームを打てるようにしたい。

■ソースコード
あまり長いコードではないので、実際作業してるとこすべて載せます。

MStatus vertexMove::doIt( const MArgList &args)
{
  //引数について
  int frameNumber;  //キーを打ちたいフレーム
  unsigned index;
  index = args.flagIndex( "f", "frame" );
  if (MArgList::kInvalidArgIndex != index )
    args.get( index+1, frameNumber );

  MSelectionList selection;
  MGlobal::getActiveSelectionList( selection );
  MItSelectionList iter( selection, MFn::kMesh );

  //選択しているポリゴンメッシュすべてについて
  for ( ; !iter.isDone(); iter.next() ) {

    MDagPath path;
    iter.getDagPath(path);
    MFnMesh meshFn(path);
    MPointArray vertexArray;
    meshFn.getPoints(vertexArray, MSpace::kWorld);

    //頂点の位置のための変数
    double height = 5;

    //とりあえず、今は3フレーム分だけに対してキーフレームを打つ
    for ( int i = frameNumber; i <= frameNumber+2; i++) {

      /*
        頂点の移動
        キーフレーム打つときのフレームと同じ番号の頂点の位置を少し上げる作業
       */
      for (unsigned int j = 0; j < vertexArray.length(); j++ ) {

        //ここに頂点の新しい値を入れる
        //現在のフレームと同じ頂点が高くなる
        if (i == j+1) {
          vertexArray[j].y += height;
        } else {
          vertexArray[j].y = 0;
        }

      }

      meshFn.setPoints(vertexArray, MSpace::kWorld);

      //キーフレームを打つ
      MString cmd;
      cmd = MString("setKeyframe -t ") + i + " " + path.fullPathName()
             + MString(".vtx[0:") + vertexArray.length() + "]";
      dgMod.commandToExecute( cmd );

    }
  }

  return redoIt();
}


拙い説明で分かりにくいかと思いますが、
もしご存知の方がいましたら是非教えていただきたいです。
よろしくお願いします。
すみません、前の質問は自己解決したので削除させていただきました。


と、前の質問が解決したことで新たな問題が出てしまったので質問させてください。

3Dでモデルを作った際、アニメーションさせようとボーンをいれたとします。

すると、

shape|chara
shape|charaOrig

とアニメーションしているモデルの頂点情報(おそらく現在選択されているキーフレームでの)とアニメーションしていない状態のモデルの頂点情報が出てきています。


どうやってアニメーションしている頂点情報とアニメーションしてないオリジナルの頂点情報を判定すればいいのでしょうか?
教えてください。よろしくお願いします。
かなり初歩的な質問かと思いますが。。

MFnTypedAttribute(kNurbsCurve)のアトリビュートをつくり(例えばinputoCurveなど)
MDataBlock以外からカーブを収得する方法は無いでしょうか?
うまく収得できないもので。。。

よろしくお願いします。
こんにちは。

現在独自フォーマットへのコンバーターを書いているのですがMFnMeshからインデックス情報を取得するにはどのようにすればよいのでしょうか?

よろしくお願いします。
ゆ〜たさん>
おそらく自分の探している情報はfaceだと思います。MFnMeshを使ってvertex情報を取得していたのですがイテレータでも取得できるのですね。
試してみます!ありがとうございました。
はじめまして!
WIN版の8.5を使用しています

ノードのアトリビュート(jointのrotateなど)を1フレーム毎に取得したいと考えています
現在は MAnimControl::setCurrentTime( MTime ) でフレームを1つずらして MPlug::getValue( float ) で値を取得しているのですが、これでは時間がかかりすぎます
MPlug::getValue( float, ctx ) で時間を指定するやり方だと、クリップでアニメーションしているアトリビュートの取得がおかしかったので使えていません
(それでなくてもほとんど速度変化はありませんでした)

MELのbakeSimulationなどでは高速にキーが打たれているのでもっと速く値を取得する方法がありそうなのですが、思いつきません
何か良い手はないでしょうか?
Contextが使えない理由なんでしょうねー。誰かがtime1.outtime参照してたりviewFrame()使ってたり、いくつか考えられないこともないです、全然違う理由かもしれませんが。

つまらない方法ですがフレームずらしてもノードが評価されなければ時間は(あまり)かからないのでviewに何も描画されないようにしてしまうのが手っ取り早いかも。attribute editorやchannel boxが悪さして遅くなるかもしれないので選択はなしにしといた方がいいです。あるいはノードの構成が定まっているなら地道に上流ノードを辿ってアニメーションさせてる機構をプログラム上でシミュレートするか、思いつく限りそれくらいですねー。
ぼけ老人さん>
ご返答ありがとうございます

描画自体は止めてるんですが、単純にプレビュー再生した時より高速にならない状態です
単純にシミュレーションに時間が掛かっているだけかも知れません

ノードの構成は不定なのですが、頻度はある程度読めるので、ケースbyケースで最適化してみます
ありがとうございますー
ホソダさん、

devkitにあるサンプルプラグインのsolution fileを開いてビルドするとどうなりますか?
エラーの内容など詳しい状況を書くと回答がしやすくなると思います。
質問させてください。

プラグインに挑戦しようと思っているのですが超初心者で、よく分からない事ばかりで・・

Visual c++ 2008 Express Edition で、MayaPlugInWizardを使う事はできるのでしょうか?

手順はMayaのマニュアル、Readmeのテキストや、29番のにんじん@sydney さんの手順も参考にさせてもらったのですが、新規作成>プロジェクトにMayaPlugInWizardが現れません・・・

どなたかご教授よろしくお願いいたします。

string $t ="dd";
string $q ="none";

if(`gmatch $t "bb*"`)
{
string $q ="no1";
}
else if(`gmatch $t "cc*"`)
{
string $q="no2";

}
else if(`gmatch $t "dd*"`)
{
string $q ="no3";

}

print $q;

////////////////////////////////////

$tの中身がどれかのgmatchに適合したら
そこで変数 $qを変化させたいです。
どのような形に直せば良いでしょうか?

よろしくお願いします。

////////////////////////////////////
pocariさん、

gmatchの代わりにmatchを使いましたが、こんな感じでどうですか?matchのほうが正規表現が細かく指定できるので便利かもしれないです。アスタリスクの意味もgmatchとmatchでは微妙に違うみたいですし。

string $t = "dd";
string $q = "none";

if(size(`match $t "bb*"`))
$q ="no1";
else if(size(`match $t "cc*"`))
$q="no2";
else if(size(`match $t "dd*"`))
$q ="no3";

print $q;
助かりました、ありがとうございました。
>かんばらさん

すみませんあせあせ(飛び散る汗)
随分遅くなってしまいましたが、返答ありがとうございます。

やっぱり駄目だったんですね
残念ですが、すっきりしましたあっかんべー

ログインすると、残り38件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

MAYA ぷろぐらみんぐ 更新情報

MAYA ぷろぐらみんぐのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング