« ユーザスクリプトでC.O.F.F.E.E.エラー | トップページ | スクリプトでポイントセレクト »

スクリプトでポリゴンオブジェクトを作成

スクリプトでポリゴンオブジェクトを作成する。
出来るのか?初めてだから挫折で終わるか?では実験。

/*
ポリゴン立方体を作成。
08.06.07
*/


var obj = new(PolygonObject);if(!obj)return;//ポリゴンオブジェクトの作成
var pt_vc = new(VariableChanged);if(!pt_vc)return;//ポイント数を変える為のVariableChangedを作成

var pt_n = 8;//ポイント数

pt_vc->Init(0 , n);//VariableChangedでポイント数の変更の準備
obj->MultiMessage(MSG_POINTS_CHANGED , pt_vc);//ポイント数の変更

doc->InsertObject(obj , NULL , NULL);//シーンに追加
doc->SetActiveObject(obj);//前回、忘れていたActiveObjectの設定

このスクリプトを実行してみよう。何も起こってないように見えまずが、シーンにはポイントが8個(0.0 , 0.0 , 0.0)のポリゴンオブジェクトが追加されています。構造タグで確認。ポリゴンは空ですね。
スプラインの場合は自動的に繋がってました。面を設定するには、どうしたら良いのだ?その前にポイントの位置の設定。

/*
ポリゴン立方体を作成。
08.06.07
*/


var obj = new(PolygonObject);if(!obj)return;
var pt_vc = new(VariableChanged);if(!pt_vc)return;

var size = 100.0;
var pt_n = 8;

pt_vc->Init(0 , pt_n);
obj->MultiMessage(MSG_POINTS_CHANGED , pt_vc);

//ポイントの設定
var size05 = size / 2;
obj->SetPoint(0 , vector( size05 ,  size05 ,  size05));
obj->SetPoint(1 , vector( size05 ,  size05 , -size05));
obj->SetPoint(2 , vector(-size05 ,  size05 , -size05));
obj->SetPoint(3 , vector(-size05 ,  size05 ,  size05));
obj->SetPoint(4 , vector( size05 , -size05 ,  size05));
obj->SetPoint(5 , vector( size05 , -size05 , -size05));
obj->SetPoint(6 , vector(-size05 , -size05 , -size05));
obj->SetPoint(7 , vector(-size05 , -size05 ,  size05));

obj->Message(MSG_UPDATE);

doc->InsertObject(obj , NULL , NULL);
doc->SetActiveObject(obj);

これでポイントが位置に配置されました。配列を使ってSetPoints()で設定する方法もあります。これに面を張るにはどうするんだ?ポイント数の変更がVariableChangedで出来るなら、ポリゴン数の変更も出来るはず。MultiMessage()の定数もたぶんMSG_POLYGONS_CHANGEDじゃないのか?えっ、SDK読めって?面倒臭かったもんで。

/*
ポリゴン立方体を作成。
08.06.07
*/


var obj = new(PolygonObject);if(!obj)return;
var pt_vc = new(VariableChanged);if(!pt_vc)return;
var pg_vc = new(VariableChanged);if(!pg_vc)return;//ポリゴン数を変える為のVariableChangedを作成

var size = 100.0;
var pt_n = 8;
var pg_n = 6;//ポリゴン数

pt_vc->Init(0 , pt_n);
pg_vc->Init(0 , pg_n);//VariableChangedでポリゴン数の変更の準備
obj->MultiMessage(MSG_POINTS_CHANGED , pt_vc);
obj->MultiMessage(MSG_POLYGONS_CHANGED , pg_vc);//ポリゴン数の変更

//ポイントの設定
var size05 = size / 2;
obj->SetPoint(0 , vector( size05 ,  size05 ,  size05));
obj->SetPoint(1 , vector( size05 ,  size05 , -size05));
obj->SetPoint(2 , vector(-size05 ,  size05 , -size05));
obj->SetPoint(3 , vector(-size05 ,  size05 ,  size05));
obj->SetPoint(4 , vector( size05 , -size05 ,  size05));
obj->SetPoint(5 , vector( size05 , -size05 , -size05));
obj->SetPoint(6 , vector(-size05 , -size05 , -size05));
obj->SetPoint(7 , vector(-size05 , -size05 ,  size05));

obj->Message(MSG_UPDATE);

doc->InsertObject(obj , NULL , NULL);
doc->SetActiveObject(obj);

とりあえず実行してみます。構造タグでポイント/ポリゴンを確認。ポイント8個/ポリゴン6個ありますね。成功だぁ。ではポリゴン操作。PolygonObjectクラスのSetPolygon()/SetPolygons()メンバ関数のどちらかだね。SetPolygon()メンバ関数はpolygonクラスを渡すのか。SetPolygons()メンバ関数は配列か。どっちも面倒だな。無駄かも知れないが関数にしよう。SetPolygon(ポリゴンオブジェクト , ポリゴンNo. , a , b , c , d)でセットできるように。PolygonObjectクラスのSetPolygon()メンバ関数と同じ名前ではあるが今から定義するのは普通の関数なので大丈夫のはず。では、今までのを正式にmain()関数にしてSetPolygon()関数を付け足す。ポリゴンは時計回りに設定しないと法線が裏向きになるので順番を注意しないと。

Polygonobj

/*
ポリゴン立方体を作成。
08.06.07
*/


SetPolygon(obj , pn , a , b , c , d)//この関数を追加
{
  var pgn = new(Polygon);//Polygonクラスを使いましたが配列でもOK
  pgn->a = a;
  pgn->b = b;
  pgn->c = c;
  pgn->d = d;
  obj->SetPolygon(pn , pgn);
}

main(doc , op)//main()を追加
{
  var obj = new(PolygonObject);if(!obj)return;
  var pt_vc = new(VariableChanged);if(!pt_vc)return;
  var pg_vc = new(VariableChanged);if(!pg_vc)return;

  var size = 100.0;
  var pt_n = 8;
  var pg_n = 6;

  pt_vc->Init(0 , pt_n);
  pg_vc->Init(0 , pg_n);

  obj->MultiMessage(MSG_POINTS_CHANGED , pt_vc);
  obj->MultiMessage(MSG_POLYGONS_CHANGED , pg_vc);

  //ポイントの設定
  var size05 = size / 2;
  obj->SetPoint(0 , vector( size05 ,  size05 ,  size05));
  obj->SetPoint(1 , vector( size05 ,  size05 , -size05));
  obj->SetPoint(2 , vector(-size05 ,  size05 , -size05));
  obj->SetPoint(3 , vector(-size05 ,  size05 ,  size05));
  obj->SetPoint(4 , vector( size05 , -size05 ,  size05));
  obj->SetPoint(5 , vector( size05 , -size05 , -size05));
  obj->SetPoint(6 , vector(-size05 , -size05 , -size05));
  obj->SetPoint(7 , vector(-size05 , -size05 ,  size05));

  //ポリゴンの設定
  SetPolygon(obj ,  0  , 0 , 1 , 2 , 3);
  SetPolygon(obj ,  1  , 0 , 4 , 5 , 1);
  SetPolygon(obj ,  2  , 1 , 5 , 6 , 2);
  SetPolygon(obj ,  3  , 2 , 6 , 7 , 3);
  SetPolygon(obj ,  4  , 3 , 7 , 4 , 0);
  SetPolygon(obj ,  5  , 7 , 6 , 5 , 4);

  obj->Message(MSG_UPDATE);

  doc->InsertObject(obj , NULL , NULL);
  doc->SetActiveObject(obj);
}

初めてポリゴンオブジェクトを生成しました。しかも成功です。後はスムースタグなどを付ける。UVWタグね…ま大丈夫でしょう。その気になれば…。気持ちが大切。ポリゴンができたら、ダイアログも絡めてパラメータ設定でポリゴンオブジェクトが作成出来るね。そう言えばUndo()をまたやらなかった。ま、ポリゴンオブジェクトの生成実験だからいいかぁ。
次は?どうする?

|

« ユーザスクリプトでC.O.F.F.E.E.エラー | トップページ | スクリプトでポイントセレクト »

コメント

この記事へのコメントは終了しました。