2

Maya で 3D ツリーを作成しました。MEL コードを for ループで実行し、必要な数のツリーを生成する必要があります。Maya で作成されたモデルを、ツリーを再構築する MEL コードに変換する方法はありますか?

スクリプトはツリーを最初から生成する必要があるため、複製することはできません。残念ながら、履歴が面倒だったのでクリアしました。そのため、ジオメトリだけを指定して MEL コードを生成する方法を探しています。

4

1 に答える 1

2

履歴を削除してしまったのは少し残念です。そうでない場合は、履歴ツリーのスクリプトを作成するだけで済みます。しかし、すべてが失われるわけではありません。それでも、ある時点で履歴を作り直す場合に備えて、これを行う方法を説明します.

履歴の複雑さは、少なくともモデル化するときは、実際には問題になることはありません。役に立たないことを確認するまで、履歴を削除しないことをお勧めします。1000 のノード履歴を持っていても、そのほとんどが非アクティブであるため、速度が低下することはありません。アニメーションに入ると、それは必ずしも問題ではありません。履歴の削除は少し破壊的であるため、履歴の大きな領域を削除する場合はシーンを保存することをお勧めします。したがって、経験則では、本当に必要でない限り、履歴を削除せず、フリーズ変換操作を使用しません (実際にこれを行うことはないかもしれません)。

別の補足事項:この場合のように人為的な制限がない限り、コピーは引き続き有効です。この制限が有効なのは、これが宿題である場合のみです (この場合、指示に従う意思があることを示す必要があります)。コピーを行っても、最終結果が損なわれることはありません。コピーは mel です (すべての Maya ascii ファイルは一種の mel です)。

方法 1: (履歴が消去された場合)

問題を通常のリギング操作に減らすことができます。作成したツリーにボーン、クラスター、場合によってはブレンド シェイプを使用してリグを作成します。次に、コピー操作ごとにリグのチャンネルをランダム化します。ここで素晴らしいのは、別のベース ツリーを使用してスクリプトを簡単に拡張できることです。新しい別のリグを作成するだけです。

ここでのボーナスは、風などに吹かれる木を簡単にアニメートできるようになったことです.

これは、割り当ての範囲外の何かのように感じるかもしれません。ただし、優れた MEL プログラマは実際にはタスクを分離しません。ノードを使用して何かを行うことは、コードですべてを記述するのと同じくらい有効です。このようなものは、Maya の使用と Maya プログラミングの完全な理解を示しています。一方で、すべてのユーザーが啓発されているわけではありません (ほとんどはそうではありません)。

Maya のすべてがリグであるか、少なくともリグである必要があります。(補助的に、メルがリグを構築するように努力するか、API を使用してノードを作成する必要があります)

方法 2: (履歴が消去された場合)

結果をバラバラにします。次に、ルールベースのジェネレーターのようなLシステムでチャンクの位置をランダム化します。全体を L-system で生成できるのに、手作業でモデル化した部分で L-system を使用するのは直観に反するように思えるかもしれません。しかし、クランキングによって、非常に単純な l-system を構築することができます。最終的な結果は、いくつかの点でオリジナルの芸術的完全性を保持しており、はるかに満足できるものです。

これと方法 3 のわずかに異なるバージョンは、モデル内で 2 ~ 3 個の重複するブランチのセットを作成し、バリエーションのためにブランチをランダムに削除することです。

方法 3: (履歴が消去された場合)

チート、まあ、CG ではチートなどというものは存在しないと私は実際に主張します。同じツリーをコピーして、回転とスケールを変更するだけです。そして、新しいシェーダーをモデルにランダム化します (異なる葉のテクスチャを異なる色に交換するなど)。わずかなリギング アプローチと組み合わせると、木が 1 本しかないという事実を完全に隠すことができます。コピーは、格子か何かで形作られるかもしれないほど正確である必要はありません。これは実際には非常に効率的ですが、ほとんどの人は気付かないでしょう。

方法4:(履歴がクリアされていない場合)

何かを手動でモデリングすると、Maya はこれを非常に効率的に記録します。履歴は、ほとんどまたはまったく労力をかけずにスクリプトに変換できます。最高の秘密。この種のシーンを Maya ascii として保存すると、maya ascii ファイルは (ほとんど) ただの mel になります。変数をストリームに追加して mel にインストルメント化することで、これを繰り返すことができます。すべてのツールが意味のある履歴を作成するわけではないことに注意してください。ポイントの微調整は、最終的にシェイプ微調整配列になる手動のポイント微調整ではなく、クラスターで行う必要があります。

ノード内の接続と値をチェックしてコードで再現する mel スクリプトを使用して、mel を自動的に構築することもできます。良い点は、気軽に楽器を導入できることです。これは非常に古いバージョンのコードです (たとえば、シェーダーと inputComponents を処理する必要があります)。

/* jooConvertNodeNetworkToMelLadder.mel  0.0

  Authors:     Janne 'Joojaa' Ojala
  Testing:     Has known bugs, code deprecated, no bug reporting
  Licence:     Creative Commons Attribution-ShareAlike 3.0 Unported
  About:

  A deprecated early version of code generation it has some bugs and
  is nowhere near perfect but you can have this code for the heck of
  it. Main thing missing is that it does not check for selection 
  sets for nodes so you need to make those manually.

  Install Instructions:

  copy jooConvertNodeNetworkToMelLadder.mel to your maya script 
  directory

  Usage:

  Select node and run jooConvertNodeNetworkToMelLadder from mel 
  commandline.

  Deprecated at 31.12.2006
*/

proc string generateAttrib(string $node, string $createNode,
                           string $attrib,string $varName){
  string $return="";
  if (getAttr($node + "." + $attrib) != 
      getAttr($createNode + "." + $attrib))
    $return = ("  setAttr (" +
                $varName + "+\"." + $attrib+"\") "+
                getAttr($node + "." + $attrib) + ";\n");
  return $return;
}

proc string doOneNode(string $nodeOrig,string $connections[]){
  string $hist[]=`listConnections    -c 1 -p 1 $nodeOrig`;
  string $return="";
  $type=`nodeType $nodeOrig`;
  $varName=("$"+$nodeOrig);
  $createNode=`createNode $type`;
  $return=("  "+$varName+"=`createNode -n "+$nodeOrig+" "+$type+"`;\n");
  if ($type != "mesh") {
      for ($attrib in `listAttr -settable -multi -w -scalar $createNode`){
          $return += generateAttrib($nodeOrig, $createNode,
                                    $attrib, $varName);
      }
  }
  delete $createNode;

  for ($i=0;$i< size($hist);$i=$i+2){
    if (size(`connectionInfo -dfs $hist[$i]`)){
      string $node,$port,$type,$nodeOrig,$portOrig;
      $node=`match "[^.]*" $hist[$i+1]`;
      $port=`match "[.].*$" $hist[$i+1]`;
      $nodeOrig=`match "[^.]*" $hist[$i]`;
      $portOrig=`match "[.].*$" $hist[$i]`;
      $connections[size($connections)]= 
      ("  connectAttr -f ($" + 
        $nodeOrig + "+\"" + $portOrig + "\") ($" +
        $node+"+\""+$port+"\");");
    }
  }

  return $return;
}

global proc jooConvertNodeNetworkToMelLadder()
{
  print "\n// jooConvertNodeNetworkToMelLadder result:\n{\n";
    string $a[]={};
    for ($node in `listHistory`)
    print(`doOneNode $node $a`);
    print $a;

  print "}\n";
}

しかし、これが私に時間があるすべてです。これが役に立てば幸いです。

于 2014-04-21T13:49:34.970 に答える