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

Scripting 001b - 'Duplicate Face' - 番外

つぶやきに反応してちょっと書いてみた。

同位置に重なってポリゴンがある場合、Cheetah3D の 3D ビュー上では汚く見えるので、ビューのタイトルバーで "表示" -> "裏面を描画しない" を設定しておくのがいいでしょうね。

追記:UV をセットするコードがまちがっていたので、修正 (Foot in mouth)



// ツールスクリプト : ~/Library/Application Support/Cheetah3D/scripts/Tool フォルダにコピー // 選択したポリゴンを同位置に複製し、法線を反転するスクリプトのサンプル // ツールのプロパティを設定、ツールスクリプトの場合、必須関数 function buildUI( tool ) { // プロパティビューにパラメータを追加、 tool.addParameterInt('poly sel', 0, 0, 15, false, false); // プロパティビューに実行ボタンを追加、クリックで duplicateFace 関数を実行 tool.addParameterButton('duplicate', 'apply', 'duplicateFace'); } // ボタンをクリックした時に呼び出される関数。パラメータのボタンから呼び出された関数の場合、引数はこのツールオブジェクト自身 function duplicateFace( tool ) { // ドキュメントから選択されたオブジェクトを取得 var obj = tool.document().selectedObject(); // ローポリゴンオブジェクトでない場合、終了 // この type 関数で取得できる変数は、ヘルプファイル Constants の項を参照 if (obj.type() != POLYGONOBJ ) return false; // 現在の選択セットを保持しておく(そのまま設定に使用するとエラーが出るため int 型に変換) var polyNum_bk = parseInt( obj.getParameter('activePolySelection') ); // ポリゴン操作用のコアオブジェクト (PolyCore) を取得 // モディファイア・ボーン適用後のメッシュ情報が欲しい場合は、modCore 関数を使う // 今回直接ポリゴンを複製するので、core 関数を使用 var core = obj.core(); // var i, j; // 捜査用にポリゴン数を取得 var polyCount = core.polygonCount(); for (i = 0;i < polyCount;i++) { if ( core.polygonSelection(i) ) { // ポリゴンが選択されている場合、ポリゴンを複製 // ポリゴンのサイズ(ポイント数)を取得 var size = core.polygonSize( i ); // ポイントと UV 情報保持のための変数を定義 var vertices = []; var uvs = []; for (j = 0;j < size;j++) { // ポリゴンとコーナー(ポイント)のインデックスから、ポイント(バーテックス)のインデックスを取得し [vertexIndex] 、それを使用して位置情報 Vec3D を取得 [ vertex ]、その位置情報 Vec3D を保持 vertices.push( core.vertex( core.vertexIndex( i, j ) ) ); // ポリゴンとコーナー(ポイント)のインデックスから、UV 情報を取得し、その情報を保持 uvs.push( core.uvCoord( i, j ) ); } // 新規ポリゴンを作成 (ポイントを共有する(ポリゴンの表裏を接合する)場合は、第2引数を true にする)戻り値は追加したポリゴンのインデックス var pi = core.addPolygon( size, false, vertices); // 4.6 では、UV を個別にセット(エラーが出るため)##ここのインデックス指定が間違ってました i -> pi ## for (j = 0;j < size;j++) { core.setUVCoord( pi, j, uvs[j] ); } // 5.0 の場合、バグが直っているので、addPolygon の第4引数で、 uvs を渡してやった方が簡単 // var pi = core.addPolygon( size, false, vertices, uvs ); // 追加したポリゴンの法線を逆にする core.flipWinding( pi ); // ポリゴン選択セットを、ツールのプロパティで設定した値にセット(エラーが出るため int 型に変換) core.setActivePolygonSelection( parseInt(tool.getParameter('poly sel')) ); // 選択状態にしておく core.setPolygonSelection( pi, true ); // ポリゴン選択セットを、戻す core.setActivePolygonSelection( polyNum_bk ); } } // 3D ビューをアップデート obj.update(); }

iPhone 関係、ちょこちょこ参考書は読んでるんだけど、なんせ手が遅いんだよね。 (Foot in mouth)