というわけで、twitterとかニコ生とかで時々つぶやいている CINEMA 4D 用 PMX 出力プラグインの作成進捗状況…というか、プラグイン開発時の不明点とかアレコレ。
SDKドキュメントはもちろん英語です
とりあえず、頂点、ポリゴン、法線、UV、ウェイトまわりはなんとか目途がたったけど、マテリアルの内容、デフォーマ(スキンとか)やジェネレータ(対象、一体化、配列とか)の影響具合の判別方法とかよくわかんない状況なのねー。
上記画像ようにプラグインSDKにサンプルとしてついてくる ActiveObject を改造してオブジェクトの状態をウォッチするための機能を追加して構造を把握しようと試みてるけど、まだまだサッパリですわ。
特に特定の子オブジェクトを参照するタイプのデフォーマやジェネレータは、データ上ではどれが参照されてるだけ(レンダリング対象外)になっているかが判別できなくて四苦八苦してるわ。
ドキュメント内にあるポリゴン情報を全て出力するだけならもうちょいで作れそうなんだけど、それだと余計なポリゴンも出力されちゃうから使い物にならないのよねー。
わかってる範囲で簡単な説明とか
基本は、ドキュメント内に全てのデータが BaseList2D クラスを継承するカタチでツリー状に格納されてるみたいね。
プロジェクト設定、オブジェクト、マテリアルもろもろ。
で、データアクセスの手順はだいたいこんな感じ
BaseList2D::IsInstanceOf() でインスタンス(データ)の内容がポリゴンオブジェクトか、スプラインオブジェクトか等を判別。
BaseList2D をインスタンス(データ)の型に合わせてキャスト。大抵の場合は BaseObject。
BaseObject::GetRenderMode() でユーザーが設定したレンダリング設定(ON/OFF/従う)を取得。
BaseObject::GetDeformCache() でデフォーマ(スキンなど)による変形結果を取得。
BaseObject::GetCache() でジェネレータ(一体化、対象など)によるオブジェクト生成結果を取得。
BaseObject::GetFirstTag() で最初のタグ情報を取得。
※タグ情報は BaseList2D を継承しているので、後続のタグ情報は BaseList2D の操作で取得。
オブジェクトがポリゴンデータ( IsInstanceOf(Opolygon) )の場合
ToPoint( BaseObject* ) で頂点情報関係のクラス PointObject に変換してアレコレ。
ToPoly( BaseObject* ) でポリゴン情報関係のクラス PolygonObject に変換してアレコレ。
PolygonObject::CreatePhongNormals() でポリゴンの法線の取得。
今のところこんな感じね(白目