<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>TG BLOG</title>
<link>http://tres-graficos.jp/blog/index.php</link>
<pubDate>Wed, 19 Aug 2009 16:42:19 </pubDate>
<description>
TG BLOG - RSS 2.0 (Really Simple Syndication).
</description>
<item>
<title>Scripting 000 - 'Hello World!'</title>
<link>http://tres-graficos.jp/blog/article.php?id=564</link>
<pubDate>Wed, 19 Aug 2009 16:42:19 +0900</pubDate>
<description>Cheetah3D のスクリプティングについての第一回


はじめに
スクリプトを使って出来る事 ( Cheetah3D 4.6.x )

オブジェクトの追加・移動・パラメータの変更等の処理を自動化
独自のパラメータを持つカスタムツールの作...</description>
<content:encoded>
<![CDATA[<p>Cheetah3D のスクリプティングについての第一回</p>
<hr />
<!-- more -->
<h3>はじめに</h3>
<p>スクリプトを使って出来る事 ( Cheetah3D 4.6.x )</p>
<ul>
<li>オブジェクトの追加・移動・パラメータの変更等の処理を自動化</li>
<li>独自のパラメータを持つカスタムツールの作成</li>
<li>独自のパラメータを持つポリゴンオブジェクト・スプラインオブジェクトの作成</li>
<li>独自のパラメータを持つタグの作成</li>
<li>フォーマットが分かっている場合の他のファイル形式の読み書き</li>
<li>システムコールを使用した外部プログラムの起動</li>
</ul>
<p>スクリプトでは出来ない事、または仕様</p>
<ul>
<li>カスタムなマテリアル・シェーダーの作成</li>
<li>ポリゴンオブジェクトへのマテリアルの適用</li>
<li>アニメーションキーの登録・削除などの操作</li>
<li>パス・ファイル名に日本語等マルチバイトを含むファイルの操作</li>
</ul>
<h3>スクリプトのインストール（作成）場所</h3>
<p>スクリプトのインストール場所は２カ所。Cheetah3D.app アプリと同じ階層の scripts フォルダ と、/Users/(ユーザー名)/Library/Application Support/Cheetah3D/scripts フォルダです。</p>
<p>ダウンロードしたスクリプトや自作のスクリプトを置く場合は、アップデートの管理が楽になるので後者の場所に置く方が良いでしょう。前者と後者のスクリプトはメニュー上で、セパレータで区切られて表示されます。</p>
<h3>スクリプトの言語</h3>
<p>JavaScript 1.7 相当のはず  8-)  構文等は、他の WEB リファレンスを参照して下さい。</p>
<p>Date, Math, Array などのクラスオブジェクトが使用できます。 Object 型は、Cheetah3D 内のオブジェクトを表現する為に使われてしまっているので、残念ながら本来の Object 型としては使う事が出来ません。 :-!  必要な場合、僕は Function オブジェクトで代用してます。</p>
<p>また、それぞれベクトルを表現する為のクラス Vec2D / Vec3D / Vec4D や、行列変換のための Mat3D / Mat4D クラス、ポリゴンオブジェクトのポリゴンを操作するための Polycore クラス、スプラインオブジェクトのスプラインを操作するための Splinecore クラス等が定義されています。<br />
それぞれのクラスに定義済みの関数については、ヘルプファイルのスクリプティングの項を参照して下さい。</p>
<h3>スクリプトの種類</h3>
<p>Cheetah3D で使えるスクリプトの種類は全部で５種類。スクリプトファイルを作成（インストール）する場所によって、自動的に判別されます。<br />
必ず呼ばれる関数（こういうのなんか呼び方がありますよね？ :-P ）は、スクリプト内で必ず定義する必要があります。</p>
<table>
<thead>
<tr>
  <th>種類</th>
  <th>メニュー名</th>
  <th>作成（インストール）場所</th>
  <th>必ず呼ばれる関数</th>
</tr>
</thead>
<tbody>
<tr>
  <td>マクロ</td>
  <td>マクロ スクリプト</td>
  <td>scripts/Macro</td>
  <td>main()</td>
</tr>
<tr>
  <td>ツール</td>
  <td>ツール スクリプト</td>
  <td>scripts/Tool</td>
  <td>buildUI()</td>
</tr>
<tr>
  <td>ポリゴン</td>
  <td>ポリゴン スクリプト</td>
  <td>scripts/Polygonobj</td>
  <td>buildUI() / buildObject()</td>
</tr>
<tr>
  <td>スプライン</td>
  <td>スプライン スクリプト</td>
  <td>scripts/Splineobj</td>
  <td>buildUI() / buildObject()</td>
</tr>
<tr>
  <td>タグ</td>
  <td>タグ スクリプト</td>
  <td>scripts/Tag</td>
  <td>buildUI()</td>
</tr>
</tbody>
</table>
<h4>デバッグの方法</h4>
<p>基本レイアウトには入っていませんが、デバッグ用に "コンソール" ビューが用意されています。スクリプト内の print() 関数の出力は、"コンソール" ビューに出力されます。スクリプト作成用に "コンソール" を表示させたレイアウトを、カスタムレイアウトとして登録しておくといいでしょう。</p>
<p>
<img src="http://tres-graficos.jp/blog/resources/ch_20090818_tut_ss01.jpg" width="300" height="180" alt="ch_20090818_tut_ss01.jpg" />
</p>
<p>また、システムコールを使った方法として、</p>
<pre>
<code>OS.system("echo "+デバッグ値);
</code>
</pre>
<p>というのも出来ます。この場合、コンソール.app で出力を確認して下さい。</p>
<h3>とりあえずベタに Hello World</h3>
<p>まずエディターで、スクリプトファイルを作成します。下のコードをコピペして、保存して下さい。<br />
今回はマクロスクリプトなので、scripts/Macro フォルダに保存します。この時、必ず拡張子を .js にする事を忘れずに。Cheetah3D は、拡張子 .js を持つファイルのみをスクリプトとして認識します。</p>
<pre>
<code>function main( doc ) {
    print( "Hello World");
}
</code>
</pre>
<p>スクリプトメニューを更新する為に Cheetah3D で新しい書類を開き、"コンソール" が表示されていない場合は、表示しておきます（コンソールにしたいビューのタイトルバーを右クリックし、コンテキストメニューから "コンソール" を選択します）。
メニューバーから ツール -> スクリプト -> マクロ スクリプト -> 先ほど保存したスクリプト を選択し、スクリプトを実行します。</p>
<p>"コンソール" ビューに "Hello World" と表示されたでしょうか？ まぁこれでは味気ないので、もう少し編集していきましょう。コードを下記のように変えてみましょう。</p>
<pre>
<code>function main( doc ) {
    var t = doc.addObject(TEXT);
    t.setParameter("name", "Hello World");
    t.setParameter("text", "Hello World");
}
</code>
</pre>
<p>実行すると、シーンに Hello World という名前で Hello World というテキストのテキストスプラインが表示されたと思います。</p>
<p>
<img src="http://tres-graficos.jp/blog/resources/ch_20090818_tut_ss02.jpg" width="640" height="360" alt="ch_20090818_tut_ss02.jpg" />
</p>
<p>では、コードを</p>
<pre>
<code>1: function main( doc ) {
</code>
</pre>
<p>マクロスクリプトは、Cheetah3D スクリプトのドキュメントオブジェクトの参照を引数に main() 関数を呼び出します。この時の引数 doc は任意の名前でかまいません。</p>
<pre>
<code>2:    var t = doc.addObject(TEXT);
</code>
</pre>
<p>ドキュメントオブジェクトの関数 addObject を使って、シーンにテキストスプラインを追加しています。この時の引数は、追加したいオブジェクトによって変わります。詳しくはマニュアルのスクリプティング -> Constants を参照して下さい。この引数の実態はオブジェクトの整数型パラメータ type なので、Constants のリストにない場合は、自分で調べて直接整数で呼び出してもかまいません。</p>
<pre>
<code>3:    t.setParameter("name", "Hello World");
4:    t.setParameter("text", "Hello World");
</code>
</pre>
<p>オブジェクトの関数 setParameter を使って、オブジェクトのパラメータをスクリプトから操作しています。このオブジェクトのパラメータ名やその型はドキュメント化されていませんので、自分で調べる事になります。添付のマクロスクリプト Parameter Info.js を使用して下さい。</p>
<h3>最後に</h3>
<p>今回は簡単にマクロスクリプトで、シーンにオブジェクトを追加してパラメータを変更してみました。<br />
次回は（もしあれば :-yum ）、ポリゴンスクリプトをやってみたいと思います。最後に Parameter Info.js を拡張し、実行時に選択されたオブジェクトのタグや適用されているマテリアルのパラメータを調べるマクロスクリプト Object Info.js のコードをのせておきます。</p>
<pre>
<code>function main(doc) {
    var obj = doc.selectedObject();
    print('---- Object Info ---');
    if ( obj ) {
        print('-- object type:'+obj.type());
        var info = obj.parameterInfo();
        for (var j=0;j&lt;info.length;j++) {
            print(info[j][0] +" [" + info[j][1] + "]:"+obj.getParameter(info[j][0]));
        }
        var tcount = obj.tagCount();
        for (var i = 0;i &lt; tcount;++i) {
            var tag = obj.tagAtIndex(i);
            info = tag.parameterInfo();
            print('-- tag '+i+' type:'+tag.type());
            for (var j=0;j&lt;info.length;j++){
                print(info[j][0] + " [" + info[j][1] + "]:"+tag.getParameter(info[j][0]));
            }
            if (tag.type() == 102) { // material tag.
                var material = doc.materialAtIndex(tag.linkedToMaterial());
                print('-- linked Material --');
                info = material.parameterInfo();
                for (var j=0;j&lt;info.length;j++){
                    print(info[j][0] + " [" + info[j][1] + "]:"+material.getParameter(info[j][0]));
                }
            }
        }
    }
}
</code>
</pre>
]]>
</content:encoded>
</item>
</channel>
</rss>