|
Softimage XSI の Object View ってなんだっけ? すっかり操作を忘れてしまった感のあるSoftimageXSIの画面とその機能ですが、 Object Viewは、指定したオブジェクト (例えばキャラ全体や頭・手と言った特定の一部分)を ずっと表示してくれる画面で、そのオブジェクトがどんなに動いても常に中央に表示し続けてくれるウィンドウでした。 その部分の動きの確認やアニメーションを付ける際に非常に便利な画面でした。 ■ドキュメントBasics(基本) > ビューイングとナビゲーション > Object View どんな使い方の時便利? すぐに思い付くObject Viewの使い方としては、 アクションやダンスモーション中の手のアニメーションやフェイシャルアニメーションの 検証用または設定用の表示画面として使えそう、と思い浮かべるかと思うのですが、 実はある条件での作業でその機能がとても役立つことを知りました。 それは、こんな場合です。 キャラクターのアニメーションが原点で動いているのではなく、どんどんと原点から遠ざかって行ったり、 原点の場所を全く無視したアクションを作っていたりする場合です。 そして、それはどんな時に起こるか、といえば・・・・ UnityやUE4を利用したリアルタイムのシーケンスとして実機映像やムービーを作成している場合などです。 各キャラクターのモーションはオフセット値を使った配置型にするのではなく、 その場の演技モーションとして作成して登録した方が作業的にも都合が良く、 また、キャラクターのアニメーションも各カットシーン用に作成するものなので、 使い回しを気にするデータではありません。 そんな、途方も無く原点から遠い場所でアニメーションを作成している場合、 どこに居ようがオブジェクトに追従して指定した部分をずっと表示してくれる画面である Object Viewは凄く重宝するウィンドウになることが予想されます。 |
Viewウィンドウの用意何のパネル? いつものごとく、カメラを選択出来るウィンドウは Mayaだと何のパネルを使っているかを調べるところから始めます。 いつも何気なく使っているMayaの画面で、カメラがあるウィンドウと言えば、 そう、前面ビュー や 側面ビュー のウィンドウです。ここから紐解けそうです。 今回の調べ方も、ちょっと違う方法から見てみましょう。 Mayaにはパネルエディタというウィンドウがあります。 日本語UIにしていると日本語の表記の一覧になっています。 Mayaのデフォルトの状態でもたくさんのパネルが用意されていることがわかります。 Pythonを使ってデータをこの順番で表示するには以下の方法で出来たりします。
ここで注目するところは、全ての空でないパネルから 実はパネルのラベルを表示するとパネルエディタの表示と同じになる、ってところです。 しかも日本語で返って来ます。 で、その時の各パネルのタイプは、上記スクリプトでもう取得しているので、それを表示してみると。
という結果を表示していることから、前面ビューなどはmodelPanelであり、 デフォルトの状態で既に4枚あることが理解出来ます。 と、ここまで来れば、modelPanelを作れば良いので、このコマンドもmodelPanelです。 ■modelPanel http://help.autodesk.com/cloudhelp/2018/JPN/Maya-Tech-Docs/CommandsPython/modelPanel.html modelPanelを作成する時、上記のようにラベルに名前を付けるとパネル名になり、 表示に使うカメラも同時に設定することができます。 パネルはformLayoutを使ってUI的に表示制御しますので、今はこんな感じで書くと想定して次に行きましょう。
|
追加するカメラどんなカメラ? さて、カメラの設定のあるパネルは用意出来たところで、今度はそのカメラについてです。 通常、Mayaのカメラは、注目点の設定の無いカメラ単体のカメラですが、 ここでは制御がしやすいカメラ、エイム、アップを使いたいと思います。 メニューから作成すると、グループノードの下にカメラと_aim、_up の制御が付いたカメラが作成されます。 ■camera http://help.autodesk.com/cloudhelp/2018/JPN/Maya-Tech-Docs/CommandsPython/camera.html このカメラが作成される時の ログを[レ]すべてのコマンドのエコーを有効にして、スクリプトエディタを見てみると、 camera から始まるログ行を Python化 出来そう ・・・・なのですが、意外にもスクリプト化が面倒なのです。(特に cameraMakeNode のあたりなど・・・・) そこで、今回は最初のMelコマンド行をそのまま使うことにしたいと思います。
この Melコマンド'CreateCameraAimUp;' を実行後は、カメラgroup以下の3つのノードが選択状態になっていることから、 続いて選択 lsコマンドを使って、各要素の設定するようにしてみます。 カメラ自身は、ニアクリップを10、ファークリップを30とし、 _aim の注目点の位置を0,0,0に設定します。
カメラのコンストレイント設定 このスクリプトの実行条件として、"選択したものを注目する画面"にしたいので、 選択したものを親とした _aim と _up の付いたカメラを作成した後、 Mayaのシーンのトップに 作成されたカメラグループを移動させて、 元あった親とのParentコンストレイント を設定します。 こうすることで、最初に選択したものの階層構造内に作ったカメラが介在しないようにしておきます。 上のスクリプトで、 作成したカメラを特定していて (o_cam ) 、そのカメラについている番号 (n_number 例;1,2,3) を利用します。 上のスクリプトの続きで、 カメラの親である カメラの groupノード を特定して、その名前を変更しておきます。(例;"ObjectViewCamera_group1") それをMayaのシーンルートに移動したいのですが、 これはparent コマンドで 、world=True とすると簡単に設定出来るところが面白いところです。 後は、元の親とMayaのシーンルートに移したGroupノード間に parentConstraint を設定します。
|
UIの用意formLayoutの設定 カメラの設定が出来るmodel パネルと、 通常良く使うcolumnLayoutを 一緒に1つの window に表示させるにはformLayout を利用します。 ■formLayout http://help.autodesk.com/cloudhelp/2018/JPN/Maya-Tech-Docs/CommandsPython/formLayout.html また、model パネルの表示設定は、modelEditorというコマンドから行います。 ■modelEditor http://help.autodesk.com/cloudhelp/2018/JPN/Maya-Tech-Docs/CommandsPython/modelEditor.html modelEditorのオプション displayAppearance で 外観を設定し (例; 'smoothShaded' )、 グリッド表示やテキスチャー表示の有無も設定出来ます。 この部分だけを完成したスクリプトから抜粋すると、以下のようになっています。
さて、完成しているUIの方を見ると、 幾つかのスライダーでカメラの ニア/ファークリップや位置/回転値のオフセット値が変更出来るようにしています。 このスライダーを動かすと値が瞬時に反映するようにするには floatSliderGrpコマンドのオプションでdragCommandとchangeCommandの設定を利用するのですが、 ここでも面白い python らしい設定を仕込みます。 以前に紹介している Python ツールにも登場しているのですが、無名関数lambdaを使います。とても便利です!! ■無名関数: ラムダ式 https://docs.pyq.jp/python/library/lambda.html 仕組みとしては、スライダーを動かして得た値 (つまり dragCommand か changeCommand が発生した時の値)を、 別の式にその値をそのまま送って結果を反映するようにしたい訳です。 以下完成スクリプトからの抜粋では、カメラの FarClipPlane のスライダーを動かしたら 即座にカメラの FarClipPlane の値が変更がされる、というスクリプト部分になります。
このような設定をスライダーがある分、行っているだけです。 |
増殖し続けるパネル対応 未使用パネルの削除 以前にも紹介しているカスタムのツールと同じ対応が必要です。 それは、Mayaのパネルはシーンにどんどんと溜まっていってしまうので、 閉じてしまったパネルの数に気が付かないままSaveして使い続けてしまえる ことへの対処が必要です。 そこで、新たなパネルを作成する時、以前に作ったパネルを検索し、 それが非表示パネルであれば消す、という仕組みを入れておきます。 今回作っているパネルの種類は "modelPanel" と解っているので、その種類のパネルを全部取得し、 その中から、今回パネル名、つまりラベルとして "CustomObjectViewer" って付いているパネルで、 尚且つそれが 表示していないパネルであるなら そのパネルを削除する、っていう動作をスクリプト化します。 getPanel コマンドを使えば、パネルの種類や非表示のパネルか、が取得でき、 パネルの削除はdeleteUIコマンドを使って行えます。
|
使い方 基本的には、すっと見ていたいノードを選択状態にして、スクリプトを実行します。 すると、自動的にその選択したものをずっと追うカメラが設定してあるウィンドウが立ち上がります。 以下の図は、Character1_Head というエンドJointを選択してスクリプトを実行した例になります。 選択したノードが必ずしも正面に対して プラスのZ方向とは限らず(例;手など) また、中央に表示したいものだけを表示して見やすくする為に Near/Farクリップ を設定すると良い感じに活用できます。 キャラクター自身のJointの方向に合わせて、移動/回転値のオフセットを入れることで ウィンドウに合わせた方向に設定出来るはずです。 カスタムグラフエディタのカレントフレームを左右に動かすことで、 Mayaシーン と カスタムのウィンドウ のアニメーションが同時に動く様子が見れます。 Near/Farクリップを設定することで、カメラから見て邪魔な前後の表示をカットすることが出来ます。 例えば、Farクリップを設定して、 自分の体で見えにくくなってしまう手だけを表示したい場合に有効です。 また、Nearクリップを設定することで、腕で隠れてしまった顔だけを表示することが可能です。 非表示にしたパネルはを必ず削除を実行していますが、 新規作成したカメラのGroupノード以下はMayaのシーンに残っているので任意に削除が必要です。 |
GitHubを使った公開 という訳で、ツールはGitHubを使って公開しています。 ツールの設定 Pyファイルはシェルフにボタン登録するか、プルダウンメニューに登録して実行します。
Pyファイルは GitHub に公開しています。
GitHub にアカウント登録していなくても ダウンロードは出来ます。 下記リンクページで、右上[ Clone or downlaod ]という緑色のボタンからダウンロードを行います。 ボタンを押すと表示される[ Download ZIP ]という右側のボタンからZipファイルを取得します。
|
次回もMayaかも?・・・
乞う、ご期待!! Stay tuned .. |