■3dsmaxのカスタムアトリビュートが、インスタンスでもないのに同期してしまう
例えば、オブジェクトAに設定したカスタムアトリビュートに項目を追加したときに、オブジェクトBに設定したカスタムアトリビュートにも同じように編集がされてしまう、という現象があり、困っていました。
カスタムアトリビュートを設定したオブジェクトをシーン内でコピーした場合は、問題がないのですが、
カスタムアトリビュートが設定されたオブジェクトAが含まれたmaxファイルを開き、
同じmaxファイルをそのシーンに合成(Merge)してくると、
インスタンスでもないのに、カスタムアトリビュートの編集内容が同期するようになってしまいます。
カスタムアトリビュートが同期する問題 |
モーファーのコントロール用のUIとして、各キャラ共通用の”アトリビュートホルダーを適用したシェイプ”などを作成し、
これを使いまわすことでコントローラーUIのリギング作業を効率化しようとした時などに、この問題が起こるかと思います。
■原因は、裏でカスタムアトリビュートを管理している管理用IDの「attribID」
「attribID」という管理用IDが、裏でカスタムアトリビュートを管理しているようで、そのIDが同じカスタムアトリビュートは、同様に編集される、という仕様があるようです。
(インスタンスみたいな挙動ですが、UIとしてのカスタムアトリビュートが同期するだけで、各パラメータの値は、個別に制御できるようです。)
シーン上でカスタムアトリビュートが設定されたオブジェクトをコピーした際には、
自動的に個別のIDが割り振られるため、個別に編集できるようです。
また、インスタンスで複製したときには、同じattribIDが割り当てられますが、インスタンスを解除(Make unique)すると
自動的に個別のattribIDが割り当てられるようです。
ところが、前述したように、
カスタムアトリビュートが設定されたオブジェクトがあるmaxファイルを開き、
同じmaxファイルをそのシーンに合成(Merge)すると、
同じattribIDのカスタムアトリビュートが複数シーン内に存在することになり、同期する現象が発生してしまうようです。
■maxscriptで「attribID」を個別に設定して、同期してしまったカスタムアトリビュートを個別に編集できるようにする方法
カスタムアトリビュートのattribIDの値は、参照することはできるのですが、直接attribIDを編集することはできません。
ですが、カスタムアトリビュートのmakeUniqueというmaxscriptのコマンドを使うと、
そのカスタムアトリビュートのattribIDの値がランダムに生成された新しい値に更新され、個別に制御できるようになります。
例えば、選択したオブジェクトのベースに設定されている、1つ目のカスタムアトリビュートのattribIDを更新する場合は、以下のように記述します。
ca = custAttributes.get $ 1
ca_def = custAttributes.getDef ca
custAttributes.makeUnique $ ca_def
■カスタムアトリビュートのプリセット機能における、makeUniqueコマンドの注意点
3dsmax2017の新機能で追加された、カスタムアトリビュートのプリセット機能も1つのカスタムアトリビュートとして認識されているようで、そのために注意しなければいけないことがあります。例えば、あるオブジェクトに追加されているカスタムアトリビュート全てを、makeUniqueコマンドでリセットする処理をした場合、
プリセット機能のattribIDもリセットされることになるのですが、
このプリセット機能のattribIDを更新してしまうと、maxファイルを保存して、3dsmaxを一度落としてから再度ファイルを開いたときに、
プラグインエラーのような表示がでて、プリセット機能が消えてしまう、という問題が起こってしまいます。
ですので、一括処理で複数のカスタムアトリビュートのattribIDを更新する場合には、プリセット機能のみ変更されないように注意する必要があるようです。
※※※
カスタムアトリビュートのプリセット機能のattribIDは、全て一律で#(524563412, 909387258)のようです。
0 件のコメント:
コメントを投稿