2012年3月4日日曜日

COLLADA (4)シーングラフ2

<node>周辺。

<instance_node>が出現する際に循環参照が生成されることはあるんだろうか。
COLLADA DOMへ独自形式を登録しインポート、エクスポートを行っているなら
責務はCOLLADA DOMとなるが、独自にエクスポートしてる場合はなきにしろあらずか。

コンセプトとして各種デジタルアセットを取り扱う基点となるのが目的だから
文句を言っても仕方ないが<instance_node>の存在が少し厄介。

単純な階層構造の場合、<node>はメッシュそのものになるわけだから、
class Node{
 Node* sibling;
 Node* children;
 Matrix toLocal;
 Matrix toWorld;
 Primitive* prim;
}
みたいな感じとすると、<node>だけで構成される場合は、階層構造を1度トラバースすれば
各toWorldは計算済みとなる。
描画フェーズで階層構造をトラバースしながらtoWorldを利用してプリミティブを描画するだけで
いいこととなる。

仕様書の例を少し改造して
<library_nodes>
 <node id="node2"/>
</library_nodes>
<node id="node0">
 <node id="node1">
  <translate>11.0 12.0 13.0</translate>
  <instance_node url="#node2"/>
 </node>
</node>
<node id="node2">
 <node id="node3">
 </node>
</node>
node1が該当部分となる。
仕様書によると、node1はnode2を少し移動するということだ。
class Nodeの例で<instance_node>への参照を持つと、計算フェーズでtoWorldが
上書きされて残念なことになる。

要素は、COLLADA ノードリソースのインスタンス化を宣言するためのものです。

説明に従ってインスタンス化するのが無難か。
とすると、
node0
 node1
  node2
   node3
node2
 node3

見かけ上のノード数4が実際には6ということになる。
COLLADA DOMのデータベースを介してノードを展開できると後で楽をできそうだがはてさて。

[追記]
ノードが展開できるかはさておき、daeDatabaseの検索が良くできてるな。
domNode* dom_node;
if(dae_db->getElement((daeElement**)&dom_node, 0, "node2", "node") != DAE_OK)
 return NULL;
先の例でこんな感じにすればdomNodeを引っ張ってこれる。
ただ、ここではgetElementの第二引数が0なので<instance_node>の<node>が引っかかる。
常識的に考えると<instance_node>に同じ<node>が存在するはずもないし
それらはただ間接参照するためだけに存在するはずだからid属性しか持っていないはずだ。
また、<library_visual_scenes>内の各<node>のid属性はユニークなはずなので
最大でも2回のクエリで取得できるはずだ。

余談ではあるが、仕様書の<node>の項をよく見ると面白いことが記載されている。
<instance_camera>
<instance_controller>
<instance_geometry>
<instance_light>
<instance_node>
出現回数は0以上。

ということは良し悪しはともかく
・カメラにジオメトリをくっつける
・カメラにライトをくっつける
・ライトにジオメトリをくっつける
なんてことも記載できるわけだ!
改めてこのフォーマットの柔軟性を感じた、今回はいい意味で。

0 件のコメント :

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。