[Maya] ProjectSetとPathの扱いについて

MayaのFileノードのパスやリファレンスパスについて、挙動がわかりにくいので調べてまとめてみました。

基本的な形

まず、Mayaはフォルダを指定して、Projectを作成します。
その作成したプロジェクトを基準にパスを持ちます。

TexturePath01

SetProjectで指定したimagesフォルダ(デフォルトだとsourceimages)にあるテクスチャを
Mayaから読んだ場合は、このようにフルパスではなく
プロジェクトセットしたフォルダ基準の相対パスとして表示されます。texturePath_ascii

内部的にはどういう値を持っているか、シーンをAsciiで保存して開いてみると
Maya上では相対パスに見えてもAsciiでは一見するとフルパスのような感じで保存されています。
が、よく見るとパスの途中が // になってるのが分かると思います。

Mayaの保存ファイル的には、テクスチャに限らずこの // がプロジェクトルートとして扱われ
もしこのプロジェクトの位置が変わったとしても、プロジェクトセットさえすれば // より左側のパスは適切に置き換えてくれるようになります
また、その場合、テクスチャの読み先として優先されるのは『プロジェクトフォルダ下のsourceimages』
であり、保存した段階のパスではないのに注意が必要です。

コピペで書き換えた場合

このFileノードのパスを別のテクスチャに変えたい場合。
E:/MayaPathTest/testProj/sourceimages/test2.jpg
のようなフルパスをコピペで入力した場合は、

texturePath02

たとえ // ではないフルパスをコピペしたとしても、コピペしたファイルがプロジェクトディレクトリの下のimagesにあれば、問答無用で相対パス扱いになります。
これは、Mayaの仕様で(ありがた迷惑な場合もある)プロジェクト内にあるものはプロジェクトのものとして扱うように強制的になってしまいます。
プロジェクト下のフォルダにいて、かつ絶対パスにすることはMayaから操作する場合、ほぼ不可能です。
(スクリプトでSetAttrした場合も、同様の挙動を取ったと思います)

プロジェクト外のフォルダに指定した場合

fullPath

Mayaが相対パスではなく絶対パスとして扱われるケースは、このプロジェクト外のテクスチャになっていた場合があげられます。
この場合、

fullPath_ascii

Asciiファイル内でも // ではない絶対パスで保存されます。
この場合は、Mayaは自動でパス書き換えをしてくれないので環境が変わった場合などにパスが書き換わらずリンク切れが起きてしまいます。

なので、特に理由がない場合はプロジェクト下のsourceimageでテクスチャを管理する事で
他の会社への受け渡しトラブルを減らすことができます。

絶対パスのリンク切れ時の捜索

絶対パスで指定したファイルが見つからない場合、Mayaのプロジェクトディレクトリ下に同名のファイルがないか探しに行きます。
もし、同名ファイルがプロジェクトしたに存在していればプロジェクト下にある同名ファイルに切り替わり
テクスチャのリンク切れを防ぐことができます。
ただし、探しに行くのはsourceimages下のみで、フォルダの子階層以下は考慮されません。
さらに、この場合見るのは「名前」のみしか見ないので意図しないテクスチャが貼られるケースもあります。

また、プロジェクト下のsourceimagesにファイルがあればレンダリングはされますが
MayaAsciiの絶対パスは、最初の絶対パスのまま置き換わることはありません。

ちなみに、絶対パスが生きていてプロジェクトセットされたフォルダしたのsourceimagesがあった場合、
絶対パス側が優先されます。
絶対パスのものを相対パス化したい場合は、sourceimages下にテクスチャをコピー下後、
ImageNameにプロジェクト下のフルパスを入れるか、 sourceimages/TextureName.jpg のような相対パスを入れると、相対パスに書き換わります。

おまけ

Asciiファイルでプロジェクト下のパスになっているものを絶対パスに書き換えたとしても、開き直すと相対パス扱いになるようです(昔は書き換わらなかった気がしたんだが・・・)

相対パスか絶対パスになっているかは、ImageNameがドライブレターから始まっているかどうかが基準になります。
絶対パス、かつファイルパスが通ってないのに表示されているケースは、
今のプロジェクト下にテクスチャが存在しているため「見えるようになってる」というのが考えられます。

リファレンスのパスに関しても扱いはほぼほぼ同じ…はず。
キャッシュ周りはどうか分かりません…(Mayaパーティクルは問答無用で相対パスなんですが)

記憶を頼りにざっくり検証してみたらこんな感じになりました。
テクスチャの捜索に関しては他にもルールがあった気がするのですが忘れました(汗

今のところこれ以外のケースは記憶にないのですが、他にもなにかあったら教えてくださいorz

追記

テストしてたプロジェクトをそのままコピー→Asciiファイルのテクスチャパスを絶対パスに書き換え
このコピーしたプロジェクトにMayaをプロジェクトセットしてシーンを開く
で確認すると、同じような構成のプロジェクトではあるものの、
元フォルダの絶対パス扱いになっているためプロジェクトセットしたとしてもパスは相対パスには置き換わらない模様。
この場合、開いた直後はFileNodeのTexutreパスは相対っぽく見えるものの内部は絶対パス扱い
になっていました。
さらに、このMayaAsciiファイルの中身をプロジェクトディレクトリ通りの絶対パスに書き換えて開き直すと、
FileNodeのImageNameは相対な見た目だが、getAttrしたとき内部的には絶対パスになるようです。
しかも、MayaAscii的には相対パス扱いというわけわからん状態に…絶対パスの状態はどこに持ってるんだよ!!!という感じですね。

さらに、この分け分からなくなってるプロジェクトをコピーしてコピーしたプロジェクトフォルダにSetProjectして、ファイルOpen。

そうすると、絶対パス扱いに。
Asciiファイル的には相対パス扱いにもどってたのにどうしてこうなった….

そのコピーしたののsourceimagesより左を削除して保存し直すと、無事相対パスに戻りました。
うーむ…

つまりは、見た目相対パスな絶対パスは発生しうる+その状態はある意味すごいイレギュラーという事のようです…ですが、この状況って色々とやりとりしたりしてたら容易に発生しそうだし、
分けの分からないエラーの発生原因になりそうです。KOEEE
Asciiファイルからも状況が追えないので、スクリプトから//があるかで判定するしか
現状手立てがないっぽいです。ヴァー

コメントを残す

メールアドレスが公開されることはありません。


*