Cheetah3D Tutorials
- Renderings - レンダリング (2)
- Rendering 1 2 3 ! | Rendering + |
- Lighting - ライティング (2)
- light lights light ! | fake Object light samples. |
- Tools - ツール (3)
- Tool Tour - day 1. | Tool Tour - day 2. | Tool Tour - day 3. |
- Creator, Modifier - クリエイター/モディフィアー (3)
- Creators or Modifiers, 1st floor | Creators or Modifiers, 2nd floor, Creators | Creators or Modifiers, 3rd floor, Modifiers |
- Animation - アニメーション (0)
- Material System - マテリアル (1)
- Material System 01 - materials list |
- Making Movies - サンプルムービー (3)
- Making Movie - another Axe | Making Movie - pot with Spline | Making Movie - Something like Screw |
- Scripting - スクリプティング (3)
- Scripting 000 - 'Hello World!' | Scripting 001 - 'Random Array' | Scripting 001b - 'Duplicate Face' - 番外 |
- Samples - サンプル (3)
- Reflection Angle sample - reflection blur | Texture Map sample | fake Object light samples. |
- Others - その他 (2)
- Cheetah3D Tips - 200611 | Cheetah3D Tips - 200712 |
total:21
Cheetah3D のスクリプティングについての第二回
はじめに
今回は、ポリゴンスクリプトを使って、子オブジェクトをコピーするクリエータオブジェクトを作成してみます。
ポリゴンスクリプトで、必ず定義しなければならない関数は2つ
まずエディタで新規ファイルを作成し、以下のコードをコピペして下さい。以下のコードでは、とりあえず空の関数を定義しています。
2つの関数とも、引数として自身のオブジェクトの参照が渡されます。buildUI 関数では、パラメータの追加や初期化を行い、 buildObject 関数内で、実際の描画コードを記述していきます。buildUI 関数は、スクリプトメニューから選択されてシーンに呼び出されたときに1度、buildObject 関数は、自身のパラメータが変更されるタイミング意外にも、親オブジェクトの更新といったシーングラフの更新時にも毎回呼ばれます。
buildUI を定義
まず、buildUI 関数内では、自身のプロパティを定義します。
ここでは 'count' という名前の整数のパラメータを追加しています。addParameterInt 関数の場合、引数は順に、パラメータ名・初期値・最小値・最大値・アニメーション可/不可フラグ・ビルドフラグ(このパラメータが変更された場合 buildObject を呼び出してシーングラフを更新するかどうか)になります。
ここで、一度ファイルを保存しシーンに呼び出してみます。ポリゴンスクリプトの場合、~/ライブラリ/Application Support/Cheetah3D/scripts/Polygonobj フォルダに保存します。この時、拡張子は js にして下さい。一度スクリプトメニューから、シーンに呼び出してみましょう。 buildObject 関数内には、まだ何も書いてないので 3D ビューには何も描画はされませんが、オブジェクトリストビューには、スクリプトオブジェクトが登場していると思います。'count' パラメータが、ポリゴンスクリプトのプロパティパネルに表示されていることを確認して下さい。
その他、プロパティにパラメータを追加する関数は以下のようなものがあります。これらの関数は、プロパティを定義できる他のタイプのスクリプト(スプライン/ツール)でも共通です。
論理値を追加します。
ボタンを追加します。第3引数で指定した関数が、自身のオブジェクトの参照を引数として呼ばれます。
浮動小数点数を追加します。
整数を追加します。
プロパティパネルにタイトル付きのセパレータを追加します。
選択リストを追加します。第2引数には、選択リストのラベル文字列の配列を設定します。戻り値は、String 型のインデックスです。(この関数はヘルプファイルに記載されていません。)
簡単な buildObject
それでは、実際の描画コードを書いていきましょう。ポリゴンオブジェクトをスクリプトから操作するには、まずポリゴンオブジェクトから PolyCore オブジェクトを取り出し、その PolyCore オブジェクトに対して描画関数を実行していきます。
3角形を描くコードは下記のようになります。
ここスクリプトメニューから、シーンに追加してみましょう。3角形が表示されていると思います。
ポリコア PolyCore オブジェクトにポリゴンを追加する関数には2種類あります。
追加済み頂点(ポイント)のインデックス番号を使用して、ポリゴンを生成します。戻り値は生成したポリゴンのインデックス番号。頂点の追加には addVetex 関数を使用します。
戻り値は生成したポリゴンのインデックス番号。第2引数の meshed を true にした場合、既存の頂点データを捜査してすでに同じ位置に頂点が追加されている場合には、それを使用してポリゴンを生成します。
また addIndexPolygon で使用する頂点(ポイント)のみを追加する関数は addVertex を使用します。
戻り値は、頂点のインデックス番号です。第1引数の meshed を true にした場合、既存の頂点データを捜査して既に同じ位置に頂点が追加されている場合には、頂点を追加せず、既存の頂点のインデックス番号を返します。
buildVertexBSP を使って頂点捜査を高速化
addPolygon や addVertex で既存の頂点を捜査して頂点を追加する場合、頂点数が多くなった場合に捜査に時間がかかり動作が遅くなります。 buildVertexBSP 関数を使って、オブジェクト内の頂点データの BSP ツリーを生成すると、頂点の捜査が速くなります。
今回は、子オブジェクトのデータをそのままコピーするので、頂点追加時に既存の頂点(ポイント)を捜査する必要はありません。なので、BSP ツリーは使いません。
子オブジェクトからポリゴンを生成
次に子オブジェクトの情報からポリゴンを生成してみます。
ここまでを、再度シーンに呼び出してみます。子オブジェクトを追加して、子オブジェクトのモードタグで不可視に設定します。そのままでは、オブジェクトの更新がかからず何も描画されていないと思うので、'count' 等のパラメータを変更して、強制的にオブジェクトをアップデートしてみて下さい。子オブジェクトと同じ形状が表示されました?
いちいち描画更新のために、パラメータをいじるのが面倒なので、このオブジェクトをクリエータオブジェクトに設定しておきます。
これで、子オブジェクトは自動的に非表示になり、子オブジェクトの変更で自身がアップデートされるクリエータオブジェクトとして振る舞うよう設定されました。
パラメータを使って
ここまでだと、単に子オブジェクトをコピーするだけなので、全くスクリプトを使う意味がありませんよね。
次に、追加しておいた 'count' パラメータを使って、 count 分だけランダムにコピーするように変更してみます。
これで、'count' で設定した数だけランダムな位置にコピーするスクリプトオブジェクトが出来ました。
これにさらに調整できるパラメータを追加したものを Ramdom Array.js として公開していますので、興味のある方は是非チェックしてみて下さい。(古いコードなので、ちょっとあれですけど… )
ちょっと長過ぎたかも。
読んでいただいた皆様ありがとうございます。