Mayaプラグイン xyShrinkWrapについて

xyShrinkWrapについて書き留めることにする。
しかし、xyShrinkWrapについて話す前にNEXについて話す必要がある。

 Maya2014から新たNEXというMaya2013以前に使われていた有料のプラグインが追加された。
NEXサイトは以下、
https://draster.com/nex-1.5/

Maya2014に追加されたNEXの機能は市販のNEXよりも強力な機能をもっている。
それはxyShrinkWrapがインタラクティブなかたちで使用できる。
実行後、ヒストリーを削除しなければ、形にフィットした後も、フィットした形をフィットさせたオブジェクトに沿って移動することができる。
この機能は、プラグインのxyShrinkWrapには存在しない。
Maya2014のNEXは非常に高性能であるといえる。

Maya8.5を使っていた頃はNEXを常用していた。理由は以下画像のようなことができなかったからである。
12

Maya2011以降くらいでデフォルトで追加された機能で、Bキーを押すことによって、ソフト変形ができるようになったためNEXのつねる機能は不要になった。
簡単につねった形を作ることができる。
この機能がMaya8.5以前ではなかった。
数年前まではNEXは非常に強力なモデリングツールであったが、現在はMaya2014のデフォルト機能となった。

2つ目の違いは有料のNEXはMaya2014のNEXに比べて非常に重たいという点がある。
Maya2013で有料版NEXを使うと、ショートカットキーの移動、回転、スケールなどのw,e,rボタンを押すと、フリーズすることがよくある。

3つ目の違いは有料版NEXにはxyShrinkWrapが存在しない

このxyShrinkWrapについて今回は語りたい。
このプラグインはMayaのモデラーにとって非常にありがたいツールだと感じている。
xyShrinkWrapは以下のようなコマンドで、テキストエディタを開き、コピーペーストして保存しておくとよい。
.txtを.melに変更すると、Mayaのスクリプトエディタから簡単に呼び出せるので便利だ。

/* This file downloaded from Highend3d.com
''
'' Highend3d.com File Information:
''
'' Script Name: xyShrinkWrap v0.1
'' Author: Imre Tuske
'' Last Updated: May 9, 2002
'' Update/Change this file at:
'' http://www.highend3d.com/maya/mel/?section=modeling#1721
''
'' Please do not alter any information above this line
'' it is generated dynamically by Highend3d.com and will
'' be changed automatically on any updates.
*/

//
// *** xyShrinkWrap.mel ***
//
// Version 0.1 [09-may-2002] -- by Imre Tuske
//
//
// * THIS IS MAILWARE! *
//
// If you use this software regularly and you like it, let me know by dropping me an
// e-mail. This will guarantee that I'll keep on writing another useful pieces of MEL
// code which will be shared with you. Thanks!
//
// [ All Contents (C) by Imre Tuske (tusimi@freemail.hu), Hungary ]
// [ Developments done at Black Hole Ltd. / Animation Department ]
//
//
//
// Description:
//
// This script can be used to 'shrinkwrap' the selected objects and/or components
// (vertices/CVs) to the last selected object. It's based on the original idea of
// Erick Miller (fitMorph.mel). Just liked the cool idea and wrote my own version
// of it ;)
//
//
//
// Installation/Usage:
//
// Make your selection and enter
//
// xyShrinkWrap
//
//
//
// History:
//
// [09-may-2002] 0.1 Initial version.
//
//


proc warn( string $mod, string $msg )
{
warning("xyShrinkWrap::"+$mod+"(): "+$msg);
}


global proc string toshape( string $n )
{
string $s[];

if (objExists($n))
{
$s=`listRelatives -pa -s -ni $n`;
$s=`ls -type controlPoint $n $s[0]`;
}

return($s[0]);
}


proc wrapc( string $c, string $n ) // component (node.attr), wrapper transform
{
float $p[];

$p=`xform -q -ws -t $c`; xform -ws -t $p[0] $p[1] $p[2] $n;
$p=`xform -q -ws -t $n`; xform -ws -t $p[0] $p[1] $p[2] $c;
}


proc wrap( string $ss[], string $ds ) // source transform(s)/shape(s)/component(s), destination geometry shape
{
global string $gMainProgressBar;
string $s, $n, $sh;
int $p;

print($ss);

if (size(`ls -type controlPoint $ds`))
{
$n=`group -w -em -n "n1"`; // create temp ('snapper') null
geometryConstraint $ds $n;

progressBar -e -bp -ii 1 -min 0 -max (size($ss)) -st "Shrinkwrapping..." $gMainProgressBar;

for($s in $ss)
{
if (`progressBar -q -ic $gMainProgressBar`) break;

if (match("[^.]+[.][^.]+[\[].+[\]]",$s)=="") // (check for component format)
{
// object

$sh=$s;

if (size(`ls -tr $s`)) // transform node
{
if (($sh=toshape($s))=="") // find shape node
{
wrapc($s,$n); // no shape: snap transform
$sh="";
}
}

if (($sh!="")&&size(`ls -type controlPoint $sh`)) // geom. shape node: snap all control points
{
$m=`getAttr -s ($sh+".controlPoints")`;
$p=`progressBar -q -pr $gMainProgressBar`;

progressBar -e -min 0 -max $m -st "Wrapping object..." $gMainProgressBar;

for($i=0;$i<$m;$i++)
{
if (`progressBar -q -ic $gMainProgressBar`) break;
progressBar -e -s 1 $gMainProgressBar;

wrapc($sh+".controlPoints["+$i+"]",$n);
}

progressBar -e -min 0 -max (size($ss)) -pr $p -st "Wrapping components..." $gMainProgressBar;
}
}
else
{
// component

if (($s!="")&&objExists($s)) wrapc($s,$n);
}
}

progressBar -e -ep $gMainProgressBar;
delete($n); // delete temp snapper null
}
else warn("wrap",$ds+" doesn't exist or not a surface shape");
}


global proc xyShrinkWrap()
{
string $sl[]=`ls -fl -sl`, $d;
int $i, $m=size($sl);

if ( ($m>1)&&(($d=toshape($sl[$m-1]))!="") )
{
$sl[$m-1]="";
wrap($sl,$d);
}
else warn("xyShrinkWrap","Select some objects; select object to shrinkwrap to last");
}

xyShrinkWrap;


このコマンドはダウンロードした状態では使えなかった。
理由は一番下の行のxyShrinkWrap;が抜けていたからだ
Maya2013で直接コマンドを呼び出して実行する場合、このxyShrinkWrap;が抜けていることだけで使えなくなる。
glabal proc xyShrinkWrap(){
}
グローバルプロシージャの宣言をしているmelコマンドについては実行する際、
最後にglabal procの名称、今回ならxyShrinkWrap;を最終行に追加する必要がある。
その際、忘れてはいけないのが、セミコロン;である。

よくフリーのmelスクリプトが配布されているが、実行すると使えないことがよくある。
その際、global proc(グローバルプロシージャ)があるか確認して、最終行にその名前を付け足すといい。

で、実際にxyShrinkWrapのMaya2011からMaya2013での使い方だが、以下に記載しておくことにする。

1、今回の作例ではZbrushの岩を使うことにする。
1

Mキーを押すと岩の種類が表示される。
2

ドローして岩を出現させよう。
3

次にMayaに.obj形式でexportする。
4


2、MayaにZbrushのオブジェクトを読み込んだ際に非常にポリゴン数が多くなる
これを改善するためにxyShrinkWrapは活躍してくれる。
5

まずcube立方体を作成して分割数を上げる。
6

次にフリーでダウンロードできるxyShrinkWrapを読み込んで、以下の行を追加する。
今回は上に記載したコマンドをそのまま使用すればよい。
7

次に分割した立方体の中にZbrushの岩を入れて、囲ってしまう。
8

次にctrl+Aでコマンドを全選択して実行する。
実行する際のオブジェクトの選択順序は、分割したcube立方体から先に選択、2番目にZbrushの岩を選択する。
9

10

ピッタリとひっついたのが分かる。
Zbrushから出力したハイポリの岩を削除しよう。
11

ロウポリ化することができた。

このxyShrinkWrapはキャラクターなどでも使える非常に重要なツールで役に立つ。
ただ一点残念なのは、Maya2014のxyShrinkWrapのようにインタラクティブ性がない点である。
Maya2011からMaya2013ユーザーの参考のために記載した。

スタジオ ヒエイ作成提供
⇒⇒: http://www.studio-hiei.com
hiei