今回は現在勉強中のPySideネタ書いてみます。
自分なりの言い回しで書いてるので本来の意味と違うかもしれませんがご容赦ください。
PySideはたしか2014からデフォルトで入ってるpythonのライブラリです。
詳しくはググってください(おきまり)
PySideを使ってMayaでwebを表示したい!とふと思ったので挑戦してみました。
qtDesignerという便利ツールもありますが今回は勉強のために一からPySideと向き合ってみます。
と言いつつも特に解説もせず、早速結論です。笑
####################################################################
# まずは必要なライブラリをインポートします。
from PySide import QtCore, QtGui, QtWebKit
from maya import OpenMayaUI, cmds
import shiboken
# QWidgetを継承してブラウザーを作成するクラス
class browserUI(QtGui.QWidget):
# 初期化関数
def __init__(self, parent=None):
# スーパークラス(QWidget)のインスタンスメソッドからparentを使いたいのでsuper関数を使う
super(browserUI, self).__init__(parent)
# showUIメソッドの呼び出し
self.showUI()
def showUI(self):
# レイアウトの作成
vbox = QtGui.QVBoxLayout(self)
# ブラウザの作成
self.browser = QtWebKit.QWebView(self)
# URLの設定
self.browser.load(QtCore.QUrl('http://null0218.blogspot.jp/'))
# レイアウトにアタッチ
vbox.addWidget(self.browser)
#親レイアウトに合わせて伸縮する設定
self.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)
# 実行関数
def viewBrowser():
# mayaの裏側に行かないように設定
# mayaのメインウィンドウを取得
mayaMain = OpenMayaUI.MQtUtil.mainWindow()
# 取得したメインウィンドウをPySideのUIとして取得
parent = shiboken.wrapInstance(long(mayaMain), QtGui.QWidget)
# mayaのメインウィンドウの子供としてUIを作成
mainUI = QtGui.QMainWindow(parent)
# 上で書いたのQWidgetの呼び出し
browser = browserUI()
# QWidgetをMenuとしてQMainWindowにアタッチ
mainUI.setMenuWidget(browser)
# QMainWindowの表示
mainUI.show()
# おまじない
if __name__ == '__main__':
viewBrowser()
####################################################################
タブがスペースになってしまった;;
試す方はインデント調整してください;;
今回はざっくりした解説も書いてるので参考にしてもらえればと思います。
↓とまぁこんな感じで意外とすんなりできちゃいました。
こだわったポイントはmayaの裏側に行かないように設定ってとこですかねー
ただ、どうやら今のPySideの実行環境だとプラグインとかをロードしても
HTML5がダメみたいでyoutubeとかが見れない、うぬぬ。
↓こんな感じでmayaのレイアウトをちょっと改造してyoutube見たかったー
見れる方法ご存知の方、是非ご教授ください。
それにしても、PySideはいろいろな場所で使えていいですねー
ちょっと環境を整えればmayaだけじゃなくて
独立したアプリケーションとして面白いことができます。
ノードエディタっぽいのも作れちゃいます。
まだまだ勉強すること多いですがやってみると楽しいので皆さんもぜひー
ではでは。
2014年12月24日水曜日
2014年11月3日月曜日
UV座標からワールド座標を求める云々を使ったツール
前回の記事でご紹介してたMELを公開するだけという手抜き記事です。
使い方は動画を見てください。
最近使ってるわけでもないのでツールの
エラーとかも対応しかねますので自己責任でお試しください。
仕様としてはnearestPointOnMeshを使って
UV座標 ⇔ ワールド座標 を行き来してjointを配置していくものだったと思います。
※ペイントエフェクトのような規則正しいUVを使わないとうまくいかなかった気がします。
jointはIKスプラインの仕込み、hairの仕込みなどが選択できたと思います。
TYGrassesSetUpTool();
global proc TYGrassesSetUpTool(){
//同じウインドウが存在する場合は削除
if(`window -exists TYGrassesSetUpToolWindow`){
deleteUI TYGrassesSetUpToolWindow;
}
//ウインドウの作成
window -t "草花セットアップツール" -w 250 TYGrassesSetUpToolWindow;
string $windowRootLayout =`columnLayout -adj true`;
string $stepTabs =`tabLayout -imw 5 -imh 5`;
//STEP1
string $step1 =`columnLayout -adj true`;
text -fn "boldLabelFont" -bgc 0.18 0.18 0.18
-l "\n ターゲットメッシュのUV座標を基に\n等間隔でジョイントを配置しします\n";
columnLayout;
text -l "\n ① 配置させるジョイントの数と半径を指定します\n";
intFieldGrp -l "ジョイント " -v1 10 -el "個" jointQuantityField;
floatFieldGrp -l "半径 " -v1 0.01 -pre 3 jointRadiusField;
text -l "\n ② 配置させるUVマップの名前を指定します\n";
rowLayout -nc 2;
text -l " ";
textField -tx "map1" UVmapNameField;
setParent..;
text -l "\n ③ 配置させるUV座標を指定します\n";
floatFieldGrp -l "U座標位置の割合 " -v1 50.0 -el "%" -pre 2
-ann "V座標上に一列で配置するときのU座標位置の割合です" uPerPositionField;
text -l "\n ④ バインドするか指定します\n";
rowLayout -nc 3;
text -l " ";
radioCollection bindSelectField;
radioButton -l "バインドする" -sl -w 100 bindSelectTrue;
radioButton -l "バインドしない" -w 100 bindSelectFalse;
setParent..;
text -l "\n ⑤ ヘアシステムとカーブを作成するか指定します\n";
rowLayout -nc 3;
text -l " ";
radioCollection makeRigSelectField;
radioButton -l "作成する" -sl -w 100
-onc "text -e -en true nucleusText;\
radioButton -e -en true makeNsysSelectTrue;\
radioButton -e -en true makeNsysSelectFalse;"
makeRigSelectTrue;
radioButton -l "作成しない" -w 100
-onc "text -e -en false nucleusText;\
radioButton -e -en false makeNsysSelectTrue;\
radioButton -e -en false makeNsysSelectFalse;"
makeRigSelectFalse;
setParent..;
text -l "\n ヘアシステムにnucleusを接続するか指定します\n" nucleusText;
rowLayout -nc 3;
text -l " ";
radioCollection makeNsysSelectField;
radioButton -l "接続する" -sl -w 100 makeNsysSelectTrue;
radioButton -l "接続しない" -w 100 makeNsysSelectFalse;
setParent..;
text -l "\n ⑥ meshノードを選択し、作成を実行します\n";
setParent..;
button -l "作成" -c "TYGrassesSetUp(\
`intFieldGrp -q -v1 jointQuantityField`\
,`floatFieldGrp -q -v1 jointRadiusField`\
,`textField -q -tx UVmapNameField`\
,`floatFieldGrp -q -v1 uPerPositionField`\
,`radioCollection -q -sl bindSelectField`\
,`radioCollection -q -sl makeRigSelectField`\
,`radioCollection -q -sl makeNsysSelectField`)";
setParent..;
//STEP2
string $step2 =`columnLayout -adj true`;
text -fn "boldLabelFont" -bgc 0.18 0.18 0.18
-l "\n バインドされたソースメッシュを基に\nジョイントを配置しバインドやnHair等を実行します\n";
columnLayout;
text -l "\n ① 配置させるジョイントの半径を指定します\n";
floatFieldGrp -l "半径 " -v1 0.01 -pre 3 jointCopyRadiusField;
text -l "\n ② 配置させるUVマップの名前を指定します\n";
rowLayout -nc 2;
text -l " ";
textField -tx "map1" UVmapCopyNameField;
setParent..;
text -l "\n ③ バインドするか指定します\n";
rowLayout -nc 3;
text -l " ";
radioCollection bindCopySelectField;
radioButton -l "バインドする" -sl -w 100 bindCopySelectTrue;
radioButton -l "バインドしない" -w 100 bindCopySelectFalse;
setParent..;
text -l "\n ③ ヘアシステムを継承し作成するか指定します\n";
rowLayout -nc 3;
text -l " ";
radioCollection succeedNsysSelectField;
radioButton -l "継承し作成する" -sl -w 100
-onc "textField -e -en true hairSystemShapeNameField;\
text -e -en true succeedHairSysText;"
succeedNsysSelectTrue;
radioButton -l "作成しない" -w 100
-onc "textField -e -en false hairSystemShapeNameField;\
text -e -en false succeedHairSysText;"
succeedNsysSelectFalse;
setParent..;
text -l "\n 継承するhairSystemShapeの名前を指定します\n" succeedHairSysText;
rowLayout -nc 2;
text -l " ";
textField -tx "hairSystemShape1" hairSystemShapeNameField;
setParent..;
setParent..;
button -l "実行" -c "TYGrassesSetUpCopy(\
`floatFieldGrp -q -v1 jointCopyRadiusField`\
,`textField -q -tx UVmapCopyNameField`\
,`radioCollection -q -sl bindCopySelectField`\
,`radioCollection -q -sl succeedNsysSelectField`\
,`textField -q -tx hairSystemShapeNameField`)";
setParent..;
//タブレイアウトにペアレント
tabLayout -e -tl $step1 "STEP1" -tl $step2 "STEP2" $stepTabs;
setParent..;
button -l "閉じる" -c "deleteUI TYGrassesSetUpToolWindow";
setParent..;
showWindow;
}
global proc TYGrassesSetUp(int $jointQuantity, float $jointRadius, string $UVmapName,
float $uPerPosition, string $bindSelect, string $makeRigSelect, string $makeNsysSelect){
pickWalk -d down;
//選択されたオブジェクトのチェック
string $targetMesh[] = `ls -sl -typ mesh`;
if(`objExists $targetMesh[0]`){
if(`objExists $targetMesh[1]`){
error "複数選択されています。一度に作成できるベースセットアップは一つのみです。";
}
else;
}
else error "メッシュが選択されていません。";
//uvSetの名前のチェック
int $flag = 0;
if(catch(size(`getAttr -s ($targetMesh[0] + ".uvSet[*].uvSetName")`))){
if(`getAttr ($targetMesh[0] + ".uvSet[0].uvSetName")` == $UVmapName){
$flag = 1;
}
else;
}
else{
string $uvSetNameList[] = `getAttr ($targetMesh[0] + ".uvSet[*].uvSetName")`;
int $j;
for($j=0;$j<=(size($uvSetNameList)) && $flag!=1;$j++){
if($uvSetNameList[$j] == $UVmapName){
$flag = 1;
}
else;
}
}
//指定した値のチェック
if($jointQuantity <= 1 || $jointRadius <= 0 || $flag == 0){
error "入力値が不正です。";
}
else;
//transformノードの取得
string $targetTransform[] = `pickWalk -d up`;
//ジョイントの配置
int $i;
string $jointList[];
for($i=1;$i<=$jointQuantity;$i++){
select -cl;
string $jointName = `joint -rad $jointRadius -n "TYGrassBaceJoint"`;
//階層化
$jointList[($i - 1)] = $jointName;
if($i!=1){
parent $jointName $jointList[($i - 2)];
}
//UV座標を基にジョイントを配置
string $constName[] = `pointOnPolyConstraint $targetMesh[0] $jointName`;
int $k,$UVmapNumber,$nFlag = 0;
for($k=0;$nFlag!=1;$k++){
string $selectUVmapName = `getAttr ($targetMesh[0] + ".uvSet[" + $k + "].uvSetName")`;
if($selectUVmapName == $UVmapName){
$UVmapNumber = $k;
$nFlag = 1;
}
else;
}
connectAttr -f ($targetMesh[0] + ".uvSet[" + $UVmapNumber + "].uvSetName")
($constName[0] + ".target[0].targetUVSetName");
float $uvSize[] = `polyEvaluate -b2 -ae -uvs $UVmapName $targetMesh[0]`;
float $uPosition = ($uvSize[1] - $uvSize[0]) * $uPerPosition * 0.01 + $uvSize[0];
float $vPosition = ($uvSize[3] - $uvSize[2]) / ($jointQuantity - 1)
* ($i - 1) + $uvSize[2];
setAttr ($constName[0] + "." + $targetTransform[0] + "U0") $uPosition;
setAttr ($constName[0] + "." + $targetTransform[0] + "V0") $vPosition;
setAttr ($constName[0] + ".offsetRotateX") -90;
setAttr ($constName[0] + ".offsetRotateY") 90;
delete $constName[0];
//回転値をジョイントの方向へ移行させ0にする
float $jointRotateValue[] = `getAttr ($jointName + ".rotate")`;
joint -e -o $jointRotateValue[0] $jointRotateValue[1] $jointRotateValue[2] $jointName;
setAttr ($jointName + ".rotate") 0 0 0;
}
//バインドの実行
if($bindSelect == "bindSelectTrue"){
select $targetMesh[0] $jointList;
SmoothBindSkin;
}
else;
//nHairの作成
if($makeRigSelect == "makeRigSelectTrue"){
//ikHandleの作成
string $ikHandleName[] = `ikHandle -sj $jointList[0]
-ee $jointList[($jointQuantity -1)] -sol ikSplineSolver -scv false`;
select $ikHandleName[2];
//assignHairSystemのプロシージャから引用
string $sel[] = `ls -sl`;
string $hsys = `createNode hairSystem`;
connectAttr time1.outTime (".currentTime");
string $inCurveName[] = `ls -dag -type nurbsCurve $sel`;
attachCurvesToHairSystem( $hsys, $inCurveName, false );
//作成したものを変数に代入
select $hsys;
convertHairSelection( "follicles" );
pickWalk -d down;
select `listConnections -s false -t "nurbsCurve"`;
string $outCurveShapeName[] = `pickWalk -d down`;
select $inCurveName[0];
string $inCurveShapeName[] = `pickWalk -d down`;
//ikをhiarカーブに添わせる
disconnectAttr ($inCurveShapeName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");
connectAttr ($outCurveShapeName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");
//hairのアトリビュート設定
setAttr ($hsys + ".bendResistance") 50;
setAttr ($hsys + ".startCurveAttract") 0.1;
setAttr ($hsys + ".selfCollide") 1;
setAttr ($hsys + ".selfCollideWidthScale") 0.1;
//nucleusの接続
if($makeNsysSelect == "makeNsysSelectTrue"){
string $nucleusName = `createNode nucleus`;
connectAttr time1.outTime (".currentTime");
connectAttr ($hsys + ".currentState") ($nucleusName + ".inputActive[0]");
connectAttr ($hsys + ".startState") ($nucleusName + ".inputActiveStart[0]");
connectAttr ($nucleusName + ".outputObjects[0]") ($hsys + ".nextState");
connectAttr ($nucleusName + ".startFrame") ($hsys + ".startFrame");
setAttr ($hsys + ".active") 1;
}
}
}
global proc TYGrassesSetUpCopy(float $jointCopyRadius, string $UVmapCopyName
, string $bindCopySelect, string $succeedNsysSelect, string $hairSystemShapeName){
pickWalk -d down;
string $meshList[] = `ls -sl `;
//uvSetの名前のチェック
int $k,$flag = 0;;
for($k=1;$k<size($meshList);$k++){
if(catch(size(`getAttr -s ($meshList[$k] + ".uvSet[*].uvSetName")`))){
if(`getAttr ($meshList[$k] + ".uvSet[0].uvSetName")` == $UVmapCopyName){
$flag = 1;
}
else;
}
else{
string $uvSetNameList[] = `getAttr ($meshList[$k] + ".uvSet[*].uvSetName")`;
int $j;
for($j=0;$j<=(size($uvSetNameList)) && $flag!=1;$j++){
if($uvSetNameList[$j] == $UVmapCopyName){
$flag = 1;
}
else;
}
}
}
if(`objExists $hairSystemShapeName`){
if(`nodeType $hairSystemShapeName` != "hairSystem"){
$flag = 0;
}
else;
}
else{
$flag = 0;
}
//指定した値のチェック
if($flag == 0){
error "入力値が不正です。";
}
else;
//nearestPointOnMeshの作成
loadPlugin -qt "nearestPointOnMesh.mll";
string $nPOM = `createNode "nearestPointOnMesh"`;
string $checker[] = `spaceLocator`;
connectAttr ($checker[0] + ".translate") ($nPOM + ".inPosition");
connectAttr ($meshList[0] + ".worldMesh[0]") ($nPOM + ".inMesh");
//メッシュからジョイントを取得
string $jointList[] =`skinCluster -q -inf $meshList[0]`;
//ソースメッシュにバインドされたジョイントのソースメッシュ上UV位置を取得
float $uPosition[],$vPosition[];
for($jointName in $jointList){
float $jointPosition[] = `xform -q -ws -t $jointName`;
move -rpr $jointPosition[0] $jointPosition[1] $jointPosition[2] $checker[0];
$uPosition[`size($uPosition)`] = `getAttr ($nPOM + ".parameterU")`;
$vPosition[`size($vPosition)`] = `getAttr ($nPOM + ".parameterV")`;
}
delete $nPOM $checker[0];
//ジョイントの配置
int $i;
string $ikHandleList[],$jointCopyList[];
for($i=1;$i<size($meshList);$i++){
float $uvboundingBox[] = `polyEvaluate -b2 -ae -uvs $UVmapCopyName $meshList[$i]`;
string $jointName[] = {};
for($j=0;$j<`size($jointList)`;$j++){
//ソースのバウンディングボックス内にジョイントがあった場合ターゲットも作成(誤差0.0001)
if(($uvboundingBox[3] + 0.0001) > $vPosition[$j]){
select -cl;
$jointName[$j] = `joint -rad $jointCopyRadius -n "TYGrassBaceJoint"`;
string $constName[] = `pointOnPolyConstraint $meshList[$i] $jointName[$j]`;
//指定したuvマップが何番目の配列にあるか確認
int $l,$UVmapNumber,$nFlag = 0;
for($l=0;$nFlag!=1;$l++){
string $selectUVmapName = `getAttr ($meshList[$i] +
".uvSet[" + $l + "].uvSetName")`;
if($selectUVmapName == $UVmapCopyName){
$UVmapNumber = $k;
$nFlag = 1;
}
else;
}
connectAttr -f ($meshList[$i] + ".uvSet[" + $UVmapNumber + "].uvSetName")
($constName[0] + ".target[0].targetUVSetName");
select $meshList[$i];
string $transformMesh[] = `pickWalk -d up`;
setAttr ($constName[0] + "." + $transformMesh[0] + "U0") $uPosition[$j];
setAttr ($constName[0] + "." + $transformMesh[0] + "V0") $vPosition[$j];
setAttr ($constName[0] + ".offsetRotateX") -90;
setAttr ($constName[0] + ".offsetRotateY") 90;
delete $constName[0];
//ソースを参考に階層化
select $jointList[$j];
int $m,$num = 0;
string $sourceParentJoint[] =`pickWalk -d up`;
if($jointList[$j] != $sourceParentJoint[0]){
for($m=0;$m<size($jointList);$m++){
if($jointList[$m] == $sourceParentJoint[0]){
$num = $m;
}
}
parent $jointName[$j] $jointName[$num];
}
}
}
$jointCopyList[size($jointCopyList)] = $jointName[0];
//バインドの実行
if($bindCopySelect == "bindCopySelectTrue"){
select $meshList[$i] $jointName[0];
SmoothBindSkin;
}
else;
//ikHandleの作成
if($succeedNsysSelect == "succeedNsysSelectTrue"){
string $ikHandleName[] = `ikHandle -sj $jointName[0]
-ee $jointName[(size($jointName) - 1)] -sol ikSplineSolver -scv false`;
$ikHandleList[size($ikHandleList)] = $ikHandleName[0];
//assignHairSystemから一部引用
string $curves[] = `ls -dag -type nurbsCurve $ikHandleName[2]`;
attachCurvesToHairSystem( $hairSystemShapeName, $curves, false );
//hairSystemShapeから正しいfollicleshapeを取得
select $hairSystemShapeName;
convertHairSelection( "follicles" );
string $follicleShapeList[] = `pickWalk -d down`;
string $trueFollicleShape;
for($follicleShapeName in $follicleShapeList){
string $plugList[] = `listConnections -d false $follicleShapeName`;
for($plugName in $plugList){
if($plugName == $ikHandleName[2]){
$trueFollicleShape = $follicleShapeName;
}
else;
}
}
//follicleshapeの中から作られたカーブを取得
select $trueFollicleShape;
select `listConnections -s false -t "nurbsCurve"`;
string $outCurveName[] = `pickWalk -d down`;
//curveShapeを取得
select $ikHandleName[2];
string $inCurveName[] = `pickWalk -d down`;
//ikをhiarカーブに添わせる
disconnectAttr ($inCurveName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");
connectAttr ($outCurveName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");
}
else;
}
group -n "TYGrassesIkHandleGp" $ikHandleList;
group -n "TYGrassesJointGp" $jointCopyList;
select -cl;
}
使い方は動画を見てください。
最近使ってるわけでもないのでツールの
エラーとかも対応しかねますので自己責任でお試しください。
仕様としてはnearestPointOnMeshを使って
UV座標 ⇔ ワールド座標 を行き来してjointを配置していくものだったと思います。
※ペイントエフェクトのような規則正しいUVを使わないとうまくいかなかった気がします。
jointはIKスプラインの仕込み、hairの仕込みなどが選択できたと思います。
TYGrassesSetUpTool();
global proc TYGrassesSetUpTool(){
//同じウインドウが存在する場合は削除
if(`window -exists TYGrassesSetUpToolWindow`){
deleteUI TYGrassesSetUpToolWindow;
}
//ウインドウの作成
window -t "草花セットアップツール" -w 250 TYGrassesSetUpToolWindow;
string $windowRootLayout =`columnLayout -adj true`;
string $stepTabs =`tabLayout -imw 5 -imh 5`;
//STEP1
string $step1 =`columnLayout -adj true`;
text -fn "boldLabelFont" -bgc 0.18 0.18 0.18
-l "\n ターゲットメッシュのUV座標を基に\n等間隔でジョイントを配置しします\n";
columnLayout;
text -l "\n ① 配置させるジョイントの数と半径を指定します\n";
intFieldGrp -l "ジョイント " -v1 10 -el "個" jointQuantityField;
floatFieldGrp -l "半径 " -v1 0.01 -pre 3 jointRadiusField;
text -l "\n ② 配置させるUVマップの名前を指定します\n";
rowLayout -nc 2;
text -l " ";
textField -tx "map1" UVmapNameField;
setParent..;
text -l "\n ③ 配置させるUV座標を指定します\n";
floatFieldGrp -l "U座標位置の割合 " -v1 50.0 -el "%" -pre 2
-ann "V座標上に一列で配置するときのU座標位置の割合です" uPerPositionField;
text -l "\n ④ バインドするか指定します\n";
rowLayout -nc 3;
text -l " ";
radioCollection bindSelectField;
radioButton -l "バインドする" -sl -w 100 bindSelectTrue;
radioButton -l "バインドしない" -w 100 bindSelectFalse;
setParent..;
text -l "\n ⑤ ヘアシステムとカーブを作成するか指定します\n";
rowLayout -nc 3;
text -l " ";
radioCollection makeRigSelectField;
radioButton -l "作成する" -sl -w 100
-onc "text -e -en true nucleusText;\
radioButton -e -en true makeNsysSelectTrue;\
radioButton -e -en true makeNsysSelectFalse;"
makeRigSelectTrue;
radioButton -l "作成しない" -w 100
-onc "text -e -en false nucleusText;\
radioButton -e -en false makeNsysSelectTrue;\
radioButton -e -en false makeNsysSelectFalse;"
makeRigSelectFalse;
setParent..;
text -l "\n ヘアシステムにnucleusを接続するか指定します\n" nucleusText;
rowLayout -nc 3;
text -l " ";
radioCollection makeNsysSelectField;
radioButton -l "接続する" -sl -w 100 makeNsysSelectTrue;
radioButton -l "接続しない" -w 100 makeNsysSelectFalse;
setParent..;
text -l "\n ⑥ meshノードを選択し、作成を実行します\n";
setParent..;
button -l "作成" -c "TYGrassesSetUp(\
`intFieldGrp -q -v1 jointQuantityField`\
,`floatFieldGrp -q -v1 jointRadiusField`\
,`textField -q -tx UVmapNameField`\
,`floatFieldGrp -q -v1 uPerPositionField`\
,`radioCollection -q -sl bindSelectField`\
,`radioCollection -q -sl makeRigSelectField`\
,`radioCollection -q -sl makeNsysSelectField`)";
setParent..;
//STEP2
string $step2 =`columnLayout -adj true`;
text -fn "boldLabelFont" -bgc 0.18 0.18 0.18
-l "\n バインドされたソースメッシュを基に\nジョイントを配置しバインドやnHair等を実行します\n";
columnLayout;
text -l "\n ① 配置させるジョイントの半径を指定します\n";
floatFieldGrp -l "半径 " -v1 0.01 -pre 3 jointCopyRadiusField;
text -l "\n ② 配置させるUVマップの名前を指定します\n";
rowLayout -nc 2;
text -l " ";
textField -tx "map1" UVmapCopyNameField;
setParent..;
text -l "\n ③ バインドするか指定します\n";
rowLayout -nc 3;
text -l " ";
radioCollection bindCopySelectField;
radioButton -l "バインドする" -sl -w 100 bindCopySelectTrue;
radioButton -l "バインドしない" -w 100 bindCopySelectFalse;
setParent..;
text -l "\n ③ ヘアシステムを継承し作成するか指定します\n";
rowLayout -nc 3;
text -l " ";
radioCollection succeedNsysSelectField;
radioButton -l "継承し作成する" -sl -w 100
-onc "textField -e -en true hairSystemShapeNameField;\
text -e -en true succeedHairSysText;"
succeedNsysSelectTrue;
radioButton -l "作成しない" -w 100
-onc "textField -e -en false hairSystemShapeNameField;\
text -e -en false succeedHairSysText;"
succeedNsysSelectFalse;
setParent..;
text -l "\n 継承するhairSystemShapeの名前を指定します\n" succeedHairSysText;
rowLayout -nc 2;
text -l " ";
textField -tx "hairSystemShape1" hairSystemShapeNameField;
setParent..;
setParent..;
button -l "実行" -c "TYGrassesSetUpCopy(\
`floatFieldGrp -q -v1 jointCopyRadiusField`\
,`textField -q -tx UVmapCopyNameField`\
,`radioCollection -q -sl bindCopySelectField`\
,`radioCollection -q -sl succeedNsysSelectField`\
,`textField -q -tx hairSystemShapeNameField`)";
setParent..;
//タブレイアウトにペアレント
tabLayout -e -tl $step1 "STEP1" -tl $step2 "STEP2" $stepTabs;
setParent..;
button -l "閉じる" -c "deleteUI TYGrassesSetUpToolWindow";
setParent..;
showWindow;
}
global proc TYGrassesSetUp(int $jointQuantity, float $jointRadius, string $UVmapName,
float $uPerPosition, string $bindSelect, string $makeRigSelect, string $makeNsysSelect){
pickWalk -d down;
//選択されたオブジェクトのチェック
string $targetMesh[] = `ls -sl -typ mesh`;
if(`objExists $targetMesh[0]`){
if(`objExists $targetMesh[1]`){
error "複数選択されています。一度に作成できるベースセットアップは一つのみです。";
}
else;
}
else error "メッシュが選択されていません。";
//uvSetの名前のチェック
int $flag = 0;
if(catch(size(`getAttr -s ($targetMesh[0] + ".uvSet[*].uvSetName")`))){
if(`getAttr ($targetMesh[0] + ".uvSet[0].uvSetName")` == $UVmapName){
$flag = 1;
}
else;
}
else{
string $uvSetNameList[] = `getAttr ($targetMesh[0] + ".uvSet[*].uvSetName")`;
int $j;
for($j=0;$j<=(size($uvSetNameList)) && $flag!=1;$j++){
if($uvSetNameList[$j] == $UVmapName){
$flag = 1;
}
else;
}
}
//指定した値のチェック
if($jointQuantity <= 1 || $jointRadius <= 0 || $flag == 0){
error "入力値が不正です。";
}
else;
//transformノードの取得
string $targetTransform[] = `pickWalk -d up`;
//ジョイントの配置
int $i;
string $jointList[];
for($i=1;$i<=$jointQuantity;$i++){
select -cl;
string $jointName = `joint -rad $jointRadius -n "TYGrassBaceJoint"`;
//階層化
$jointList[($i - 1)] = $jointName;
if($i!=1){
parent $jointName $jointList[($i - 2)];
}
//UV座標を基にジョイントを配置
string $constName[] = `pointOnPolyConstraint $targetMesh[0] $jointName`;
int $k,$UVmapNumber,$nFlag = 0;
for($k=0;$nFlag!=1;$k++){
string $selectUVmapName = `getAttr ($targetMesh[0] + ".uvSet[" + $k + "].uvSetName")`;
if($selectUVmapName == $UVmapName){
$UVmapNumber = $k;
$nFlag = 1;
}
else;
}
connectAttr -f ($targetMesh[0] + ".uvSet[" + $UVmapNumber + "].uvSetName")
($constName[0] + ".target[0].targetUVSetName");
float $uvSize[] = `polyEvaluate -b2 -ae -uvs $UVmapName $targetMesh[0]`;
float $uPosition = ($uvSize[1] - $uvSize[0]) * $uPerPosition * 0.01 + $uvSize[0];
float $vPosition = ($uvSize[3] - $uvSize[2]) / ($jointQuantity - 1)
* ($i - 1) + $uvSize[2];
setAttr ($constName[0] + "." + $targetTransform[0] + "U0") $uPosition;
setAttr ($constName[0] + "." + $targetTransform[0] + "V0") $vPosition;
setAttr ($constName[0] + ".offsetRotateX") -90;
setAttr ($constName[0] + ".offsetRotateY") 90;
delete $constName[0];
//回転値をジョイントの方向へ移行させ0にする
float $jointRotateValue[] = `getAttr ($jointName + ".rotate")`;
joint -e -o $jointRotateValue[0] $jointRotateValue[1] $jointRotateValue[2] $jointName;
setAttr ($jointName + ".rotate") 0 0 0;
}
//バインドの実行
if($bindSelect == "bindSelectTrue"){
select $targetMesh[0] $jointList;
SmoothBindSkin;
}
else;
//nHairの作成
if($makeRigSelect == "makeRigSelectTrue"){
//ikHandleの作成
string $ikHandleName[] = `ikHandle -sj $jointList[0]
-ee $jointList[($jointQuantity -1)] -sol ikSplineSolver -scv false`;
select $ikHandleName[2];
//assignHairSystemのプロシージャから引用
string $sel[] = `ls -sl`;
string $hsys = `createNode hairSystem`;
connectAttr time1.outTime (".currentTime");
string $inCurveName[] = `ls -dag -type nurbsCurve $sel`;
attachCurvesToHairSystem( $hsys, $inCurveName, false );
//作成したものを変数に代入
select $hsys;
convertHairSelection( "follicles" );
pickWalk -d down;
select `listConnections -s false -t "nurbsCurve"`;
string $outCurveShapeName[] = `pickWalk -d down`;
select $inCurveName[0];
string $inCurveShapeName[] = `pickWalk -d down`;
//ikをhiarカーブに添わせる
disconnectAttr ($inCurveShapeName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");
connectAttr ($outCurveShapeName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");
//hairのアトリビュート設定
setAttr ($hsys + ".bendResistance") 50;
setAttr ($hsys + ".startCurveAttract") 0.1;
setAttr ($hsys + ".selfCollide") 1;
setAttr ($hsys + ".selfCollideWidthScale") 0.1;
//nucleusの接続
if($makeNsysSelect == "makeNsysSelectTrue"){
string $nucleusName = `createNode nucleus`;
connectAttr time1.outTime (".currentTime");
connectAttr ($hsys + ".currentState") ($nucleusName + ".inputActive[0]");
connectAttr ($hsys + ".startState") ($nucleusName + ".inputActiveStart[0]");
connectAttr ($nucleusName + ".outputObjects[0]") ($hsys + ".nextState");
connectAttr ($nucleusName + ".startFrame") ($hsys + ".startFrame");
setAttr ($hsys + ".active") 1;
}
}
}
global proc TYGrassesSetUpCopy(float $jointCopyRadius, string $UVmapCopyName
, string $bindCopySelect, string $succeedNsysSelect, string $hairSystemShapeName){
pickWalk -d down;
string $meshList[] = `ls -sl `;
//uvSetの名前のチェック
int $k,$flag = 0;;
for($k=1;$k<size($meshList);$k++){
if(catch(size(`getAttr -s ($meshList[$k] + ".uvSet[*].uvSetName")`))){
if(`getAttr ($meshList[$k] + ".uvSet[0].uvSetName")` == $UVmapCopyName){
$flag = 1;
}
else;
}
else{
string $uvSetNameList[] = `getAttr ($meshList[$k] + ".uvSet[*].uvSetName")`;
int $j;
for($j=0;$j<=(size($uvSetNameList)) && $flag!=1;$j++){
if($uvSetNameList[$j] == $UVmapCopyName){
$flag = 1;
}
else;
}
}
}
if(`objExists $hairSystemShapeName`){
if(`nodeType $hairSystemShapeName` != "hairSystem"){
$flag = 0;
}
else;
}
else{
$flag = 0;
}
//指定した値のチェック
if($flag == 0){
error "入力値が不正です。";
}
else;
//nearestPointOnMeshの作成
loadPlugin -qt "nearestPointOnMesh.mll";
string $nPOM = `createNode "nearestPointOnMesh"`;
string $checker[] = `spaceLocator`;
connectAttr ($checker[0] + ".translate") ($nPOM + ".inPosition");
connectAttr ($meshList[0] + ".worldMesh[0]") ($nPOM + ".inMesh");
//メッシュからジョイントを取得
string $jointList[] =`skinCluster -q -inf $meshList[0]`;
//ソースメッシュにバインドされたジョイントのソースメッシュ上UV位置を取得
float $uPosition[],$vPosition[];
for($jointName in $jointList){
float $jointPosition[] = `xform -q -ws -t $jointName`;
move -rpr $jointPosition[0] $jointPosition[1] $jointPosition[2] $checker[0];
$uPosition[`size($uPosition)`] = `getAttr ($nPOM + ".parameterU")`;
$vPosition[`size($vPosition)`] = `getAttr ($nPOM + ".parameterV")`;
}
delete $nPOM $checker[0];
//ジョイントの配置
int $i;
string $ikHandleList[],$jointCopyList[];
for($i=1;$i<size($meshList);$i++){
float $uvboundingBox[] = `polyEvaluate -b2 -ae -uvs $UVmapCopyName $meshList[$i]`;
string $jointName[] = {};
for($j=0;$j<`size($jointList)`;$j++){
//ソースのバウンディングボックス内にジョイントがあった場合ターゲットも作成(誤差0.0001)
if(($uvboundingBox[3] + 0.0001) > $vPosition[$j]){
select -cl;
$jointName[$j] = `joint -rad $jointCopyRadius -n "TYGrassBaceJoint"`;
string $constName[] = `pointOnPolyConstraint $meshList[$i] $jointName[$j]`;
//指定したuvマップが何番目の配列にあるか確認
int $l,$UVmapNumber,$nFlag = 0;
for($l=0;$nFlag!=1;$l++){
string $selectUVmapName = `getAttr ($meshList[$i] +
".uvSet[" + $l + "].uvSetName")`;
if($selectUVmapName == $UVmapCopyName){
$UVmapNumber = $k;
$nFlag = 1;
}
else;
}
connectAttr -f ($meshList[$i] + ".uvSet[" + $UVmapNumber + "].uvSetName")
($constName[0] + ".target[0].targetUVSetName");
select $meshList[$i];
string $transformMesh[] = `pickWalk -d up`;
setAttr ($constName[0] + "." + $transformMesh[0] + "U0") $uPosition[$j];
setAttr ($constName[0] + "." + $transformMesh[0] + "V0") $vPosition[$j];
setAttr ($constName[0] + ".offsetRotateX") -90;
setAttr ($constName[0] + ".offsetRotateY") 90;
delete $constName[0];
//ソースを参考に階層化
select $jointList[$j];
int $m,$num = 0;
string $sourceParentJoint[] =`pickWalk -d up`;
if($jointList[$j] != $sourceParentJoint[0]){
for($m=0;$m<size($jointList);$m++){
if($jointList[$m] == $sourceParentJoint[0]){
$num = $m;
}
}
parent $jointName[$j] $jointName[$num];
}
}
}
$jointCopyList[size($jointCopyList)] = $jointName[0];
//バインドの実行
if($bindCopySelect == "bindCopySelectTrue"){
select $meshList[$i] $jointName[0];
SmoothBindSkin;
}
else;
//ikHandleの作成
if($succeedNsysSelect == "succeedNsysSelectTrue"){
string $ikHandleName[] = `ikHandle -sj $jointName[0]
-ee $jointName[(size($jointName) - 1)] -sol ikSplineSolver -scv false`;
$ikHandleList[size($ikHandleList)] = $ikHandleName[0];
//assignHairSystemから一部引用
string $curves[] = `ls -dag -type nurbsCurve $ikHandleName[2]`;
attachCurvesToHairSystem( $hairSystemShapeName, $curves, false );
//hairSystemShapeから正しいfollicleshapeを取得
select $hairSystemShapeName;
convertHairSelection( "follicles" );
string $follicleShapeList[] = `pickWalk -d down`;
string $trueFollicleShape;
for($follicleShapeName in $follicleShapeList){
string $plugList[] = `listConnections -d false $follicleShapeName`;
for($plugName in $plugList){
if($plugName == $ikHandleName[2]){
$trueFollicleShape = $follicleShapeName;
}
else;
}
}
//follicleshapeの中から作られたカーブを取得
select $trueFollicleShape;
select `listConnections -s false -t "nurbsCurve"`;
string $outCurveName[] = `pickWalk -d down`;
//curveShapeを取得
select $ikHandleName[2];
string $inCurveName[] = `pickWalk -d down`;
//ikをhiarカーブに添わせる
disconnectAttr ($inCurveName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");
connectAttr ($outCurveName[0] + ".worldSpace[0]") ($ikHandleName[0] + ".inCurve");
}
else;
}
group -n "TYGrassesIkHandleGp" $ikHandleList;
group -n "TYGrassesJointGp" $jointCopyList;
select -cl;
}
久しぶりにMELのツールを見るとpythonのほうが
書きやすい感じがしますね。(慣れかな?)
最近はOpenMayaとかPySideと戯れているのでそういうのもあるんでしょうけど。
んーbloggerってtextファイルアップロードできないのかなー
2014年10月13日月曜日
Google Maps APIさわってみたよ
記事を書く度にお久しぶりですとか言ってる気がするw
最近pythonとかmelとかをガリガリ書いていたので
一年と三カ月ぶりにHTMLとかCSSとかJava Scriptとか触ってみます。
といっても過去に作った簡単なプログラムを公開するだけなんですけどね(手抜き)
やりたいことはgoogle map上でクリックしたところにマーカーを立てて
経度、緯度を取得して表示 → csvファイルとして書きだし
とまぁこんな感じです。
ちなみにcsvファイルってのはカンマ( , )とかで情報を区切るだけで
エクセル等のソフトでも枠を区切って認識してくれるファイル形式です。
まぁ詳しくはぐぐってください。
今回はソースコードの解説などは特にしません。←
(べつに久しぶりに弄ったら結構忘れてて解説する自信がないとかではないですよ;;)
まぁ結構この手の内容は一文づつググったらかなりの量の解説がヒットしますので
まぁ詳しくはぐぐってください。w
///////////////////////////////////////////////////////
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0px; padding: 0px }
#map { height: 100% }
</style>
<script src="http://maps.google.com/maps/api/js?v=3&sensor=false"
type="text/javascript" charset="UTF-8">
</script>
<script type="text/javascript">
//<![CDATA[
var map;
var markersArray = [];
var flag = 0;
function init() {
var latlng = new google.maps.LatLng(39, 138);
var opts = {
zoom: 6,
mapTypeId: google.maps.MapTypeId.ROADMAP,
center: latlng
};
map = new google.maps.Map(document.getElementById("map"), opts);
google.maps.event.addListener(map, 'click', mylistener);
}
function mylistener(event) {
if(flag == 0){
document.getElementById("left_up_lat").innerHTML = event.latLng.lat();
document.getElementById("left_up_lng").innerHTML = event.latLng.lng();
}else {
document.getElementById("right_under_lat").innerHTML = event.latLng.lat();
document.getElementById("right_under_lng").innerHTML = event.latLng.lng();
}
var latlng=new google.maps.LatLng(event.latLng.lat(), event.latLng.lng());
var marker = new google.maps.Marker({position:latlng, map:map});
markersArray.push(marker);
}
function writeText() {
var fs = new ActiveXObject("Scripting.FileSystemObject");
var outf = fs.CreateTextFile("outText.csv", true);
outf.Write(document.getElementById("file_name").value + "," + document.getElementById("left_up_lat").innerHTML + "," + document.getElementById("left_up_lng").innerHTML + "," + document.getElementById("right_under_lat").innerHTML + "," + document.getElementById("right_under_lng").innerHTML);
outf.Close();
}
function clearOverlays() {
if (markersArray) {
for (i in markersArray) {
markersArray[i].setMap(null);
}
}
}
function leftUp() {
flag = 0;
}
function rightUnder() {
flag = 1;
}
//]]>
</script>
</head>
<body onload="init()">
<div id="map" style="height:560px"></div>
<table border="1" cellspacing="2" width="100%">
<tr><th>ファイル名</th><th><button onclick="leftUp()" type=button>LEFT UP</button></th><th><button onclick="rightUnder()" type=button>RIGHT UNDER</button></th></tr>
<tr><th rowspan="2"><input type="text" size=30 value="file name" id="file_name"></th><th id="left_up_lat"></th><th id="right_under_lat">
<tr><th id="left_up_lng"></th><th id="right_under_lng"></th></tr>
</table>
<form>
<input type="button" value="マーカーを削除" onclick="clearOverlays()" /><button onclick="writeText()" type=button>書きこみ</button><br>
</form>
</body>
</html>
///////////////////////////////////////////////////////
とまぁこんな感じなんですが
これを書いてた頃はIEユーザーだったのでActiveXObjectという
IEでファイルを書きだすやつを使ってたんですが
現状IEユーザーが減っちゃったのと、バージョンアップによって
IEでもたぶん使えないと思います←
かきだすwriteText()の中身だけ書き変えたら動くはずですが
使うタイミングがないので使いたい方は書き変えて使って下さい。
firefoxやchromeなどでも確かそんなやつがあったと思います。
まぁ一応コピーして.htmlで保存すればそれ以外は動くはずです。たぶん。
はい、まぁ今回はかなり雑でしたがこんな感じで終わりますw
今後も雑な感じで過去のスクリプトとか投下するかもしれませんが悪しからず。
最近pythonとかmelとかをガリガリ書いていたので
一年と三カ月ぶりにHTMLとかCSSとかJava Scriptとか触ってみます。
といっても過去に作った簡単なプログラムを公開するだけなんですけどね(手抜き)
やりたいことはgoogle map上でクリックしたところにマーカーを立てて
経度、緯度を取得して表示 → csvファイルとして書きだし
とまぁこんな感じです。
ちなみにcsvファイルってのはカンマ( , )とかで情報を区切るだけで
エクセル等のソフトでも枠を区切って認識してくれるファイル形式です。
まぁ詳しくはぐぐってください。
今回はソースコードの解説などは特にしません。←
(べつに久しぶりに弄ったら結構忘れてて解説する自信がないとかではないですよ;;)
まぁ結構この手の内容は一文づつググったらかなりの量の解説がヒットしますので
まぁ詳しくはぐぐってください。w
///////////////////////////////////////////////////////
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0px; padding: 0px }
#map { height: 100% }
</style>
<script src="http://maps.google.com/maps/api/js?v=3&sensor=false"
type="text/javascript" charset="UTF-8">
</script>
<script type="text/javascript">
//<![CDATA[
var map;
var markersArray = [];
var flag = 0;
function init() {
var latlng = new google.maps.LatLng(39, 138);
var opts = {
zoom: 6,
mapTypeId: google.maps.MapTypeId.ROADMAP,
center: latlng
};
map = new google.maps.Map(document.getElementById("map"), opts);
google.maps.event.addListener(map, 'click', mylistener);
}
function mylistener(event) {
if(flag == 0){
document.getElementById("left_up_lat").innerHTML = event.latLng.lat();
document.getElementById("left_up_lng").innerHTML = event.latLng.lng();
}else {
document.getElementById("right_under_lat").innerHTML = event.latLng.lat();
document.getElementById("right_under_lng").innerHTML = event.latLng.lng();
}
var latlng=new google.maps.LatLng(event.latLng.lat(), event.latLng.lng());
var marker = new google.maps.Marker({position:latlng, map:map});
markersArray.push(marker);
}
function writeText() {
var fs = new ActiveXObject("Scripting.FileSystemObject");
var outf = fs.CreateTextFile("outText.csv", true);
outf.Write(document.getElementById("file_name").value + "," + document.getElementById("left_up_lat").innerHTML + "," + document.getElementById("left_up_lng").innerHTML + "," + document.getElementById("right_under_lat").innerHTML + "," + document.getElementById("right_under_lng").innerHTML);
outf.Close();
}
function clearOverlays() {
if (markersArray) {
for (i in markersArray) {
markersArray[i].setMap(null);
}
}
}
function leftUp() {
flag = 0;
}
function rightUnder() {
flag = 1;
}
//]]>
</script>
</head>
<body onload="init()">
<div id="map" style="height:560px"></div>
<table border="1" cellspacing="2" width="100%">
<tr><th>ファイル名</th><th><button onclick="leftUp()" type=button>LEFT UP</button></th><th><button onclick="rightUnder()" type=button>RIGHT UNDER</button></th></tr>
<tr><th rowspan="2"><input type="text" size=30 value="file name" id="file_name"></th><th id="left_up_lat"></th><th id="right_under_lat">
<tr><th id="left_up_lng"></th><th id="right_under_lng"></th></tr>
</table>
<form>
<input type="button" value="マーカーを削除" onclick="clearOverlays()" /><button onclick="writeText()" type=button>書きこみ</button><br>
</form>
</body>
</html>
///////////////////////////////////////////////////////
とまぁこんな感じなんですが
これを書いてた頃はIEユーザーだったのでActiveXObjectという
IEでファイルを書きだすやつを使ってたんですが
現状IEユーザーが減っちゃったのと、バージョンアップによって
IEでもたぶん使えないと思います←
かきだすwriteText()の中身だけ書き変えたら動くはずですが
使うタイミングがないので使いたい方は書き変えて使って下さい。
firefoxやchromeなどでも確かそんなやつがあったと思います。
まぁ一応コピーして.htmlで保存すればそれ以外は動くはずです。たぶん。
はい、まぁ今回はかなり雑でしたがこんな感じで終わりますw
今後も雑な感じで過去のスクリプトとか投下するかもしれませんが悪しからず。
2014年7月9日水曜日
mayabatchを使ってちょっと効率up
おひさしぶりです。
ブログを書こうと思いつつもどんどん先延ばしになって、かなり期間が開いてしまいました(・へ・)
4月からいっぱしのクリエーターになっていろいろな意味でこのブログも
書きにくくなってしまいました;;
とまぁあまり書いていると睡眠時間がどんどん無くなるので
さっそくですが本題ですよ
社会人になって友達の幅もかなり増えたりして仕事の色々な話を聞く機会がふえました
そんな中で効率を上げたいという話をよく耳にします
なので今回は同じ修正をカット毎しなければならないめんどくさい作業をもっと効率化しよう!
という内容です。
ちょっとこのブログではそこまでmel等のスクリプトを取り上げていませんが
今回はmelありきになってしまうかもしれません。ご了承を。
mayabatchというものをご存じでしょうか。
GUIを立ち上げずにmayaの処理を行ってくれるヤツです。
windowsのコマンドプロンプトからコマンドを打って実行します。
例)
C:\"Program Files"\Autodesk\Maya2013\bin\mayabatch.exe -file "C:\Users\ty\Desktop\test01.mb" -command "polyCube;file -save;"
pause > nul
こんな感じです。
今回はキューブを作成し保存するという処理を行っています。
一文ずつ解説します。
C:\"Program Files"\Autodesk\Maya2014\bin\mayabatch.exe
まずはmayabatch.exeまでのパスを書きます
-file "C:\Users\ty\Desktop\test01.mb"
続けてfileフラグでデータまでのフルパスを書きます。
※フルパスでなくてもいけたはずですがまぁフルパスにこしたことはないです
-command "polyCube;file -save;"
commandフラグでmelコマンドを書いていきます。
長くなる場合はmayaのmelのパスが通っている場所にプロシージャとして登録しておき
それを読んできた方がスマートだと思います。
※ここまでが↑一文です
pause > nul
これはコマンドプロンプトから実行したときに処理が終わるとすぐ実行画面が消えてしまうので
確認しやすいようポーズしているだけです。まぁなくても問題はありません。
こんな感じで実行すればGUIを立ち上げずに処理を行ってくれるので早いですし
メモ帳等にこの文を保存して拡張子を.batにすればバッチファイルの出来上がりです。
さらに改行して別データの処理を書けば上から順に実行していってくれます。
batだけ作ってしまってPCに処理をさせておいて優雅にランチタイムなんてどうでしょうか
効率的ってすばらしい!!
まぁ簡単ですが今回はおわりです
またそのうち更新しますねー
ブログを書こうと思いつつもどんどん先延ばしになって、かなり期間が開いてしまいました(・へ・)
4月からいっぱしのクリエーターになっていろいろな意味でこのブログも
書きにくくなってしまいました;;
とまぁあまり書いていると睡眠時間がどんどん無くなるので
さっそくですが本題ですよ
社会人になって友達の幅もかなり増えたりして仕事の色々な話を聞く機会がふえました
そんな中で効率を上げたいという話をよく耳にします
なので今回は同じ修正をカット毎しなければならないめんどくさい作業をもっと効率化しよう!
という内容です。
ちょっとこのブログではそこまでmel等のスクリプトを取り上げていませんが
今回はmelありきになってしまうかもしれません。ご了承を。
mayabatchというものをご存じでしょうか。
GUIを立ち上げずにmayaの処理を行ってくれるヤツです。
windowsのコマンドプロンプトからコマンドを打って実行します。
例)
C:\"Program Files"\Autodesk\Maya2013\bin\mayabatch.exe -file "C:\Users\ty\Desktop\test01.mb" -command "polyCube;file -save;"
pause > nul
こんな感じです。
今回はキューブを作成し保存するという処理を行っています。
一文ずつ解説します。
C:\"Program Files"\Autodesk\Maya2014\bin\mayabatch.exe
まずはmayabatch.exeまでのパスを書きます
-file "C:\Users\ty\Desktop\test01.mb"
続けてfileフラグでデータまでのフルパスを書きます。
※フルパスでなくてもいけたはずですがまぁフルパスにこしたことはないです
-command "polyCube;file -save;"
commandフラグでmelコマンドを書いていきます。
長くなる場合はmayaのmelのパスが通っている場所にプロシージャとして登録しておき
それを読んできた方がスマートだと思います。
※ここまでが↑一文です
pause > nul
これはコマンドプロンプトから実行したときに処理が終わるとすぐ実行画面が消えてしまうので
確認しやすいようポーズしているだけです。まぁなくても問題はありません。
こんな感じで実行すればGUIを立ち上げずに処理を行ってくれるので早いですし
メモ帳等にこの文を保存して拡張子を.batにすればバッチファイルの出来上がりです。
さらに改行して別データの処理を書けば上から順に実行していってくれます。
batだけ作ってしまってPCに処理をさせておいて優雅にランチタイムなんてどうでしょうか
効率的ってすばらしい!!
まぁ簡単ですが今回はおわりです
またそのうち更新しますねー
2014年3月11日火曜日
登録:
投稿 (Atom)