<?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://www.tres-graficos.jp/blog/index.php</link>
<pubDate>Fri, 12 Feb 2010 07:25:16 </pubDate>
<description>
TG BLOG - RSS 2.0 (Really Simple Syndication).
</description>
<item>
<title>Cheetah3D で Path Array.js を使ってみる。</title>
<link>http://www.tres-graficos.jp/blog/article.php?id=583</link>
<pubDate>Fri, 12 Feb 2010 07:25:16 +0900</pubDate>
<description>ちょっとしたスクリーンキャストをやってみた。 Cheetah3D と Path Array.js スクリプトの使い方を紹介してます。
ぐだぐだだった前置きを、バッサリと切った関係でいきなり声が出ます。ビビらないでね。 :-P







...</description>
<content:encoded>
<![CDATA[<p>ちょっとしたスクリーンキャストをやってみた。 Cheetah3D と Path Array.js スクリプトの使い方を紹介してます。</p>
<p>ぐだぐだだった前置きを、バッサリと切った関係でいきなり声が出ます。ビビらないでね。 :-P</p>
<p>
<object width="640" height="360">
<param name="allowfullscreen" value="true" />
<param name="allowscriptaccess" value="always" />
<param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9367475&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" />
<embed src="http://vimeo.com/moogaloop.swf?clip_id=9367475&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="360">
</embed>
</object>
</p>
<p>
<a href="http://vimeo.com/9367475">Cheetah3D で Path Array.js を使ってみる。</a> from <a href="http://vimeo.com/tgjp">tg_jp</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<hr />
<p>背景を合成したもの。</p>
<p>
<img src="http://www.tres-graficos.jp/blog/resources/ch_20100211_pathArray.png" width="640" height="360" alt="ch_20100211_pathArray.png" />
</p>
<p class="spec">Modeling & Rendering: Cheetah3D 5.3b2</p>
]]>
</content:encoded>
</item><item>
<title>iPad</title>
<link>http://www.tres-graficos.jp/blog/article.php?id=582</link>
<pubDate>Mon, 08 Feb 2010 08:05:59 +0900</pubDate>
<description>iPad をモデリングしてみた。






Modeling &amp; Rendering: Cheetah3D 5.2
アップルのページの画像をブループリント用に加工して使用。背面の曲面は全く自身無し。 :-!



ボタンとか細部は、ネット...</description>
<content:encoded>
<![CDATA[<p>iPad をモデリングしてみた。</p>
<p>
<img src="http://www.tres-graficos.jp/blog/resources/ch_20100207_ipad01.jpg" width="720" height="405" alt="ch_20100207_ipad01.jpg" />
</p>
<p>
<img src="http://www.tres-graficos.jp/blog/resources/ch_20100207_ipad02.jpg" width="720" height="405" alt="ch_20100207_ipad02.jpg" />
</p>
<p class="spec">Modeling & Rendering: Cheetah3D 5.2</p>
<p>アップルのページの画像をブループリント用に加工して使用。背面の曲面は全く自身無し。 :-!</p>
<p>
<img src="http://www.tres-graficos.jp/blog/resources/ch_20100207_ipad_ss.jpg" width="720" height="405" alt="ch_20100207_ipad_ss.jpg" />
</p>
<p>ボタンとか細部は、ネットに上がった写真をみながらなんですが、適当に。なのでアップは無理です。</p>
<!-- more -->
<p>おまけで、ちょっとした合成。ただ 3DCG で作る意味は全くなかったよなぁと後で気付いた、 :-P</p>
<p>
<img src="http://www.tres-graficos.jp/blog/resources/ch_20100207_ipad03.jpg" width="720" height="405" alt="ch_20100207_ipad03.jpg" />
</p>
]]>
</content:encoded>
</item><item>
<title>Path Array.js DEMO</title>
<link>http://www.tres-graficos.jp/blog/article.php?id=581</link>
<pubDate>Sun, 31 Jan 2010 06:10:20 +0900</pubDate>
<description>Cheetah3D 5.3 64bit 版のテストが始まっていて、これがかなりいい感じです。

ちょっと前に上げたスクリプトで動画を作ってみた。5.3 b1 でレンダリングしてみたんですが、やっぱり DOF 使うとかなり時間がかかるなぁ :...</description>
<content:encoded>
<![CDATA[<p>Cheetah3D 5.3 64bit 版のテストが始まっていて、これがかなりいい感じです。</p>
<hr />
<p>ちょっと前に上げたスクリプトで動画を作ってみた。5.3 b1 でレンダリングしてみたんですが、やっぱり DOF 使うとかなり時間がかかるなぁ :-!<br />
出来がイマイチで、短くてもちゃんとコンテから作った方が絶対いいものが出来るなぁと改めて思った訳です。</p>
<p>
<object width="560" height="340">
<param name="movie" value="http://www.youtube.com/v/PwbkxBXRaes&hl=ja_JP&fs=1&">
</param>
<param name="allowFullScreen" value="true">
</param>
<param name="allowscriptaccess" value="always">
</param>
<embed src="http://www.youtube.com/v/PwbkxBXRaes&hl=ja_JP&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340">
</embed>
</object>
</p>
<p>スクリプトはスプラインにポリゴンを複製するものです。結構いろいろ使えると思うので、また使ってみてください。 :-yum</p>
]]>
</content:encoded>
</item><item>
<title>Cheetah3D 5.2 Released!!</title>
<link>http://www.tres-graficos.jp/blog/article.php?id=580</link>
<pubDate>Thu, 21 Jan 2010 11:52:03 +0900</pubDate>
<description>出ました   :-)
簡単なリリースノートの訳は forum にポスト。
個人的にうれしい点

10.6 での動画保存バグがなおった。その他、画像フォーマットがプルダウンで選択可能になり、画像保存パネルで JPG の画質も設定可能に。（動画...</description>
<content:encoded>
<![CDATA[<p>出ました   :-)</p>
<p>簡単なリリースノートの訳は <a href="http://www.cheetah3d.de/forum/showthread.php?t=5222">forum</a> にポスト。</p>
<h4>個人的にうれしい点</h4>
<ul>
<li>10.6 での動画保存バグがなおった。その他、画像フォーマットがプルダウンで選択可能になり、画像保存パネルで JPG の画質も設定可能に。（動画フォーマットの設定パネルは無くなった？）</li>
<li>スクリプトがより高速な WebKit ベースのものに差し替えになり、速度があがった。</li>
</ul>
<h4>残念な点</h4>
<ul>
<li>10.4 Tiger のサポートが終了。動かすには 10.5 以上が必要。</li>
<li>スクリプトの不備がいろいろ、動かなくなった自作スクリプトがいろいろ  :-! </li>
<li>スクリプトのマテリアルアクセス API はまだ未実装。</li>
</ul>
<hr />
<p>その他細かい所も、いろいろ良くなってます。いよいよ次回アップデートは 64 ビット版になる模様。楽しみです。</p>
]]>
</content:encoded>
</item><item>
<title>Binary Waves</title>
<link>http://www.tres-graficos.jp/blog/article.php?id=579</link>
<pubDate>Thu, 21 Jan 2010 11:40:07 +0900</pubDate>
<description>本家 forum の方に出ていた質問で、「0/1のオブジェクトを波上にランダムにコピーするのはどうする？」ってのが上がっていて、以前作った Polygon Array.js をちょこっと改変すれば出来るなぁーという事で、やってみた。
Pol...</description>
<content:encoded>
<![CDATA[<p>本家 <a href="http://www.cheetah3d.de/forum/showthread.php?t=5216">forum</a> の方に出ていた質問で、「0/1のオブジェクトを波上にランダムにコピーするのはどうする？」ってのが上がっていて、以前作った Polygon Array.js をちょこっと改変すれば出来るなぁーという事で、やってみた。</p>
<p>Polygon Array.js はもともと、第２子オブジェクトの各ポリゴンに、その法線方向に沿うように回転させて第１子オブジェクトをコピーするものだったんですが、これを第２子オブジェクトがフォルダだった場合には、そのフォルダの内容をランダム or ポリゴン選択セットのインデックスに対応させる形でコピーするように変更。</p>
<p>実験的にアニメーションを。</p>
<p>
<object width="640" height="385">
<param name="movie" value="http://www.youtube.com/v/U-pReJnu8jY&hl=ja_JP&fs=1&hd=1">
</param>
<param name="allowFullScreen" value="true">
</param>
<param name="allowscriptaccess" value="always">
</param>
<embed src="http://www.youtube.com/v/U-pReJnu8jY&hl=ja_JP&fs=1&hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385">
</embed>
</object>
</p>
<p>スクリプトで大量のポリゴンを生成するのは大変時間がかかるので、すべてのコピーをスクリプトで生成せず、配列複製モディファイア等ビルトインのモディファイアでごまかすのが効率的。動画でも、X/Z軸方向の２個のモディファイアで 25 倍にしてます。</p>
<p>スクリプトの方もアップデート  :-yum  <a href="http://www.tres-graficos.jp/blog/files/article.php?id=28">http://www.tres-graficos.jp/blog/files/article.php?id=28</a>
</p>
<p>
<img src="http://www.tres-graficos.jp/blog/resources/ch_20100120_binWave.jpg" width="720" height="480" alt="ch_20100120_binWave.jpg" />
</p>
<p class="spec">Modeling & Rendering: Cheetah3D 5.1</p>
]]>
</content:encoded>
</item><item>
<title>Tiger and Flowers</title>
<link>http://www.tres-graficos.jp/blog/article.php?id=578</link>
<pubDate>Wed, 20 Jan 2010 00:00:32 +0900</pubDate>
<description>あけましておめでとうございます。 :-)  遅くなりましたが…  :-P

Cheetah3D 5.0 になってから Collada 形式の書き出しに対応し、Snow Leopard 10.6 から プレビュー.app で Collada ...</description>
<content:encoded>
<![CDATA[<p>あけましておめでとうございます。 :-)  遅くなりましたが…  :-P</p>
<hr />
<p>Cheetah3D 5.0 になってから Collada 形式の書き出しに対応し、Snow Leopard 10.6 から プレビュー.app で Collada 形式のファイルを閲覧できるようになったので、ちょっとテスト。書き出したファイルを表示させてみた。</p>
<p>
<img src="http://www.tres-graficos.jp/blog/resources/sl_20100119_tiger.jpg" width="640" height="600" alt="sl_20100119_tiger.jpg" />
</p>
<p>ライトは point light として書き出される見たいで、きちんと光源として反映されてますね。流石に影は計算されないので、表現するにはテクスチャに焼き付けるなりしてあらかじめ作成しておく必要がありますが、シーンの回転・拡大縮小も出来るし、モデルのビューアとしてはなかなかお手軽。<br />
シーンに複数のカメラを設置しておくと、サイドバーにそのサムネが表示され、クリックで各カメラからのビューにアニメーションしながら移動します。<br />
10.6 同士だと、特にソフトを持っていなくても 3D モデルの確認が簡単に出来るようになってますね。</p>
<p>プレビュー.app 側では、Collada アニメーションにも対応しているようですが、残念ながら Cheetah3D の方が Collada ファイルへのアニメーション書き出しに対応してません。 :-!   この辺は forum でも話題にあがってたので、今後に期待ですね。 :-P</p>
]]>
</content:encoded>
</item><item>
<title>Scripting 001 - 'Random Array'</title>
<link>http://www.tres-graficos.jp/blog/article.php?id=565</link>
<pubDate>Fri, 11 Dec 2009 01:27:56 +0900</pubDate>
<description>Cheetah3D のスクリプティングについての第二回


はじめに
今回は、ポリゴンスクリプトを使って、子オブジェクトをコピーするクリエータオブジェクトを作成してみます。
ポリゴンスクリプトで、必ず定義しなければならない関数は２つ

bu...</description>
<content:encoded>
<![CDATA[<p>Cheetah3D のスクリプティングについての第二回</p>
<hr />
<!-- more -->
<h3>はじめに</h3>
<p>今回は、ポリゴンスクリプトを使って、子オブジェクトをコピーするクリエータオブジェクトを作成してみます。</p>
<p>ポリゴンスクリプトで、必ず定義しなければならない関数は２つ</p>
<ul>
<li>buildUI - この関数内でオブジェクトのプロパティを定義します。この関数は、オブジェクトがシーンに追加された時に、呼ばれます。</li>
<li>buildObject - この関数内で 3D ビューでの描画を定義します。オブジェクトの描画アップデートが必要な時に、その都度呼ばれます。</li>
</ul>
<hr />
<p>まずエディタで新規ファイルを作成し、以下のコードをコピペして下さい。以下のコードでは、とりあえず空の関数を定義しています。</p>
<pre>
<code>
<br />function buidUI( obj ) {
}
function buildObject( obj ) {
}
</code>
</pre>
<p>２つの関数とも、引数として自身のオブジェクトの参照が渡されます。buildUI 関数では、パラメータの追加や初期化を行い、 buildObject 関数内で、実際の描画コードを記述していきます。buildUI 関数は、スクリプトメニューから選択されてシーンに呼び出されたときに１度、buildObject 関数は、自身のパラメータが変更されるタイミング意外にも、親オブジェクトの更新といったシーングラフの更新時にも毎回呼ばれます。</p>
<h3>buildUI を定義</h3>
<p>まず、buildUI 関数内では、自身のプロパティを定義します。</p>
<pre>
<code>
<br />function buildUI( obj ) {
    // 初期値 1 最小値 1 最大値 10 の整数型パラメータを追加
    obj.addParameterInt('count',1,1,10,true,true);
}
</code>
</pre>
<p>ここでは 'count' という名前の整数のパラメータを追加しています。addParameterInt 関数の場合、引数は順に、パラメータ名・初期値・最小値・最大値・アニメーション可／不可フラグ・ビルドフラグ（このパラメータが変更された場合 buildObject を呼び出してシーングラフを更新するかどうか）になります。</p>
<p>ここで、一度ファイルを保存しシーンに呼び出してみます。ポリゴンスクリプトの場合、~/ライブラリ/Application Support/Cheetah3D/scripts/Polygonobj フォルダに保存します。この時、拡張子は js にして下さい。一度スクリプトメニューから、シーンに呼び出してみましょう。 buildObject 関数内には、まだ何も書いてないので 3D ビューには何も描画はされませんが、オブジェクトリストビューには、スクリプトオブジェクトが登場していると思います。'count' パラメータが、ポリゴンスクリプトのプロパティパネルに表示されていることを確認して下さい。</p>
<p>
<img src="http://www.tres-graficos.jp/blog/resources/ch_20091210_tut001.jpg" width="494" height="234" alt="ch_20091210_tut001.jpg" />
</p>
<p>その他、プロパティにパラメータを追加する関数は以下のようなものがあります。これらの関数は、プロパティを定義できる他のタイプのスクリプト（スプライン／ツール）でも共通です。</p>
<ul>
<li>void addParameterBool(String paraname, Boolean initvalue, Boolean paramin, Boolean paramax, Boolean animate, Boolean build)<br />
論理値を追加します。</li>
<li>void addParameterButton(String paraname, String buttonname, String functionname)<br />
ボタンを追加します。第３引数で指定した関数が、自身のオブジェクトの参照を引数として呼ばれます。</li>
<li>void addParameterFloat(String paraname, Number initvalue, Number paramin, Number paramax, Boolean animate, Boolean build)<br />
浮動小数点数を追加します。</li>
<li>void addParameterInt(String paraname, Number initvalue, Number paramin, Number paramax, Boolean animate, Boolean build)<br />
整数を追加します。</li>
<li>void addParameterSeparator(String paraname)<br />
プロパティパネルにタイトル付きのセパレータを追加します。</li>
<li>void addParameterSelector(String paraname, Array options)<br />
選択リストを追加します。第２引数には、選択リストのラベル文字列の配列を設定します。戻り値は、String 型のインデックスです。（この関数はヘルプファイルに記載されていません。）</li>
</ul>
<h3>簡単な buildObject</h3>
<p>それでは、実際の描画コードを書いていきましょう。ポリゴンオブジェクトをスクリプトから操作するには、まずポリゴンオブジェクトから PolyCore オブジェクトを取り出し、その PolyCore オブジェクトに対して描画関数を実行していきます。</p>
<p>３角形を描くコードは下記のようになります。</p>
<pre>
<code>
<br />function buildObject ( obj ) {
    // ポリゴンオブジェクトに定義されている core() 関数を使用して、PolyCore オブジェクトを取得
    var core = obj.core()
    // ポリゴンを構成する頂点を配列で定義、とりあえず単純な３角形
    // xyz 座標を指定する Vec3D 型の配列を使用
    var vertices = [ new Vec3D(0, 0, 0), new Vec3D(0, 1, 0), new Vec3D(1, 0, 0) ];
    // 一番シンプルなポリゴン生成関数を使用します
    core.addPolygon( vertices.length, false, vertices );
}
</code>
</pre>
<p>ここスクリプトメニューから、シーンに追加してみましょう。３角形が表示されていると思います。</p>
<p>
<img src="http://www.tres-graficos.jp/blog/resources/ch_20091210_tut002.jpg" width="380" height="411" alt="ch_20091210_tut002.jpg" />
</p>
<p>ポリコア PolyCore オブジェクトにポリゴンを追加する関数には２種類あります。</p>
<ul>
<li>Number addIndexPolygon( Number size )</li>
<li>Number addIndexPolygon( Number size, Number p[] )</li>
<li>Number addIndexPolygon( Number size, Number p[], Vec2D uv[] )<br />
追加済み頂点（ポイント）のインデックス番号を使用して、ポリゴンを生成します。戻り値は生成したポリゴンのインデックス番号。頂点の追加には addVetex 関数を使用します。</li>
<li>Number addPolygon( Number size )</li>
<li>Number addPolygon( Number size, bool meshed, Vec3D p[] )</li>
<li>Number addPolygon( Number size, bool meshed, Vec3D p[], Vec2D uv[] )<br />
戻り値は生成したポリゴンのインデックス番号。第２引数の meshed を true にした場合、既存の頂点データを捜査してすでに同じ位置に頂点が追加されている場合には、それを使用してポリゴンを生成します。</li>
</ul>
<p>また addIndexPolygon で使用する頂点（ポイント）のみを追加する関数は addVertex を使用します。</p>
<ul>
<li>Number addVertex(Boolean meshed, Vec3D vert)<br />
戻り値は、頂点のインデックス番号です。第１引数の meshed を true にした場合、既存の頂点データを捜査して既に同じ位置に頂点が追加されている場合には、頂点を追加せず、既存の頂点のインデックス番号を返します。</li>
</ul>
<h4>buildVertexBSP を使って頂点捜査を高速化</h4>
<p>addPolygon や addVertex で既存の頂点を捜査して頂点を追加する場合、頂点数が多くなった場合に捜査に時間がかかり動作が遅くなります。 buildVertexBSP 関数を使って、オブジェクト内の頂点データの BSP ツリーを生成すると、頂点の捜査が速くなります。</p>
<pre>
<code>
<br />// BSP ツリーの最小値と最大値を設定
// ポリゴンを生成する空間の最小値と最大値を設定して BSP ツリーを生成
// ここで空間（最小値と最大値）を大きく取りすぎると捜査の精度が落ちるので注意
buildVertexBSP( new Vec3D( 0, 0, 0), new Vec3D( 2, 2, 2) );
/*
addVertex や addPolygon で meshed を true にしてポリゴンを生成
*/
// 生成が終わった段階で、必ず BSP ツリーを破棄してメモリを解放すること
destroyVertexBSP();
</code>
</pre>
<p>今回は、子オブジェクトのデータをそのままコピーするので、頂点追加時に既存の頂点（ポイント）を捜査する必要はありません。なので、BSP ツリーは使いません。 :-P</p>
<h3>子オブジェクトからポリゴンを生成</h3>
<p>次に子オブジェクトの情報からポリゴンを生成してみます。</p>
<pre>
<code>
<br />function buildObject( obj ) {
    // 小オブジェクトがない場合、何もしない
    if ( obj.childCount() == 0) return; 
    // 子オブジェクトを取得し、ポリゴンファミリーでない場合、何もしない
    var child = obj.childAtIndex(0);
    if ( child.family() != NGONFAMILY) return; 
    // ここまでエラーチェック
    //
    // for ループ用の変数
    var i,j;
    // 子オブジェクトの PolyCore を取得
    var child_core = child.core();
    // モディファイア適用後の PolyCore を使いたい場合は、modCore() を使用
    // var child_core = child.modCore();
    // 自身のコアを取得
    var core = obj.core();
    // 頂点をコピー
    var vertexCount = child_core.vertexCount();
    for (i = 0;i &lt; vertexCount;i++) {
        // 子オブジェクトからのコピーなので、第１引数は false （頂点捜査はしない）
        core.addVertex(false, child_core.vertex(i));
    }
    // ポリゴンをコピー
    var polyCount = child_core.polygonCount();
    var polySize = 0;
    for (i = 0;i &lt; polyCount;i++) {
        var indices = [];
        polySize = child_core.polygonSize(i);
        for (j = 0;j &lt; polySize;j++) {
            indices.push( child_core.vertexIndex( i, j ) );
        }
        var pi = core.addIndexPolygon( polySize, indices );
        // UV 座標をコピー
        for (j = 0;j &lt; polySize;j++) {
            core.setUVCoord(pi, j, child_core.uvCoord(i, j));
        }
    }
}
</code>
</pre>
<p>ここまでを、再度シーンに呼び出してみます。子オブジェクトを追加して、子オブジェクトのモードタグで不可視に設定します。そのままでは、オブジェクトの更新がかからず何も描画されていないと思うので、'count' 等のパラメータを変更して、強制的にオブジェクトをアップデートしてみて下さい。子オブジェクトと同じ形状が表示されました？</p>
<p>
<img src="http://www.tres-graficos.jp/blog/resources/ch_20091210_tut003.jpg" width="370" height="360" alt="ch_20091210_tut003.jpg" />
</p>
<p>いちいち描画更新のために、パラメータをいじるのが面倒なので、このオブジェクトをクリエータオブジェクトに設定しておきます。</p>
<pre>
<code>
<br />function buildUI ( obj ) {
    // 初期値 1 最小値 1 最大値 10 の整数型パラメータを追加
    obj.addParameterInt("count",1,1,10,true,true);
    // クリエータオブジェクトに設定
    obj.setCreatorObj( true );
}
</code>
</pre>
<p>これで、子オブジェクトは自動的に非表示になり、子オブジェクトの変更で自身がアップデートされるクリエータオブジェクトとして振る舞うよう設定されました。</p>
<h3>パラメータを使って</h3>
<p>ここまでだと、単に子オブジェクトをコピーするだけなので、全くスクリプトを使う意味がありませんよね。 :-P<br />
次に、追加しておいた 'count' パラメータを使って、 count 分だけランダムにコピーするように変更してみます。</p>
<pre>
<code>
<br />function buildObject( obj ) {
    // 小オブジェクトがない場合、何もしない
    if ( obj.childCount() == 0) return; 
    // 子オブジェクトを取得し、ポリゴンファミリーでない場合、何もしない
    var child = obj.childAtIndex(0);
    if ( child.family() != NGONFAMILY) return; 
    // ここまでエラーチェック
    // count を取得
    var count = obj.getParameter("count");
    // 子オブジェクトの PolyCore を取得
    var child_core = child.core();
    // モディファイア適用後の PolyCore を使いたい場合は、modCore() を使用
    /*
    var child_core = child.modCore();
    */
    // 自身のコアを取得
    var core = obj.core();
    for (var i = 0;i &lt; count;i++) {
        var vec = new Vec3D( Math.random() * 5 - 2.5, Math.random() * 5 - 2.5, Math.random() * 5 - 2.5);
        // ポリゴンコピーのコードを関数化して外に
        copyPolyCore( core, child_core, vec );
    }
}
function copyPolyCore( core, child_core, vec ) {
    // ほぼ同じコード
    var i,j;
    // 頂点をコピー
    // 前のコピーで追加された頂点数オフセットとして取得
    var vertexCount_offset = core.vertexCount();
    var vertexCount = child_core.vertexCount();
    for (i = 0;i &lt; vertexCount;i++) {
        // 子オブジェクトからのコピーなので、頂点は捜査しない。
        // 第３引数の vec （ランダム要素）を加算してコピー
        core.addVertex(false, child_core.vertex(i).add(vec) );
    }
    // ポリゴンをコピー
    var polyCount = child_core.polygonCount();
    var polySize = 0;
    for (i = 0;i &lt; polyCount;i++) {
        var indices = [];
        polySize = child_core.polygonSize(i);
        for (j = 0;j &lt; polySize;j++) {
            indices.push( vertexCount_offset + child_core.vertexIndex( i, j ) );
        }
        var pi = core.addIndexPolygon( polySize, indices );
        // UV 座標をコピー
        for (j = 0;j &lt; polySize;j++) {
            core.setUVCoord(pi, j, child_core.uvCoord(i, j));
        }
    }
}
</code>
</pre>
<p>これで、'count' で設定した数だけランダムな位置にコピーするスクリプトオブジェクトが出来ました。</p>
<p>
<img src="http://www.tres-graficos.jp/blog/resources/ch_20091210_tut004.jpg" width="400" height="420" alt="ch_20091210_tut004.jpg" />
</p>
<p>これにさらに調整できるパラメータを追加したものを <a href="http://www.tres-graficos.jp/blog/files/article.php?id=5">Ramdom Array.js</a> として公開していますので、興味のある方は是非チェックしてみて下さい。（古いコードなので、ちょっとあれですけど… :-! ）</p>
<hr />
<p>ちょっと長過ぎたかも。 :-(<br />
読んでいただいた皆様ありがとうございます。</p>
]]>
</content:encoded>
</item>
</channel>
</rss>