myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

SI | MirrorUV

最近またSoftimageのUVツールを作っています。

今更ですねw

もうSoftimageツールなんか作らないと思っていたが、まだ仕事でSoftimageを使っていて、今のプロジェクトも再来年末の発売予定なので、しばらくSoftimageは使い続けます。もっとSoftimageの仕事を増やしましょう!!

で、今日は手が空いていたので実験的にUVのミラーツールを作ってみました。
UVなので、コンポーネントのループはめっちゃ多くなると予測して、久しぶりにPythonではなく、JScriptで書くことにしました。

選択されたUVのポリゴンを探して、そして反対側のポリゴンを探して、サンプルの位置を反対にするというアイデアから書き始めました。 ま、難しくはないと思いますが、ここにたどり着くにはそこそこ時間が掛かっちゃいました。

ループはたくさん使うので、出きるだけ処理を軽くする為に、オブジェクトコレクションを直接にループするのではなく、出きるだけ配列化してからループすることにしました。

例えば、XSI男の頭のサンプルを選択して、選択したサンプルをフェイスに変換したい。
2つの方法は思いつきます。

①コンポーネントのコレクションのループ。
オブジェクトのポリゴンを全てループして、ポリゴンのサンプルをループして、選択したサンプルと同じIDでしたら、そのポリゴンをポリゴンクラスターに入れておく

var oSample2Poly = oObj.ActivePrimitive.Geometry.CreateSubComponent(siPolygonCluster)
it = 0
var oFacets = oObj.ActivePrimitive.Geometry.Facets
for ( var i=0; i < oFacets.Count; i++ ) {
var oFacetSamples = oFacets(i).Samples
var oFacetIdx = oFacets(i).index
theloop:
for ( var j=0; j < oFacetSamples.Count ; j++ ) {
oFacetSampleIdx = oFacetSamples(j).index
for ( var k=0; k < oSampCol.Count ; k++ ) {
if (oSampCol(k).index == oFacetSampleIdx){
oSample2Poly.AddElement( oFacetIdx )
it++
break theloop
}
}
}
}

LogMessage ( it + 'iterations' )

ループの回数: 294
処理時間: 883 ミリ秒

数年前に書いた記事のループの最適化と同じやり方にすると

for ( var i=0, a = oFacets.Count; i < a; i++ ) {
・・・などなど

ループの回数:294
処理時間: 699 ミリ秒

ま、若干早くなりますが、たいした差がない。


で、もう一つの方法は
②オブジェクトの全てのポリゴンをループして、ポリゴンのサンプルをループして、配列にそのIDを入れておく。
選択したサンプルをループして、そのサンプルのIDを使って先ほどの配列でこのサンプルのポリゴンを探して、ポリゴンIDをクラスターに入れる。


it=0
var aSample2Facets = []
var oFacets = oObj.ActivePrimitive.Geometry.Facets
for ( var i=0, a = oFacets.Count; i < a; i++ ) {
var oFacetSamples = oFacets(i).Samples
for ( var j=0, b=oFacetSamples.Count; j < b ; j++ ) {
aSample2Facets[oFacetSamples(j).Index] = oFacets(i).Index
it++
}
}

var oSample2Poly = oObj.ActivePrimitive.Geometry.CreateSubComponent(siPolygonCluster)
for ( var i=0, a = oSampCol.Count; i < a; i++ ) {
oSample2Poly.AddElement( aSample2Facets[oSampCol(i).Index] )
it++
}

LogMessage ( it + 'iterations' )

結果:
ループ回数:2304
処理時間: 30ミリ秒

コードが若干長くて、ループの回数も多いけど、処理は29.4倍も速い ! 29倍 !
期待以上だな。


えっ? 今更 Softimage  しかも JScript ?
時代は Python だと?

Python は基本的に処理が遅い方なので、MayaでPythonを書く時にもこういう風に工夫して書いたりしています。

例えば、頂点一個ずつの位置を取得するより、オブジェクトの頂点の情報を全部一回配列にとっておくと後の処理はかなり早くなります。


あっ、忘れていた、ツールですね。

今はGUIなどないですけど、スクリプトでよければここにアップしました。
https://www.dropbox.com/s/klutsonp12hp4zs/mirrorUV_script.js?dl=0


Softimage : MirrorUV from myara on Vimeo.



Maya | mSetProject 2: シーンを開く前に自動プロジェクト設定

以前作ったmSetProject の進化版です。

mSetProject 1 はシーンを開いた後にプロジェクト設定は自動に行っていました。
このままだとテクスチャのパスはフルパスになってしまうので、フルパスをローカルパスに変更するスクリプトも掛けていました。

しかし、リファレンスや同名ファイルが入っている場合は不便ですね。
欲しいのは、手動でやっていることと同じ、シーンを開く前にプロジェクト設定。

色々調べて、ちょっと諦めていたところに OpenMaya の MSceneMessage というコマンドをみつけました。
この記事(英語)はすごく参考になりました。

ブログにアップするのは忘れていましたので、今更だけど良かったら使ってみてください。

使い方:
適当にどこかに解凍してください
mSetProject.py ファイルは scripts フォルダにコピー (例:C:\Users\myara\Documents\maya\scripts)

scripts フォルダに userSetup.py が存在していない場合は:
同封されている userSetup.py をそのまま scripts フォルダにコピー

scripts フォルダに userSetup.py が存在している場合は:
そのファイルを編集して以下の2行を追加するだけです。

import mSetProject
mSetProject.main()




Download:
https://www.skymill.co.jp:5555/sharing/7jdy7SdNS

SI | imf_copy.exe 画像ファイルの変換

少し前にSoftimageデータからMayaに変換する作業が大量にありまして、
その作業の中でPICファイルをTGAに変換する必要がありました。

普段でしたらPhotoshopを使って変換しますが、大量のデータだとこれは時間が掛かりすぎます。
Photoshopのアクションやスクリプトを使えば多少楽にはなるけど、もっと早く、もっと楽、そして
出来ればSoftimage上でテクスチャパスを取得して、1クリックで変換が出来る方法を探していました。
これでしたら、一瞬で終わります。

その為にコマンドライン対応の変換ソフトが必須です。

色々調べて試してみたけど、一番使い勝手が良かったのはSoftimageメールリストのXSI仲間が教えてくれた
「imf_copy.exe」でした。10年ぐらいSIを使っているのに知りませんでした。

このコマンドは bin フォルダの中に入っています。

2015 の場合:

C:\Program Files\Autodesk\Softimage 2015\Application\bin



コマンドラインでこれを使えば画像の変換が簡単に出来ます。

情報があまりない為、どのフォーマットを対応しているもまだ分かりません。

私のテストではTIFF, TGA, PNG, JPG, PIC (Softimage) の変換は問題なく可能でした。
残念ながら PSD,GIFとDDSはダメでした。

imf_copy.exe をそのまま実行すると、使えるフラグが見れます。
画像の場合は JPEG と EXR の圧縮設定が出来ます。
オプションが少ないですが、単純な変換には使えます。

使い方は簡単:

test.PIC を test.TGA に変換する場合:

imf_copy.exe C:\test.PIC C:\test.TGA



です。

このようなファンクションもできます:

#python
from subprocess import call
import os

def ConvertPic(folder, in_format, out_format):
for dirpath, dirnames, files in os.walk(folder):
for filename in files:
if filename[-3:].lower() == in_format.lower():
newname = filename[0:-3]+ out_format
newFullPath = os.path.join(dirpath, newname)
oldFullPath = os.path.join(dirpath, filename)

xsiPath = r"C:\Program Files\Autodesk\Softimage 2015\Application\bin"
cmdline = "imf_copy.exe " + oldFullPath + " " + newFullPath
call(cmdline, cwd=xsiPath)

ConvertPic("D:\\convertPic", "tga", "png")

これは指定されたフォルダに入っている in_format ファイルを探して、 out_format に変換します。
この例は TGA → PNG になっています。
※ サブフォルダも含めてのファイル検索です。


参考になるかもしれないので、そのプロジェクトで使っていたコードです。
俺用のコードなので、コメントは英語です、すいません:

#python
xsi = Application
from subprocess import call
import os

# Search File And Convert (used by ConvertTextures)
#-----------------------------------------------
# Search Pic File in a Folder and convert it ot TGA
def searchFileAndConvert(filename, rootdir):
for dirpath, dirnames, files in os.walk(rootdir):
for name in files:
if name == filename:
if name[-3:].lower() == "pic":
newname = filename[0:-3]+"tga"
newFullPath = os.path.join(dirpath, newname)
oldFullPath = os.path.join(dirpath, name)

xsiPath = r"C:\Program Files\Autodesk\Softimage 2015\Application\bin"
cmdline = "imf_copy.exe " + oldFullPath + " " + newFullPath
call(cmdline, cwd=xsiPath)
else:
newFullPath = os.path.join(dirpath, name)

return newFullPath

# Convert Textures
#-----------------------------------------------
# Convert All PIC files inside the Project
def ConvertTextures():
oProject = xsi.ActiveProject
projPath = oProject.path
oScene = oProject.ActiveScene
ImageClips = oScene.ImageClips

for img in ImageClips:
oSource = img.Source
fileName = oSource.Parameters("FileName").Value.replace("/","\\")
oriPath = oSource.Parameters("Path").Value

#Skip noIcon
if oSource.Name == 'noIcon_pic': pass

# FileName without Path
texName = fileName[fileName.rfind('\\')+1:]

# Search for texture file in Project
newPath = searchFileAndConvert(texName, projPath)

# If found, assign it. Replace FullPath for Relative Path
if newPath and newPath[newPath.find(projPath):] != -1:
relativePath = newPath[len(projPath)+1:]
if oSource.Parameters("FileName").Value != relativePath:
oSource.Parameters("FileName").Value = relativePath


これで、全てのPICファイルはTGAに変換されて、パスをTGAに直してくれる。


因みに、他に試したソフトの結果:

■IrfanView
http://www.irfanview.com/
有名なフリーツールですね。商用は有料です(US$12)
こちらはコマンドラインも対応しているので、丁度いいかもと思い試してみましたが
なぜかTGAに変換するとアルファチャンネルが消えてしまいます。

i_view32.exe D:\TestXSI\textureFile.pic /bpp=32 /convert=D:\TestMaya\textureFile.tga



■XnConvert
http://www.xnview.com/en/xnconvert/
こちらは完全無料です
なんと500フォーマットを対応しているそうです。そんなにあったのか画像の形式・・・。
とても良いソフトですが、コマンドライン対応していない為スクリプトで使えない。
1人で変換作業する場合はこのソフトは結構お勧めです。

■XnView
http://www.xnview.com/en/
同じ開発会社のソフトなので、XnConvertと似ていますが、
コマンドラインも対応しています(nconvert.exeというサブツール)
こちらもIrfanViewと同じように、個人で使う場合は無料ですが、商用は有料(US$30)
中々良いソフトです。
これにしようか迷っていた時にimf_copy.exe に出会いました。

次にもっと複雑な作業の時にXnViewにしようかな。

nconvert.exe -out tga D:\TestXSITest\textureFile.pic



SI | mSlide Relax Brush

Shrink Wrap, Relax と Gator を組み合わせて作ったシンプルなリラックスツールです。

Relaxオペレーターでメッシュをリラックスさせて、ShrinkWrapでもとの形を保って、GatorでUVを保ってスライドさせる。

難しいこと何もしていないけど、わりと使えるツールです。
もっと前に作っておくべきだったな・・・。

DOWNLOAD

■インストール方法:
Plugin形式なので、Pluginフォルダに入れて、プラグインマネージャーで更新。
もちろん、ワークグループに入れてもOK。

Pluginフォルダの例:
C:\Users\myara\Autodesk\Softimage_2015\Application\Plugins



■実行する方法:
Deformメニューから実行ができます。
そして、オブジェクトを選択している時の右クリックメニュー

Read more

SI | mCamera : FOV 変換 : Maya SI 3DCoat ZBrush のカメラを合わせる

昨日の記事 FOV 変換 : Maya SI ZBrush のカメラを合わせる の続きです。

とりあえずSoftimageのGUIを作ってみました:


Softimage : Camera FOV from myara on Vimeo.



DOWNLOAD

Download Script Version

実行方法:
シェルフにボタンを作るか、スクリプトエディターから実行して下さい。
--------------------------------------------

Download Plugin Version

インストール方法:
プラグインフォルダにコピー:
例:

%USERPROFILE%\Autodesk\Softimage_2015\Application\Plugins



もしくはワークグループのプラグインフォルダにコピー

実行方法:
Get > Primitive > Camera > mCamera FOV にクリック
--------------------------------------------

次はMayaかな。
Softimageに慣れているからGUIはすぐ作れたけど、MayaのGUIの作り方は良く分からないな・・・。
Next page