Oct 04, 2009
Scripting 001b - 'Duplicate Face' - 番外
つぶやきに反応してちょっと書いてみた。
同位置に重なってポリゴンがある場合、Cheetah3D の 3D ビュー上では汚く見えるので、ビューのタイトルバーで "表示" -> "裏面を描画しない" を設定しておくのがいいでしょうね。
追記:UV をセットするコードがまちがっていたので、修正
// ツールスクリプト : ~/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 関係、ちょこちょこ参考書は読んでるんだけど、なんせ手が遅いんだよね。
2 Comments
Re: Scripting 001b - 'Duplicate Face' - 番外
はじめましてkabaと申します。
昨年の初め頃にCheetah3Dを購入しました。Macでの3Dは、いろいろ試したのですが上手くいきませんでした。その中でCheetah3Dは、とてもいい感じです。
先日、Cheetah3D 5.0 registration number!!!のメールが届きました。新しいバージョンでもいろいろ参考にさせていただきます。 よろしくです
From : kaba @ 2009-10-07 11:36:30 Edit
Re: Scripting 001b - 'Duplicate Face' - 番外
コメントどうもです。
アップデートもそろそろですね。4.0 の時にも思った事ですが、5.0 盛り上がるといいなぁ。
気まぐれな更新ですが、こちらこそ、よろしくお願いします。
From : tg @ 2009-10-07 17:33:56 Edit