Skip to content
lachsen edited this page Jun 4, 2013 · 18 revisions

Problems

Problem 1: Complex instantiation

XML3D currently only supports <mesh> to display geometry. In addition, instantiation is only possible on a data level. That means, that complex models consisting of N meshes can only be instantiated by declaring N elements + additional elements for transformation + shader assignment.

<group shader="house.xml#roofShader" transform="..." >
  <mesh src="house.xml#roof" />
</group>
<group shader="house.xml#frontShader" transform="..." >
  <mesh src="house.xml#frontWall" />
</group>
<group shader="house.xml#wallShader" transform="..." >
  <mesh src="house.xml#leftWall" />
</group>
<group shader="house.xml#wallShader" transform="..." >
  <mesh src="house.xml#rightWall" />
</group>
<group shader="house.xml#wallShader" transform="..." >
  <mesh src="house.xml#backWall" />
</group>

E.g. to include complex models, users need to understand 3 things:

  1. The number and names of all meshes included in the model
  2. the correct shader for each mesh
  3. the correct transformation of each mesh.

Thus it is not really possible to simply put a complex model into XML3D - the user needs to copy the whole hierarchy

Problem 2: Complex dataflow linking for instantiation

For more dynamic models, we do not only need to replicate the hierarchy with transformations and shader assignments, but must also connect dataflow nodes with input parameters to drive the animation - all this for each instance.

Here the full tag code to instantiate a TF2 animated mesh model:

  <!-- Apply skinning operator on base data of mesh -->
  <data id="sniperSkinned" proto="protos.xml#skinning">
	<data src="asset/sniper.xml#meshbase" />
	<data src="asset/sniper.xml#anim_taunt02_heelClick" />
	<float id="keySniper" name="key">0.0</float>
  </data>
  <!-- Instantiate each submesh by referring processed base data + correct index: -->
  <group shader="asset/sniper.xml#shader_sniper_head">
	<mesh type="triangle">
	  <data src="#sniperSkinned" />
	  <data src="asset/sniper.xml#index_sniper_head" />
	</mesh>
  </group>
  <group shader="asset/sniper.xml#shader_eyeball_l">
	<mesh type="triangle">
	  <data src="#sniperSkinned" />
	  <data src="asset/sniper.xml#index_eyeball_l" />
	</mesh>
  </group>
  <group shader="asset/sniper.xml#shader_eyeball_r">
	<mesh type="triangle">
	  <data src="#sniperSkinned" />
	  <data src="asset/sniper.xml#index_eyeball_r" />
	</mesh>
  </group>
  <group shader="asset/sniper.xml#shader_sniper_red">
	<mesh type="triangle">
	  <data src="#sniperSkinned" />
	  <data src="asset/sniper.xml#index_sniper_red" />
	</mesh>
  </group>
  <group shader="asset/sniper.xml#shader_sniper_lens">
	<mesh type="triangle">
	  <data src="#sniperSkinned" />
	  <data src="asset/sniper.xml#index_sniper_lens" />
	</mesh>
  </group>
  <group shader="asset/sniper.xml#shader_c_arrow">
	<mesh type="triangle">
	  <data src="#sniperSkinned" />
	  <data src="asset/sniper.xml#index_c_arrow" />
	</mesh>
  </group>

This is not only a lot of code, it also introduces a document id per instance, which makes the handling much more inconvient.

Potential Solution: Instantiate

While the instantation of whole hierarchies would solve Problem #1, it does not help for Problem #2. This is because we actually need be able to influence values deeply connected in the hierarchy to (e.g. the input parameters of the base data) e.g. to drive the skinning animation.

Because of that, instantiation of is not a good solution unless extended to support instanting.

Suggested Solution: MultiData

A suggested solution is the introduction of a new feature: MultiData. A summary on what MultiData is:

  • MultiData is orthogonal to Xflow
  • It is a wrapper around Xflow nodes to simplify the composition of dataflows (e.g. without introducing new document ids)
  • MultiData contains several mesh specific to simplify the instantation of multipe mesh models

Examples #1: House Model

<!-- Data Declaration (can be extern): -->
<multidata id="houseMultiData" >
  <meshdata name="roof" shader="#roofShader" >
    <int name="index" >...</int>
    <float3 name="position" >...</float3>
    <float3 name="normal" >...</float3>
    <float4x4 name="transform">...</float4x4>
  </meshdata>
  <meshdata name="front" shader="#frontShader" >
    <int name="index" >...</int>
    <float3 name="position" >...</float3>
    <float3 name="normal" >...</float3>
    <float4x4 name="transform">...</float4x4>
  </meshdata>
  <meshdata name="right" shader="#wallShader" >
    ...
  </meshdata>
  <meshdata name="left" shader="#wallShader" >
    ...
  </meshdata>
  <meshdata name="back" shader="#wallShader" >
    ...
  </meshdata>
</multidata>
<!-- Instantiation -->
<multimesh src="#houseMultiData" ></multimesh>
``

_Examples #2: TF2 Model_
```xml
<!-- Data Declaration (can be extern): -->
<multidata id="sniperMultiData" >
  <!-- Declaration of shared sub data -->
  <subdata name="base">
    <float3 name="position" >...</float3>
    <float3 name="normal" >...</float3>
    <float2 name="texcoord" >...</float2>
    <!-- + All the skinning assets -->
  </subdata >
  <!-- Declaration of meshdata that includes 'base' subdata via 'postadd' attribute -->
  <meshdata name="head" postadd="base" shader="#headShader" >
    <int name="index" >...</int> 
  </meshdata>
  <meshdata name="eyeball_r" postadd="base" shader="#eyeShader" >
    <int name="index" >...</int> 
  </meshdata>
  <meshdata name="eyeball_l" postadd="base" shader="#eyeShader" >
    <int name="index" >...</int> 
  </meshdata>
  <meshdata name="body" postadd="base" shader="#bodyShader" >
    <int name="index" >...</int> 
  </meshdata>
  <meshdata name="lens" postadd="base" shader="#lensShader" >
    <int name="index" >...</int> 
  </meshdata>
  <meshdata name="lens" postadd="base" shader="#lensShader" >
    <int name="index" >...</int> 
  </meshdata>
</multidata>
<!-- Instantiation -->
<multimesh src="#sniperMultiData" >
  <!-- here we extend the 'base' subdata and apply a prototype via 'postproto' -->
  <subdata name="base" postproto="#skinning" >
    <data src="asset/sniper.xml#anim_taunt02_heelClick" />
    <float id="keySniper" name="key">0.0</float>
  </subdata>
</multimesh>
``

Clone this wiki locally