« XPressoで簡易窓枠(改造) | トップページ | C4Dユーザってどのくらい居るんだろうね? »

XPressoで簡易窓枠(改造C.O.F.F.E.E.ノード)

やっぱり、C.O.F.F.E.E.ノードを使わないで作るのって面倒なんだよね。
だってC.O.F.F.E.E.ノード1個でほとんど用が足りるし…

では先ほどのオブジェクトはそのままで、古いXPressoタグを消して新しいXPressoタグを取り付けて、「窓」「窓枠スプライン」「窓枠」「ガラス」をXPresso編集ウィンドウへドロップ。
C.O.F.F.E.E.ノードを1個追加。入力端子に「実数」7個、「リンク」3個追加。では…

前回、窓枠を作ったので細かい説明はしません。
ノードが追加されたと思います。

The_simple_casement_58

このように繋ぎます。
C.O.F.F.E.E.ノードは上7個「実数」、下3個「リンク」です。
「窓」の出力端子は前回と同じです。
「窓枠スプライン」「ガラス」「窓枠」の出力端子は全て「オブジェクト」です。

C.O.F.F.E.E.ノードのCOFFEEエディタを開きます。
次のコードを入力。
C.O.F.F.E.E.ノードの入力端子の名前と変数名は一致していないとC.O.F.F.E.E.エラーが出ます注意してください。

/*
窓枠
2009.1.14
*/


main()
{
  if(!instanceof(sl , SplineObject))return;    //スプラインオブジェクトでなければ中止
  if(!instanceof(pg , SinglePolyObject))return;//ポリゴンプリミティブでなければ中止
  if(!instanceof(ex , ExtrudeObject))return;   //押し出しNURBSでなければ中止

  var wx = width / 2.0;     //窓幅の半分
  var hy = height / 2.0;    //窓高さの半分
  var fx = (width - frame_w1 * 2.0) / 2.0; //外枠の内側の幅の半分
  var fy = (height - frame_w2 * 2.0) / 2.0;//外枠の内側の高さの半分
  var cx = cross_w1 / 2.0;    //縦桟幅の半分
  var cy = cross_w2 / 2.0;    //横桟幅の半分

  //スプラインのポイントの制御
  sl->SetPoint( 0 , vector( wx ,  hy , 0.0));
  sl->SetPoint( 1 , vector( wx , -hy , 0.0));
  sl->SetPoint( 2 , vector(-wx , -hy , 0.0));
  sl->SetPoint( 3 , vector(-wx ,  hy , 0.0));

  sl->SetPoint( 4 , vector(-fx ,  fy , 0.0));
  sl->SetPoint( 5 , vector(-fx ,  cy , 0.0));
  sl->SetPoint( 6 , vector(-cx ,  cy , 0.0));
  sl->SetPoint( 7 , vector(-cx ,  fy , 0.0));

  sl->SetPoint( 8 , vector( cx ,  fy , 0.0));
  sl->SetPoint( 9 , vector( cx ,  cy , 0.0));
  sl->SetPoint(10 , vector( fx ,  cy , 0.0));
  sl->SetPoint(11 , vector( fx ,  fy , 0.0));

  sl->SetPoint(12 , vector(-fx , -cy , 0.0));
  sl->SetPoint(13 , vector(-fx , -fy , 0.0));
  sl->SetPoint(14 , vector(-cx , -fy , 0.0));
  sl->SetPoint(15 , vector(-cx , -cy , 0.0));

  sl->SetPoint(16 , vector( cx , -cy , 0.0));
  sl->SetPoint(17 , vector( cx , -fy , 0.0));
  sl->SetPoint(18 , vector( fx , -fy , 0.0));
  sl->SetPoint(19 , vector( fx , -cy , 0.0));

  sl->Message(MSG_UPDATE);                //ポイントの更新
  sl->SetPosition(vector(0.0 , 0.0 , -thickness / 2.0));//スプラインのポジション

  //押し出しNURBS
  ex#EXTRUDEOBJECT_MOVE = vector(0.0 , 0.0 , thickness);//押し出しの制御
  ex->SetPosition(vector(0.0));           //押し出しのポジション

  //ポリゴン
  pg#PRIM_POLY_WIDTH = width - frame_w1;  //ポリゴンプリミティブの幅
  pg#PRIM_POLY_HEIGHT = height - frame_w2;//ポリゴンプリミティブの高さ
  pg->SetPosition(vector(0.0));           //ポリゴンプリミティブのポジション
}

前回のXPressoタグがしていた事は、C.O.F.F.E.E.ノードで全て処理しています。
C.O.F.F.E.E.ノードのmain()関数は引数がありません。オブジェクトを扱うにはC.O.F.F.E.E.ノードの入力端子の「リンク」、GetActiveDocument()、GetActiveObject()かなぁ。
自分はXPressoの場合は「リンク」を使いますが、関数を使ったことはありません…

「窓」のユーザデータを変更して形が変わるか確認してください。

冒頭でC.O.F.F.E.E.ノードが楽だと書きましたが。全部が全部そうではありません。
単純にポジションを他のオブジェクトに追従させるのであればC.O.F.F.E.E.ノードを使わなくても良いですし、複雑系でも後からメンテナンスするのに見た目で追えるノード+ワイヤーの方が良いかもしれません。
C.O.F.F.E.E.の場合だと、時間がたって変更する事になると変数名などを把握しなおさないといけないけど、XPressoノードであれば、ワイヤー辿って楽に追加変更ができるかも…

今回のC4Dファイル「The_simple_casement3.ZIP」です。

ところで、XPressoのワイヤーをこんな風に表示させるプラグインとか知りませんか?
ワイヤーに色付けれたり、直角折れ線だったり。角丸だったり。

The_simple_casement_57

|

« XPressoで簡易窓枠(改造) | トップページ | C4Dユーザってどのくらい居るんだろうね? »

コメント

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