« artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-05 | トップページ | artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-07 »

artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-06

さて、仮に今までの事が全てクリアになったとしよう。
決定的な問題があります。

キャラクタを…と言うことは、単純にポリゴンオブジェクトとは考えづらいのです。
デフォーマやHypreNURBSを使っている事が多い事でしょう。

では、C.O.F.F.E.E.でデフォーマで変形されたポリゴンのポイントを取得する方法は、あるだろうか?
C.O.F.F.E.E.SDKと出会って、今までSDK内を何度も這いつくばって見てきたけど…
出くわしたことがありません。
何度も言うまでも無く、自分の目は節穴なので、すれ違っているにもかかわらず気付いていないだけかも知れませんが…

さらにHypreNURBSを適用し、細分化されたポリゴンの取得もSDKで見た事がありません。

では、変形されたポリゴンの取得は無理なのか?

変形を考慮して、自分で算出すれば良いのです。
デフォーマ毎にパラメータに合った計算方法で…

でも、頂点ウェイトも関係し…
HypreNURBSにもウェイトがあり…

自分で算出するのは面倒です。

では、本当に無理なのか?

C4Dには、「現在の状態をオブジェクト化」ツールがあります。

ID:12233をCallCommand()で呼び出してみたら?

/*
現在の状態をオブジェクト化
2009.7.13
*/


main(doc , op)
{
  CallCommand(12233);
}

試しに複数オブジェクトが存在する中で、HypreNURBSとデフォーマを適用したオブジェクトにスクリプトを実行してみます。

Export_16

スクリプトを実行しなくても、直接メニューからでも良いのだった…

ではHyperNURBSに実行すると、

Export_17

普通キャラクタならボーンを使う方が多いだろうけどね…
で、新しくオブジェクトができるのですが、順番は実行されたオブジェクトの次になります。
と、言う事は、新たなオブジェクトはGetNext()で…

現在の状態をオブジェクト化した、ポイントとポリゴンを表示します。

/*
現在の状態をオブジェクト化をしたオブジェクトを取得
2009.7.13
*/


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

  //アクティブオブジェクトを現在の状態をオブジェクト化し、それを取得
  CallCommand(12233);
  var obj = op->GetNext();
  var ply = obj->GetDown();

  //現在の状態をオブジェクト化したポイントとポリゴンデータの取得
  var pts = ply->GetPoints();
  var pgs = ply->GetPolygons();
  var ptc = ply->GetPointCount();
  var pgc = ply->GetPolygonCount();
  var c;

  //ポイントデータの表示
  println("---- point ----");
  for(c = 0 ; c < ptc ; c++)
  {
    println(c , " : " , pts[c]);
  }

  //ポリゴンデータの表示
  println("---- polygon ----");
  for(c = 0 ; c < pgc ; c++)
  {
    println(c , " : " , pgs[c * 4] , " " ,
                        pgs[c * 4 + 1] , " " ,
                        pgs[c * 4 + 2] , " " ,
                        pgs[c * 4 + 3]);
  }

  obj->Remove();//現在の状態をオブジェクト化したオブジェクトを削除
}

HyperNURBSのレンダリングでの分割を2で実行しました。
結果は…

---- point ----
0 : [-82.161476,-41.169281,-50.925926]
1 : [-150.347473,76.932236,-50.925926]
2 : [5.574507,-7.039898,-50.925926]
3 : [-76.922615,135.849182,-50.925926]
4 : [5.574507,-7.039899,50.925926]
5 : [-76.922615,135.849182,50.925926]
6 : [-82.161476,-41.169281,50.925926]
7 : [-150.347488,76.932236,50.925926]
8 : [-75.964256,41.143059,-87.847214]
9 : [-6.463647,81.269287,0.000000]
10 : [-75.964249,41.143059,87.847214]
                     :
                     :
87 : [-162.358276,41.061928,0.000000]
88 : [-140.794861,3.713062,-35.069443]
89 : [-119.231476,-33.635803,0.000000]
90 : [-159.947205,122.530647,0.000000]
91 : [-136.579971,146.132446,35.069443]
92 : [-113.212738,169.734268,0.000000]
93 : [-136.579971,146.132446,-35.069443]
94 : [-47.471935,-72.282074,0.000000]
95 : [-15.348557,-63.846340,-35.069443]
96 : [16.774820,-55.410606,0.000000]
97 : [-15.348557,-63.846340,35.069443]
---- polygon ----
0 : 0 51 26 56
1 : 14 74 26 51
2 : 8 77 26 74
3 : 17 56 26 77
4 : 1 53 27 50
5 : 15 75 27 53
6 : 8 74 27 75
7 : 14 50 27 74
8 : 3 55 28 52
9 : 16 76 28 55
10 : 8 75 28 76
            :
            :
85 : 17 95 47 56
86 : 13 94 47 95
87 : 25 73 47 94
88 : 2 62 48 57
89 : 20 96 48 62
90 : 13 95 48 96
91 : 17 57 48 95
92 : 4 68 49 63
93 : 23 97 49 68
94 : 13 96 49 97
95 : 20 63 49 96

スクリプトの内容は、コメントの通り…

  • アクティブオブジェクトを現在の状態をオブジェクト化
  • 現在の状態をオブジェクト化したオブジェクトを取得
  • オブジェクト化したポイント/ポリゴンデータを取得
  • コンソールにポイントとポリゴンデータを表示
  • オブジェクト化したオブジェクトを削除

実行後のオブジェクトマネージャは、何も無かったかのように実行前と同じ状態です。

ただね、このオブジェクト化したオブジェクトを取得していますが…
あくまでも、今回のようなオブジェクト階層構成の場合です。

このスクリプトは、万能ではありません

完全なものにするのであれば、適用したオブジェクトの次のオブジェクトを取得します。
その階層化全てのポリゴンオブジェクトを取得します。(孫/ひ孫…)

|

« artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-05 | トップページ | artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-07 »