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

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

MAYA ぷろぐらみんぐコミュの欲しいMelScriptをリクエストすると、ものすごい勢いで誰かが答えてくれるトピック

  • mixiチェック
  • このエントリーをはてなブックマークに追加

コメント(124)

>ONOFFさん
snapKeyで済むのでしたらそれが最短ですねw
整数frame毎にkeyを打ちたいのであればbakeResultsを利用するといいでしょうね。

melについてですが既に蓮風さんが指摘しているので割愛させていただこうかなぁと思ったのですが・・・。

>$keyTest = $time % int($time);

これは減算するだけで良いのではないでしょうか。
$keyTest = $time - int($time);

>if ($keyTest != 0)
$keyTestはfloat型なので0と比較すると抜ける可能性が高いです。

autodesk側が提示したいと思われる解決方法で試作してみましたところ、autodeskに問い合わせないといけない点を発見してしまいました、仕方がないのでいつもの苦肉の策で対応できたらいいなぁみたいな的なアドバイスをしておきます。

例のコレですw

if (string($keyTest) != "0")
追記訂正

$keyTest = $time - int($time);

$keyTest =`abs $time - int($time)`;

このほうが安全?
単純に整数フレームに持って行きたいだけなら剰余をこうすればいいだけですね。

$keyTest = $time % int($time);
    ↓
$keyTest = $time % 1;
横より失礼します。。。

はじめまして!MAYA初心者のかきょうと申します!
どうか皆さんのお力をお借りしたいです、よろしくお願いします。

さっそくですが、以下のようなスクリプトを変更、追加してもらえませんか??

// repObj
//
// repObj <オブジェクト名>
//
// 選択したオブジェクト位置にオブジェクト名に指定したオブジェクトを複製して配置します。
// 階層やコンストレインなどコネクションは維持せず、ただ値を参照します。
//
// 使用方法:
// repObj.mel をmaya/x.x/scripts に保存し、script editor もしくは
// command line に repObj と入力・実行します。
//

global proc repObj (string $trgObj) {

string $selection[] = ` ls -sl `;
for($ii in $selection)
{
float $position[] = `getAttr ($ii + ".translate")`;
float $rotation[] = `getAttr ($ii + ".rotate")`;
float $scaling[] = `getAttr ($ii + ".scale")`;

string $target = $trgObj;
duplicate $target;
select $target;

move $position[0] $position[1] $position[2];
rotate $rotation[0] $rotation[1] $rotation[2];
scale $scaling[0] $scaling[1] $scaling[2];

print ("$scl="+ $scaling[0]);

}

}

変更して欲しい所
?“オブジェクト名に指定したオブジェクトを複製”を“ピックで選択したオブジェクトを複製”に
?複製したオブジェクトのみに値を移す。(ピックで選択したオブジェクトは元の位置のまま)

追加して欲しい所
?複製したオブジェクトを初めに選択したオブジェクトの子供にする。
 欲をいいますと、複製する前に“初めに選択したオブジェクトの兄弟にするか、子供にするか”聞かれたら最高です!

詳しい解説付きだと泣いて喜びますっっ
何とぞ、どうかよろしくおねがいします(><;
こんな感じでどうでしょう。わからない箇所があれば説明します。

global proc repObj () {
string $selection[] = `ls -sl`;
string $sel;
for($sel in $selection){
select $sel;
string $newObj[] = `duplicate $sel`;

//ペアレントの確認
string $option = `confirmDialog -title "Confirm" -message ("Do you want parent " +$newObj[0] + " to "+ $sel+"?") -button "Yes" -button "No" -defaultButton "Yes"-cancelButton "No" -dismissString "No"`;
if($option=="Yes")
parent $newObj[0] $sel;
}
}
>Samuraiさん

こんばんわ
コメントありがとうございます!

・選択したオブジェクトを複製して、それをその選択したオブジェクトの子供にするか兄弟にするか選べる。
・複製したオブジェクトのみに値を移す。(ピックで選択したオブジェクトは元の位置のまま)
にかんしてはイメージどうりです^^
ありがとうございます!!

ただ、肝心の

?選択したオブジェクト位置にピックで選択したオブジェクトを複製して配置する。?

というのが出来ません;
画像を用意したので見ていただけると嬉しいです↑

*pCone1〜3をまず選択し、スクリプトを実行。
*次にpCube1をピックで選択、するとpCone1〜3の位置にpCube1が複製コピーされる。(回転の値、スケールの値も移されます)

その後、あとは提示して頂いたスクリプト通りの流れがあれば・・・!

私が上手く説明できず、混乱を招いてしまい申し訳ありません。
またお時間がありましたら、是非コメント頂ければ嬉しいです!
最初に複製したいオブジェクトを選択し、その後、shift+左クリックで複製先のオブジェクトを選択に追加して、コマンドを実行します。

global proc repObj () {
string $selection[] = `ls -sl`;
for($i=1; $i < `size($selection)`;$i++){
string $newObj[] = `duplicate $selection[0]`;
float $pos[],$rot[],$scale[];
$pos = `getAttr ($selection[$i]+".translate")`;
$rot = `getAttr ($selection[$i]+".rotate")`;
$scale = `getAttr ($selection[$i]+".scale")`;
setAttr ($newObj[0]+".translate") $pos[0] $pos[1] $pos[2];
setAttr ($newObj[0]+".rotate") $rot[0] $rot[1] $rot[2];
setAttr ($newObj[0]+".scale") $scale[0] $scale[1] $scale[2];
//ペアレントの確認
string $option = `confirmDialog -title "Confirm" -message ("Do you want parent " +$newObj[0] + " to "+ $selection[$i]+"?") -button "Yes" -button "No" -defaultButton "Yes"-cancelButton "No" -dismissString "No"`;
if($option=="Yes")
parent $newObj[0] $selection[$i];
}
}
>Samurai さん
こんばんわ
再度コメントありがとうございます!
実行してみた所、イメージした通りになりました!
とても助かります!ありがとうございます、ありがとうございますっ

音声データをアニメーションパスに変換するMEL、
どなたかお願いいたします。

無理であれば、その方法についてお知恵をお貸し
ください、、、。

選択中の複数UV座標の中心の値を求めるには
どうしたらよういでしょうか?

宜しくおねがいします。
うぉぉぉここ見忘れてました・・・orz。
一年半以上経ってる超遅レス。

>てい(全部日本人)さん
ありません。
再生をコントロールする程度しか出来なかった気がします。
Pythonでサウンド関連のモジュールを読み込んで解析してください。


>九尾(つづらお)さん
おひさです。
getMinMaxはこんなふうにすると楽かも。
pythonならもっと楽にできるかな。

proc float[] getMinMax_1(float $in[]){
if(size($in)==0) error "Invalid input data size.";
$max=$min=$in[0];
for($i in $in){
$max = $max < $i ? $i : $max;
$min = $min > $i ? $i : $min;
}
return {$min,$max};
}


proc float[] getMinMax_2(float $in[]){
if(size($in)==0) error "Invalid input data size.";
float $array[] = `sort $in`;
return {$array[0],$array[`size $array`-1]};
}

>rtさん

まず結果から。

一回実行してみて出来上がったメッシュのポリゴン数が0だったらエラーにする。

です。

string $list[]=`polyBoolOp -op 3 -ch 1 -useThresholds 1 -preserveColor 0 pCube1 pCube2`;
int $fc[]=`polyEvaluate -f $list[0]`;
if($fc[0]==0){
warning "有効なフェースが存在しませんでした";
undo;
}


ブーリアンで不正な結果になる場合はワーニングメッセージ「// 警告: Cannot perform boolean operation // 」を出しています。
(polyBoolOpのnodeStateオプションの指定次第で変わります)

ただしワーニングはcatchコマンドで拾えません。
scriptJobでもワーニングイベントについては記述されていないようです。

試しにcmdScrollFieldReporterからhistoryを拾って解析してみようかと思ったのですが・・・。


print `cmdScrollFieldReporter -q -text -fst "mel" $gCommandReporter`;

実行結果は「// エラー: オブジェクトが見つかりません: mel。 /」

Pythonも混在してもいいかと変更。

print `cmdScrollFieldReporter -q -text -fst $gCommandReporter`;

実行結果は「」で空の文字列。
文字列の長さや、テキスト選択は成功します。
がしかし肝心の文字列が返ってきません。
(Windows-Maya2009)

結果が返ってきてくれれば実行前と実行後の比較をして新規追加分だけ解析し、ワーニングの文字列「// 警告: Cannot perform boolean operation //」があったらエラーにもできます。

ただこれをやったとしてもブーリアン演算は行われますので、結果として「実行してポリゴン数が0枚ならもとに戻す」という対処で良いとなります。
>rtさん
フェイスカットツールを利用し手動で指定するのであれば、分割したいフェースだけ選択してカットすれば良いのではないでしょうか。

polyCutコマンドを利用する場合はエッジも指定できます。
>rtさん
三角形同士の交差判定のソースを借りてきて(ココ重要)melにしてみました。

2000文字規制に掛かりそうになったので日記にて。
http://mixi.jp/view_diary.pl?id=1786950944&owner_id=130039

これでポリゴン一枚ずつポリゴンの要素の3頂点を抽出しながら判定していけば良いかと。
Mayaの「三角化」を利用して一度三角形に変換してから判定すると楽です。
その際には、「三角化を掛けると新規に作られたエッジは配列にappendされるため、三角化する前のエッジの数を保持しておいて、増えたエッジを削除すると元のジオメトリに戻る」という小技を利用してみてください。
>スー・アンコウさん
URLのmelを読んで見ました。
displayLayer関連のUIのリフレッシュイベントを拾いUIを更新し再描画。
データ自体はgroupPartsノードを作成し保存。

renderLayer用に改造できなくはないと思いますが、不安定さは解消できません。
またrenderLayer自体がナーバスだった経験もあり、厳重かつ丁寧に使うしか無いかもしれません。

また改造するにもソースが長いのと作者の許諾が必要になるため、個人的に変更するか、作者に頼むしか無いかも。

諸問題を解消するためにはAutodeskに直接「階層構造をつけて」と頼む手立てしか思いつきません。
MayaのバージョンによってはQt+Pythonで良い感じに構築できるかもしれませんが、ちょっと時間がかかるかもしれません。(自分に割り当てられているのは2010までのライセンスなのでよくわかりませんが・・・)
動いているキャラクターの一場面を静止画像にしたまま360度回転映像を試みています。
360個のカメラ設定は済ませたのですが、その先は手作業で実行しています。
で、お願いごと・・・

1)一枚の画像が一つのフォルダーに保存されている。
2)「画像」を保存してあるファルダーが連番で360個。
3)360のファルダーが保存している画像の名称は、全て同じ。

このような画像を別の一つのファルダーに連番(シークエンス)画像として抽出、編集できるようなスクリプトは可能でしょうか?
もし可能であれば、教えていただけるととても助かります。

自作のアニメ映像を作る上で、繰り返し使う手法なので、スクリプトで簡略化できると
便利だなぁ・・・とおもい、教えを請うています。
ご存知の方、よろしくお願いいたします。

合掌
>>[121]

ちょっと長くなってしまいましたが作ってみました。

目的のフォルダ下(例えば"D:\texture\test")に複数のシーケンスフォルダがあり、
それぞれの中に同名の静止画ファイルが1つあるという状態で実行。
目的のフォルダ下にその他のデータやフォルダが存在していることは想定していません。
下のスクリプトデータを"makeSequence.mel"というファイル名でスクリプトフォルダに保存し
mayaからスクリプトエディタで以下のように実行して下さい。

makeSequence("D:/texture/test")
※パスはバックスラッシュ"\"ではなくスラッシュ"/"に書き換えて実行して下さい。

testフォルダ下に新規フォルダが作られシーケンスが連番ファイルとして保存されます。
100個以上はテストしていませんが多分動くかと思います。

//--------スクリプト("makeSequence.mel")----------

global proc makeSequence(string $path)
{
string $path=$path+"/";
string $list[]=`getFileList -folder $path`;
int $listSize=size($list);
int $listSizeArray[];
string $listSizeString[];
int $i=0;
for($one in $list)
{
$listSizeArray[$i]=size($one);
$listSizeString[$i]=$listSizeArray[$i];
$i++;
}
string $sequence[]=stringArrayRemoveDuplicates($listSizeString);
int $sequenceInt[];
$i=0;
for($one in $sequence)
{
$sequenceInt[$i]=$one;
$i++;
}
int $sequenceSize=size($sequence);
string $box[];
string $boxAll[];
clear($boxAll);
clear($box);
$i=0;
int $ii;
int $is;
for($is=0;$is<$sequenceSize;$is++)
{
for($ii=0;$ii<$listSize;$ii++)
{
if($listSizeArray[$ii]==$sequenceInt[$is])
{
$box[$i]=$list[$ii];
$i++;
}
}
$box=sort($box);
$boxAll=stringArrayCatenate($boxAll,$box);
clear($box);
$i=0;
}
string $pathFile=($path+($boxAll[0])+"/");
string $firstFile[]=`getFileList -folder $pathFile`;
string $newFileBase=basenameEx($firstFile[0]);
string $newFileEx=fileExtension($firstFile[0]);
string $newFolderPath=($path+ $newFileBase);
sysFile -makeDir $newFolderPath;
for($i=0;$i<$listSize;$i++)
{
sysFile -copy ($newFolderPath+"/"+ $newFileBase+($i+1)+"."+$newFileEx) ($path+$boxAll[$i]+"/"+$firstFile[0]);
}
}
>>[122]

私にとって、貴重なスクリプトを作成していただき、ありがとうございました。
早速コピーし、保存しました。
すぐさま実行したい気持ちではあるのですが、
じつは、ある実験作品を終えて、放心状態にあり、
実行したい気持ちになりつつも、実行できない状態にいます。

習作にしろ実験作品にしろ、一段落する都度、生じる放心状態の時期が、
しばらく続いてしまう・・・という悪癖があるのです(泣)。

あと数週間経過すれば、放心状態からぬけだし、
実験作品作りを再開する・・・と想います。

その実験作品中に教えていただいたスクリプトを使わせていただきます。
スクリプトの記述に付いては、初心者レベルなので、
スクリプト本文は、コピーペーストするとしても、
その他の部分で、記述間違いの可能性「大」です(苦笑)。

まぁ、それも、遅かれ早かれ試行錯誤して、覚えていくでしょう。

その結果については、また改めて報告いたします。


いづれにしても、貴重な mel スクリプトを教えていただき、
ありがとうございました。

合掌

《追伸》試行錯誤した時点で、再度教えを請う場合もあるかもしれません。
その折は、またよろしくお願いいたします。
>>[123]

動かなかったり、何か分からないことなどあればご連絡下さい。
スクリプトは私も勉強中なので、質問などあれば聞いていただいたほうが励みになります!!
結構強引に作っていますので、もっと簡単なスクリプトに出来るかもしれません。
どうぞよろしくお願いします。

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

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

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

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

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

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