myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

Maya | ヒストリを残さないアトリビュートの転送(メモ)

今日見つけたやり方です。昔のMayaユーザーにとってこれは当たり前かは分かりませんが、ちょっと面白いと思ったのでメモっておきます。

アトリビュート転送をウェイトが入っているモデルに使うと「デフォーマ以外のヒストリ(Non-Deformer History)」がこのアトリビュート転送のヒストリを消してくれない。普通のトランスフォームノードではなく、中間シェイプに転送すれば、ヒストリでアトリビュート転送を消してもウェイトが残ります。

transfer.jpg


やり方:
・Outlinerではシェイプノードが表示されるようにShapeにチェックします。
・中間シェイプ (Intermediate Shape) を探して(普通はなんとか _Orig という名前になっています)、 Intermediate Object アトリビュートのチェックを外す。これでやっと中間シェイプがOutlinerには表示されます。
・転送したい元のオブジェクトを選択して、中間シェイプを選択して、アトリビュート転送を行います。
・中間シェイプのヒストリを削除して
・中間シェイプのIntermediate Object のチェックを付けなおします。
以上

試しにポーズされたままで転送を使ってみた動画です。


Maya Transfer Attributes without history from myara on Vimeo.



スクリプト化は簡単そうなので、そのうちに書いてみようかな。

SI データを Maya に持って行ったり、持って来たり

MayaとSoftimageにデータを持って行ったりもって来たりするツールを作ろうとしています。

最初のプロトタイプ(テスト用)が出来たので、公開します。

オブジェクトモデルをインポートエクスポート
UVをインポートエクスポート

という機能です。

仕組みはわりと簡単です。
一時フォルダにOBJに書き出して、OBJを読み込む。
UVの場合は、一時フォルダからOBJを読み込んで、UVをコピーして、OBJを削除。

※ C:\TEMP フォルダを使用されていない場合は自動に作成されます。

※ ただのOBJなので、マテリアル設定などは持っていけない。


色々考えて試してみた結果、この簡単な方法が一番うまく行きました。

これでFBXとかを使い分けると共有が出来るデータの幅が広がりそう。例えばSIにデータを持って行って、SIでウェイト作業を行って、ウェイトだけMayaに持って帰ったりして・・・。

参考までにして、好きにカスタマイズしてみてください。



MayaSI
Download

・script フォルダにコピー
・Python で:

オブジェクトデータをエクスポート
import MayaSI
MayaSI.expOBJ()

オブジェクトをインポート
import MayaSI
MayaSI.impOBJ()

UVをインポート
import MayaSI
MayaSI.impUV()


SIMaya_Plugin
Download

プラグインフォルダにコピー

オブジェクトデータをエクスポート
Application.expOBJ()

オブジェクトをインポート
Application.impOBJ()

UVをインポート
Application.impUV()

SI | Normal + Inmed モードでもウェイトが消えない方法

Softimage でInmedモード(ヒストリーが残らないモード)のままでウェイトが付いているオブジェクトにNormal(法線)ツールを使うと、ウェイトが消えてしまう。

Inmedモードで法線いじらなければ済む問題ですが、ついやってしまいます。

Inmedモードを切って、
法線をいじって、
Freeze M を掛けて
Inmedモードに戻す

という手順になりますが、これは自動に出来ないのかと今更思いついて書いてみました。

答えは、コマンドイベントを作って、以上の手順を自動にすればいいだけです。
なんで早くこれをやらなかったのかな!

以下のコードをPythonファイルに保存して

例:NormalsEvent.py



プラグインフォルダに入れる:

例: C:\Users\myara\Autodesk\Softimage_2015_SP1\Application\Plugins


ワークグループの場合は:

C:\Workgroup\Application\Plugins


それだけです。あとはSoftimageに任せてください。


from win32com.client import constants as c
xsi = Application

def XSILoadPlugin( in_reg ):
in_reg.Author = "myara"
in_reg.Name = "NormalsEvent Plug-in"
in_reg.Major = 1
in_reg.Minor = 0

in_reg.RegisterEvent("Normal_BeginCommand", c.siOnBeginCommand)
in_reg.RegisterEvent("Normal_EndCommand", c.siOnEndCommand)
#RegistrationInsertionPoint - do not remove this line

return True

def XSIUnloadPlugin( in_reg ):
strPluginName = in_reg.Name
Application.LogMessage(str(strPluginName) + str(" has been unloaded."), c.siVerbose)
return True

def Normal_BeginCommand_OnEvent( in_ctxt ):
Application.LogMessage("BeginCommand_OnEvent called", c.siVerbose)
Application.LogMessage("Command: " + str(in_ctxt.GetAttribute("Command")), c.siVerbose)

coms = ['Tweak Normal Tool', 'Average User Normals', 'Set User Normal Values', 'Set Vertex User Normals', 'Set Polygon User Normals', 'Invert User Normals', 'Normalize User Normals', 'Paste User Normals', 'Create User Normals']

if str(in_ctxt.GetAttribute("Command")) in coms:
UserImmed = xsi.GetUserPref("OperationMode")
if UserImmed == True :
xsi.SetGlobal('Normal_Immed', 1)
xsi.SetUserPref("OperationMode", False )

return False

def Normal_EndCommand_OnEvent( in_ctxt ):
Application.LogMessage("EndCommand_OnEvent called", c.siVerbose)
Application.LogMessage("Command: " + str(in_ctxt.GetAttribute("Command")), c.siVerbose)

coms = ['Tweak Normal Tool', 'Average User Normals', 'Set User Normal Values', 'Set Vertex User Normals', 'Set Polygon User Normals', 'Invert User Normals', 'Normalize User Normals', 'Paste User Normals', 'Create User Normals']

if str(in_ctxt.GetAttribute("Command")) in coms:
UserImmed = xsi.GetUserPref("OperationMode")
if xsi.GetGlobal('Normal_Immed') == 1 :
sel = xsi.Selection
for obj in sel:
if obj.Type.find('Component')!=-1:
obj = obj.SubComponent.Parent3DObject
xsi.FreezeModeling(obj)
xsi.SetUserPref("OperationMode", True )

return False


元から書いてある部分
Application.LogMessage("Command: " + str(in_ctxt.GetAttribute("Command")), c.siVerbose)

をあえて残しています。
このコマンドイベントは全てのコマンドを感知して、この行で使われたコマンドのログを残してくれる。
スクリプトエディターのプリファレンスにVerboseもログするようにしない限りログには出てこないけど、似たようなコマンドイベントを作りたい場合は便利だと思ったので、念のため残しておきます。

では、 Read more

PySide + SI 2015 + Win10 + Maya

= エラー
(その2)

以前の記事にWin10 で PySideを使う方法を書きましたが、一つ大きな問題があるのは、Mayaには影響がある可能性がある。

PYTHONHOME という環境変数を設定するとMayaのPythonがうまく動かないこともあるので、その場合はSoftimageの環境だけに設定する必要があります。

やりかたはわりと簡単です。

・環境変数のPYTHONHOMEを削除しておく。
・Softimage のフォルダを開く
例:
C:\Program Files\Autodesk\Softimage 2013 SP1\Application\bin
・setenv.bat をテキストエディターで編集する。(例 notepad++)
※ 管理者として編集が出来るソフトが必要ですが、できない場合は、このsetenv.batをほかの場所にコピーしてから編集してもOK。

このファイルをひらくと最初に以下の5行が見えます:

@echo off
rem Softimage Installation path
set SI_HOME=C:\Program Files\Autodesk\Softimage 2013 SP1
set XSI_HOME=%SI_HOME%
set XSI_BINDIR=%XSI_HOME%\Application\bin



この次にPYTHONHOME 変数を入れればいいです。
PYTHONHOME = C:\Python27

注意:クオーテーションマークは不要 (PYTHONHOME = "C:\Python27" はNG)

こんな感じ:

@echo off
rem Softimage Installation path
set SI_HOME=C:\Program Files\Autodesk\Softimage 2013 SP1
set XSI_HOME=%SI_HOME%
set XSI_BINDIR=%XSI_HOME%\Application\bin

set PYTHONHOME=C:\Python27



・ファイル保存して、完了。
※他の場所に移って編集された場合は、元の場所に上書きしてください。

以上。

※ 

ALTは押し辛い→Sharpkeysで解決

MayaではALTを押しながらカメラを回転・移動などするので、頻繁に押しています。
しかし、ALTの位置がかなり端っこの方にあって、親指は曲がった状態で押さないといけない。

これが指や手の疲れや痛みにつながるので何とかしたいと思って、数年前に「ALT」を「無変換」キーと差し替えたソフトを使ってみてなんとか解決しました。

今週に新しいPCが届いてデフォルトのままで使っていたらやっぱりALTは押し辛い!差し替えた時はめっちゃ楽だったと改めて思って、今回このソフトを紹介しようと思っています。

Sharpkeys
http://www.randyrants.com/

ちょっとした問題ですが、僕のキーボードではALTを押してもSharpkeysは認識しないので、手動で「Special Key Left Alt」を選択しないといけない。「無変換」キーはちゃんと認識されるので、押すだけで済みます。

是非試してみてください。
Next page