チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第67回:Contextについて語る
- Maya
- ゲーム
- コラム
- チュートリアル
- 中級者
- 学生・初心者
- 教育
- 映画・TV
「今日会社に行くのに外に出るとアメでした。」
これは何を言っているのでしょうか?同じ言葉でも別の意味を持つ言葉があります。Mayaの中にもいくつかそういう言葉があります。
たとえば「リファレンス」という言葉は、ディスプレイレイヤーのリファレンス機能だったり、ファイルを読み込むリファレンス機能だったりします。初心者は「リファレンス」がどちらのことを意味しているかわからなくなりがちです。
残念ながら生まれてこれまで、外で飴が降っているようなハッピーな状況に出くわしたことはないので、経験を積むことで「外がアメ」は「雨」だと推測できるようになります。これと同じで、Mayaにどういう機能があるか、どういう風に使うか分かるようになれば、用語で勘違いすることが少なくなります。
Mayaを使っていてもずっと意味がよくわからなかった言葉で「コンテキスト」という言葉があります。特にスクリプトでツールを作り始めるとコンテキストという名前を見かけるようになります。
普段Mayaを使っている方もこの「コンテキスト」という言葉について知っておくと何かと便利ですので前半では一般的な話をして、後半ではちょっとややこしいAPI周りの話をします。
コンテキストとはどういう意味?
コンテキスト?馴染みのない英語なので調べてみると
「文脈」
「(文章の)前後関係」
「状況(~という面で)」
という日本語になり、これまたよくわかりません…。
MELのヘルプで「コンテキスト」を調べると次のような表示になります。
この「コンテキスト」という言葉、日本語にしづらいのですが、つまるところ「状況に応じた」という意味合いで使われています。
エディタで右クリックメニューを出すと、選択しているもの、エディタの種類で内容が変わります。「状況に応じて内容が変わるメニュー」、これすなわち「コンテキストメニュー」なのです。
まあなんとなくニュアンスがわかってもらえると思います。一般的にMaya以外のソフトでも右クリックで出るメニューはコンテキストメニューと呼びます。空気読むメニュー。
MELのコンテキスト
Mayaで他に出て来る「コンテキスト」という言葉はそれぞれで意味が異なりますし、同じことを言っているわけではありません。
MELでcontextを調べると次のような結果が出ます。
「インタラクティブ ツール」と副題がついていますが、普通のツールと何が違うのでしょうか?
ここで表示されている「Context」「Ctx」と書かれたツール。これはプラグインで作成可能なものですので、APIのドキュメントで意味を調べてみると、言葉自体の説明が出てきます。
「Maya開発者ヘルプ > コマンド プラグイン > コンテキスト」と進むと、次のように書かれているページに辿り着きます。
ふむ、そのまま訳そうとすると、
「Mayaの”文脈”は、マウスの動作の解釈方法を…。”前後関係”では、コマンドの実行、現在の選択内容の変更…。」
という感じで、意味が余計にわからなくなります。最後にちらっと書いてある「コンテキストをToolという名前で表します」という言葉通りに、コンテキストをツールと翻訳すると意味が分かるようになります。
「Mayaの(コンテキスト)ツールは、マウスの動作の解釈方法を定義するモードです。(コンテキスト)ツールでは、コマンドの実行、現在の選択内容の変更、描画操作の実行などが出来ます。」
超訳すると、
「Mayaの(コンテキスト)ツールは、マウスの入力によって編集する機能です。(コンテキスト)ツールでリアルタイムに結果を表示しながら編集できます。」
となります。(Mayaは気分屋の西海岸娘なので、こういう風に感じ取ってあげないといけない)
なにはともあれMayaで何か処理をする時、大きく2つの方法に別れます。
A)オブジェクトなど選択した後に、メニューやコマンドを実行する方法。
B)ツールを選んでから選択やクリックで実行する方法。
このBが「コンテキストツール」と呼ばれるものです。普通はマウスのカーソルが変わります。たとえばMesh Toolsのツールがこれにあたります。
「順々に入力を受け付けるツール」というか、まあ、「インタラクティブ ツール」ですね…。
もう一つのコンテキスト(API)
APIを見てみるとMDGContextというクラスが見つかります。今まで紹介したものと全く違うコンテキストです。
MayaのシーンはDependency Graphという、(Dependency)Nodeが複数接続されたネットワークで作られています。処理をするということは、このノードとネットワークを計算することです。
Mayaはアニメーションをサポートしていますので「どの時間で計算するか」が重要になります。0フレームと50フレームでは結果が異なるかもしれません。
そこで、時間を指定するのにMDGContextを設定します。
たとえば次のような感じで、MDGContextにMTimeで時間(フレーム)を設定し、MPlugに計算して欲しい時間としてコンテキストを指定します。
// 疑似コード MTime time(5.0); MDGContext ctx(time); MPlug.getValue(v, ctx);
Pythonの場合は次のようになります。(PythonAPI2.0)
pCube1にアニメーションがついていれば、5フレーム目の値が出力されます。
import maya.api.OpenMaya as OM sList = OM.MSelectionList() sList.add('pCube1') obj = sList.getDependNode(0) dgFn = OM.MFnDependencyNode(obj) plug = dgFn.findPlug('tx',0) ctx = OM.MDGContext(OM.MTime(5.0)) v = plug.asDouble(ctx) print v
現在の時間以外での値を得たい時、2つの方法があります。
カレント時間を変更してから値を取るという方法と、MDGContextで時間を指定する方法です。
カレント時間を変更するとシーン全体を再計算しますので、処理が多めです。
代わりにコンテキストを指定して値を得れば、必要なノードのみ再計算するので高速です。(場合によります)
もう少しAPIのコンテキストの深い話
MDGContextはMPlug::getValueの引数として渡すだけでなく、MDataBlockにも関わってきます。
Mayaではノードがcompute内で処理する際に使う値をMDataBlockという塊にして受け渡しています。 MPxNode::computeは次のようになっています。
virtual MStatus compute (const MPlug &plug, MDataBlock &dataBlock)
このMDataBlockにもコンテキストが設定されており、どの時間でのデータかということが分かるようになっています。つまり、MDGContextごとにMDataBlockが用意されるので、同じ時間(MDGContext)で処理する場合MDataBlockを使いまわすことができ、キャッシュが効くようになります。こういう処理の最適化のメカニズムにもコンテキストが使用されています。
MDGContextではContextという言葉が「状況」として使われています。指定した状況での値を取る、というわけです。
まとめ
簡単にMayaで登場する「コンテキスト」という名前について見てきました。まとめると次のような場所に出てきます。
名称 | 場所 | 意味 |
---|---|---|
コンテキストメニュー | 右クリックメニュー | 選択やエディタに応じて内容が変わるメニュー |
コンテキストツール | メニューやMELでアクセスするツール | マウスの入力で何かインタラクティブな編集をするツール |
MDGContext | API | 時間の指定 |
同じ「コンテキスト」という言葉でも、登場場所も意味も全然違います。APIやMELでツールを作り始めると、このあたりを混同してわけがわからなくなってしまいがちです。同じ言葉でも違うことを指しているということが判れば、色々なことが腑に落ちるようになるのではないでしょうか。
なかなか普段話題に上がらない「コンテキスト」ですが、理解や使い勝手に効いてきますので取り上げてみました。
コラムに難しいことが書いてあると読み飛ばすというご意見が多い中、せめてもと画像を増やしてみましたが、ほとんどヘルプのキャプチャでした!次もこの感じで行きたいと思います!