« [artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-04]の解決法 | トップページ | C4D ユーザスクリプト ID と Plugin ID »

ポリゴンオブジェクトを1フレームごとにobj形式で保存

実際には…
artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-08
と、いう事なのですが、artist side/C4Dコミュニティでは解決積みなので、タイトルから[atist side]を外しました。

前回の記事
[artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-04]の解決法
http://villager-and-c4d.cocolog-nifty.com/blog/2009/07/artist-sidec4-9.html

を書いたので…

その前の記事、
artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-07(簡易obj形式エクスポーター)
http://villager-and-c4d.cocolog-nifty.com/blog/2009/07/artist-sidec4-6.html

との続きを…

まずは、簡易obj形式エクスポータを関数にします。
引数は、ポリゴンオブジェクト/ファイルパス(Filenameクラス)で…

/*
簡易obj形式エクスポータ関数
2009.7.21
*/


ExportPolyToObj(obj , path)
{
  if(!instanceof(obj , PolygonObject))return FALSE;
  if(!instanceof(path , Filename))return FALSE;

  var file = new(BaseFile);

  //ポリゴンのオブジェクトのデータの取得
  var pts = obj->GetPoints();
  var ptc = obj->GetPointCount();
  var pgs = obj->GetPolygons();
  var pgc = obj->GetPolygonCount();
  var mg = obj->GetMg();
  var c;

  //拡張子の設定
  path->SetSuffix("obj");

  //ファイルを開く
  file->Open(path , GE_WRITE);

  //ファイルの書き込み
  file->WriteString("# Wavefront *.obj file\n");
  file->WriteString("g " + obj->GetName() + "\n");
 
  for(c = 0 ; c < ptc ; c++)
  {
    pts[c] = mg->GetMulP(pts[c]);
    file->WriteString("v " + tostring( pts[c].x) + " " +
                             tostring( pts[c].y) + " " +
                             tostring(-pts[c].z) + "\n");
  }
  for(c = 0 ; c < pgc ; c++)
  {
    if(pgs[c * 4 + 2] != pgs[c * 4 + 3])
    {//四角ポリゴン
      file->WriteString("f " + tostring(pgs[c * 4    ] + 1) + " " +
                               tostring(pgs[c * 4 + 1] + 1) + " " +
                               tostring(pgs[c * 4 + 2] + 1) + " " +
                               tostring(pgs[c * 4 + 3] + 1) + "\n");
    }
    else
   
{//三角ポリゴン
      file->WriteString("f " + tostring(pgs[c * 4    ] + 1) + " " +
                               tostring(pgs[c * 4 + 1] + 1) + " " +
                               tostring(pgs[c * 4 + 2] + 1) + "\n");
    }
  }
  //ファイル書き込み終了
  file->Close();

  return TRUE;
}


//簡易obj形式エクスポータ関数の動作確認のためのmain()関数
main(doc , op)
{
  if(!instanceof(op , PolygonObject))return;

  var path = new(Filename);

  if(!path->FileSelect("obj形式保存" , TRUE))return;
  path->SetSuffix("obj");

  println(ExportPolyToObj(op , path));
}

実行すると、ファイル保存ダイアログが出てきて保存ができます。
問題が無かったのでコンソールには「1」が表示されています。
保存されたobj形式ファイルを再度C4Dへ取り込んでも問題ありません。

さて、この関数を使ってアニメーション中のポリゴンオブジェクトを1フレーム毎に書き出してみましょう。

/*
1フレーム毎にポリゴンオブジェクトをobj形式で保存
2009.7.21
*/


//簡易obj形式エクスポータ関数
ExportPolyToObj(obj , path)
{
  if(!instanceof(obj , PolygonObject))return FALSE;
  if(!instanceof(path , Filename))return FALSE;

  var file = new(BaseFile);

  //ポリゴンのオブジェクトのデータの取得
  var pts = obj->GetPoints();
  var ptc = obj->GetPointCount();
  var pgs = obj->GetPolygons();
  var pgc = obj->GetPolygonCount();
  var mg = obj->GetMg();
  var c;

  //拡張子の設定
  path->SetSuffix("obj");

  //ファイルを開く
  file->Open(path , GE_WRITE);

  //ファイルの書き込み
  file->WriteString("# Wavefront *.obj file\n");
  file->WriteString("g " + obj->GetName() + "\n");
 
  for(c = 0 ; c < ptc ; c++)
  {
    pts[c] = mg->GetMulP(pts[c]);
    file->WriteString("v " + tostring( pts[c].x) + " " +
                             tostring( pts[c].y) + " " +
                             tostring(-pts[c].z) + "\n");
  }
  for(c = 0 ; c < pgc ; c++)
  {
    if(pgs[c * 4 + 2] != pgs[c * 4 + 3])
    {//四角ポリゴン
      file->WriteString("f " + tostring(pgs[c * 4    ] + 1) + " " +
                               tostring(pgs[c * 4 + 1] + 1) + " " +
                               tostring(pgs[c * 4 + 2] + 1) + " " +
                               tostring(pgs[c * 4 + 3] + 1) + "\n");
    }
    else
   
{//三角ポリゴン
      file->WriteString("f " + tostring(pgs[c * 4    ] + 1) + " " +
                               tostring(pgs[c * 4 + 1] + 1) + " " +
                               tostring(pgs[c * 4 + 2] + 1) + "\n");
    }
  }
  //ファイル書き込み終了
  file->Close();

  return TRUE;
}



main(doc , op)
{
  if(!instanceof(op , PolygonObject))return;

  var path = new(Filename);
  var f_path;
  var name = op->GetName();
  var mnf = int(doc->GetMinTime()->GetFrame(doc->GetFps()));//アニメーションの最初のフレーム
  var mxf = int(doc->GetMaxTime()->GetFrame(doc->GetFps()));//アニメーションの最後のフレーム
  var tm = new(BaseTime);
  var ctm = doc->GetTime();
  var c;

  if(!path->PathSelect("objファイルをフォルダ選択"))return;

  for(c = mnf ; c <= mxf ; c++)
  {
    tm->SetFrame(c , doc->GetFps());
    doc->AnimateObject(op , tm , ANIMATE_QUICK);

    f_path = path->GetClone();
    f_path->AddLast(name + tostring(c));
    ExportPolyToObj(op , f_path);
  }
}

ポリゴンオブジェクトのデフォーマ等の変形やテクスチャ等は対応していません。

15フレーム程を出力してみます。

Objsave_01

実行すると、フレーム毎にobj形式で保存されます。

Objsave_02

では、全てをマージして確認します。

Objsave_03

15フレーム分のオブジェクトがフレーム毎に保存されているのが確認できました。

|

« [artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-04]の解決法 | トップページ | C4D ユーザスクリプト ID と Plugin ID »