什么是原型?
X3D规范中虽然已经定义了上百个节点,但不可能满足所有应用的需求,因此提供了原型的机制让创作者能够定义新的节点。一个节点通常包含了数个字段以定义该节点的属性,参数化的改变节点的某些特性,当然,节点也可以不包含任何字段。
原型–定义新节点的语法
首先,以ProtoDeclare宣告新节点的名称。ProtoDeclare中需依序包含ProtoInterface及ProtoBody,在ProtoInterface中列出该节点所有的字段(需注明字段的名称、资料型态、操作类型),在ProtoBody中以内建节点定义出新节点的功能。以下为两个节单的例子:
<ProtoDeclare name='NewWorldInfoNode'> <ProtoBody> <WorldInfo DEF='ExamplePrototypeBody'/> </ProtoBody> </ProtoDeclare> |
<ProtoDeclare name='EmissiveMaterial'>
<ProtoInterface>
<field name='onlyColor' type='MFColor' accessType='inputOutput'/>
</ProtoInterface>
<ProtoBody>
<!-- Override default diffuseColor value 0.8 0.8 0.8 -->
<Material diffuseColor='0 0 0'>
<!-- Connect emissiveColor field of current node to onlyColor field of parent ProtoDeclare. -->
<IS>
<connect nodeField='emissiveColor' protoField='onlyColor'/>
</IS>
</Material>
</ProtoBody>
</ProtoDeclare> |
在ProtoBody中可以有若干个IS,IS中包含若干个connect,用来将ProtoBody中内建节点的字段对应到ProtoInterface中新节点的字段。例如上面第二个范例程序代码中,EmissiveMaterial这个新节点的onlyColor字段是表示Material节点中的emissiveColor字段。注意对应字段的资料型态与操作类型必须要一致。
新节点中也可以定义子节点,例如:
<ProtoDeclare name='ShiftGroupUp2m'>
<ProtoInterface>
<field name='children' type='MFNode' accessType='inputOutput'>
<Group DEF='DefaultNodeValue' bboxSize='2 2 2'/>
</field>
</ProtoInterface>
<ProtoBody>
<Transform translation='0 2 0'>
<Group>
<IS>
<connect nodeField='children' protoField='children'/>
</IS>
</Group>
</Transform>
</ProtoBody>
</ProtoDeclare> |
原型–使用新节点的语法
如果新节点的的定义ProtoDeclare与使用新节点的语法在同一份X3D档案中的话,可以直接使用ProtoInstance使用新节点,以上面第二个程序代码为例:
<ProtoDeclare name="EmissiveMaterial">
...
</ProtoDeclare>
<ProtoInstance name="EmissiveMaterial">
<fieldValue name="onlyColor" value="0.8 0.8 0.8"/>
</ProtoInstance> |
如果新节点的定义在其它X3D档案中,需先使用ExternProtoDeclare宣告新节点定义的档案位置、节点名称、字段等信息,再以ProtoInstance使用该节点。
<ExternProtoDeclare name="EmissiveMaterial" url="EmissiveMaterialPrototype.x3d#EmissiveMaterial">
<field name='onlyColor' type='MFColor' accessType='inputOutput'/>
</ProtoDeclare>
<ProtoInstance name="EmissiveMaterial">
<fieldValue name="onlyColor" value="0.8 0.8 0.8"/>
</ProtoInstance> |
有关url的规定请参考Networking组件。