チュートリアル / 押忍!Softimage マニアクス
第2回:Softimage で始めよう Python Script vol.1
- ゲーム
- コラム
- スクリプト・API
- チュートリアル
- 上級者
- 中級者
はじめに
押忍!みなさんこんばんは。今月の担当者、TA麓です。
Scriptの勉強を始めてみたいけど何処からやったらいいかわからない。
Pythonを勉強したいけど何処から始めたらいいのかわからない。
そういった“これから始める”人のためにSoftimageを利用してPython Scriptを1から覚えるためのドキュメントを書き綴っていこうと思います。
もっとSoftimageを便利にカスタマイズできるようになりたいと思っているデザイナーがついでにPythonも使えるようになっちゃおうというのを目的としたドキュメントを目指します。
1.ScriptEditorを眺める
とりあえず普段の作業をScriptEditorを開いた状態で進めてみましょう。
ScriptEditorは Softimage の画面中央の下部にあるこのアイコンをクリックして起動します。
すると、このようなWindowが起動します。
Windowの真ん中上部でScriptの言語が切り替えられますので「Python」に設定しておいて下さい。
画面上部の白いエリアが「編集エリア」で下部が「ヒストリペイン」と言われます。
Scriptのログは「ヒストリペイン」に表示されます。
それでは実際に作業をしながら見て行きましょう。
例えば、Softimage のお得意ポリゴンオブジェクトのトーラスを取得してみましょう。
ヒストリペインに以下の文字が表示されます。
Application.CreatePrim("Torus", "MeshSurface", "", "")
この文字はコマンド(Application.CreatePrim)と引数("Torus", "MeshSurface", "", "")で構成されています。例えばこのコマンドは"Torus"という”MeshSurface”をシーンに取得するという意味のスクリプトです。
この一行をコピーして編集エリアへペーストし、スクリプト実行ボタンか、ScriptEditor 上にカーソルがある状態で「F5」を数回押して下さい。
シーンに押した回数分だけトーラスが現れます。この一連の動作が、スクリプトを書いて実行するということです。
ただ、コレでは無駄にトーラスをシーンに生み出し履歴を追っているだけで芸がありません。
ココからが本格的にScriptを書いていくというのを実践するための基本的な知識になります。
2.変数
スクリプトを書くときは殆どにおいて、
1.変数に入れる
2.変数を処理する
という流れをイメージします。
a = 'Hello Softimage'
Application.Logmessage(a)
上の例は1行目が変数に入れる。で、二行目が変数を処理するという例文です。
変数は「=」(イコール)の左側に書き、「=」(イコール)の右側は変数に入れるモノ(何か)です。
イメージで言うとこんな感じです。
a ← 'Hello Softimage'
プログラムは大体において上から下へ↓、1行ずつ処理されていきます。
この例も「a」という名前の変数に'Hello Softimage'という文字を入れて、1行下がって変数の中身ををログに表示させるという処理を行っています。
行数を把握するために ScriptEditor の設定で行数の表示はONにしておきましょう。
例では単純な「a」という変数名にしていますが、コレはScriptを書く人が自由に決められます。
変数とは概念だけで言うと箱です。
中には何でも入れることができます。
Softimage ではかなりの確率で、オブジェクトを入れて使う事が多いです。
「選択したオブジェクトに対して何か処理をかけたい」といった欲求を満たすためには変数は切り離せません。
それでは実際に箱にモノを入れる作業をしてみましょう。
3.型
変数に入れるモノの種類には幾つかあり、最初のうちに主に使うのは、「数値」「文字列」「オブジェクト」の三種類です。
こういった種類をプログラム用語で「データ型」または「型」と言います。特にPythonは変数の型の取り扱いにうるさいので注意が必要です。
※Softimage としての型の分類は更に細かいですが、それはまた別の機会に
●数値
計算式の結果等、数字を入れます。
スケール、回転、位置の情報や、タイムラインのフレームの情報等など、そういったものの型です。
num = 180 / 2 # 180÷2
Application.Logmessage(num)
●文字列
文字という情報のみを持った型です。
Pythonではダブルクォーテーション””かシングルクォーテーションで’’囲われると文字列として扱われます。
moji = ‘ABC is a song of the SHONENTAI...’
Application.Logmessage(moji)
●オブジェクト
Softimage の構造・・・といっても難しいのでシーンに存在するモノ/データと捉えた方がいいかも知れません。通称皆さんが使うオブジェクトとはポリゴンメッシュのことだと思いますが、Scriptの世界では Softimage に存在するあらゆるデータをオブジェクトと言います。(この概念を極めると Softimage の中の構造が6~7割見えるようになります)
object = Application.GetValue("Model.torus")
Application.Logmessage(object.parent)
上記の例の場合だとModel.torusがシーンの中に存在していることが前提です。
"Model.torus"のままだとただの文字列でしかありませんが、ここで Softimage の便利コマンドGetValueを使用します。一番良く使うので何も言わなくてもとりあえずGetValueが出てくるようになると良いですね。
コレを介して変数に入れると、シーン内に存在さえしていればオブジェクト型として格納されます。
上記でも触れた選択オブジェクトを変数に入れる。というコマンドは、
objects = Application.GetValue("SelectionList")
です。
そしてオブジェクトにさえ変換されれば、メソッドやプロパティといった便利オプションが使えるので、上記「object.parent」と、ツリー上の一つ親のオブジェクトを取得する。という事ができるようになります。
4.実践
それではより実践的なScript構築へと進みましょう。
例えばグリッドを作成して、テクスチャプロジェクションをXZ平面でセットしてフリーズモデリングをしてみて下さい。
Application.CreatePrim("Grid", "MeshSurface", "", "")
Application.CreateProjection("grid", "siTxtPlanarXZ", "siTxtDefaultPlanarXZ", "", "Texture_Projection", "", "", "")
Application.FreezeModeling("", "", "")
ヒストリペインにこのように表示されると思います。
試しにコレを編集エリアにペーストして2~3回実行してみてください。
Softimage はシーン内の同一モデル階層に同じ名前のオブジェクトが存在できないので、Gridを作成するたびに”grid1” ”grid2”と末尾に数値が追加され、それなのに二行目で”grid”に対してテクスチャプロジェクションを適用しているので一個目のGridのみにテクスチャサポートが増加していきます。
ただ、FreezeModelingに関しては引数でオブジェクトを指定しない限り、選択オブジェクトに対して適用するので、テクスチャプロジェクションが貼られていないのに追加された”grid1” ”grid2”に対して実行されています。
Oh….orz
さてコレをちゃんと作成されたGridに対しての処理をして行きたいのですが、一旦変数を使わなかった場合を想像してみて下さい。
例えば4このグリッドを生成したい場合・・・
Application.CreatePrim("Grid", "MeshSurface", "", "")
Application.CreateProjection("grid", "siTxtPlanarXZ", "siTxtDefaultPlanarXZ", "", "Texture_Projection", "", "", "")
Application.FreezeModeling("", "", "")
Application.CreatePrim("Grid", "MeshSurface", "", "")
Application.CreateProjection("grid1", "siTxtPlanarXZ", "siTxtDefaultPlanarXZ", "", "Texture_Projection", "", "", "")
Application.FreezeModeling("", "", "")
Application.CreatePrim("Grid", "MeshSurface", "", "")
Application.CreateProjection("grid2", "siTxtPlanarXZ", "siTxtDefaultPlanarXZ", "", "Texture_Projection", "", "", "")
Application.FreezeModeling("", "", "")
Application.CreatePrim("Grid", "MeshSurface", "", "")
Application.CreateProjection("grid3", "siTxtPlanarXZ", "siTxtDefaultPlanarXZ", "", "Texture_Projection", "", "", "")
Application.FreezeModeling("", "", "")
こうなります。
コレでは作成したい分だけ行数を増やして行かなければならなく、見栄えも良くないですし、処理速度にもやさしくありません。
そこで、変数を使って何個Gridを作っても良いようにScriptをスッキリさせましょう。
oGrid = Application.CreatePrim("Grid", "MeshSurface", "", "")
Application.CreateProjection(oGrid, "siTxtPlanarXZ", "siTxtDefaultPlanarXZ", "", "Texture_Projection", "", "", "")
Application.FreezeModeling(oGrid, "", "")
ココでは仮にoGridという変数名を使って変数を作ります。
頭にo(小文字のO)を使っているのは「この変数はオブジェクトですよ」と後で使うときに判りやすくするためです。文字列だとsGrid数値だとnGridと書くと良いと思います。
変数名は前述したように、Script作成者が自由に決められます。例えば引越しの時に本を詰めたダンボールには「本」、服を詰めたダンボールには「衣類」と書いた事はありませんか?さらに Softimage での話まで戻って、人体のスケルトン構造を作った時、腕の骨には「arm」手の骨には「hand」と言った名前をつけませんか?
変数名にも同じ事が言えます。どんな型でどんなデータが入っているのかを名前で認識できるにはどうしたら良いか?他の人が書いたスクリプトを眺めながら考えて付けることをおすすめします。
二行目でoGridに対してテクスチャプロジェクションを作成し、三行目でoGirdをフリーズモデリングする。と、引数に変数を渡すことでその変数に入っているオブジェクトに対して処理をかける、という動作になります。
これでこの三行だけで、何回実行してもちゃんと新規に作られたオブジェクトに対してプロジェクションを作成して、フリーズモデリングを実行出来ます。
引数の内容はに関しては Softimage のSDKドキュメントでそれぞれ検索をかけると解説されています。
2013 SDK Programmer’s Guide (日本語)
Scriptを書く際はできるだけコマンドをドキュメントで検索して、説明を読みながら組み上げていく用に癖をつけておくと良いでしょう。
5.問題
それではここまでにやったことを元に、ピックした位置にテクスチャプロジェクションが適用されたGridを作成すると言うスクリプトを作ってみましょう。
△トーラス・メッシュさん
●ヒント
ピックしたポジションを取得するコマンドはPickPositionです。
(SDKドキュメントで探してみて下さい。)
Pythonは引数を使って値を取得することができません。
答えは次のページで紹介します。
- 1
- 2