View
216
Download
0
Tags:
Embed Size (px)
Citation preview
3dml: A Language for 3D Interaction Techniques Specification
Pablo FigueroaUniversity of AlbertaMay 2001
Motivation (2)
Edit Content:GeometrySoundHaptic EffectsBehavior
Edit VR Worlds:ContentControlAnimationsBehaviorStates
Tune to Hardware:Quality ContentControlAnimationsBehavior
VRApp
Hardware Settings:Mode of operationConfiguration
•Users•APIs•Tools
Related Work
Readability of Interaction Techniques (ITs) API documentation Papers
Rapid Development of VR Apps. C++/Java-based toolkits Alice (Python + Visual programming) VRML
Basic Concepts
Filters, devices, holders, VR objects, connections, composition, Discrete time
Filters
InputDevs.
OutputDevs.
VR Objects
Language Elements
Class declaration Application definition Instantiation Constant and connection declarations Filter connection Geometry of VR objects Embedded documentation Element overloading Reuse Complexity hiding
Class Declaration
<FilterClass id="SelectByTouching"> <Description> Implements selection by collision detection. </Description> <IPort id="p" type="Pos3D" defValue="handRepr.pos"><ShortDesc>Change of position</ShortDesc></IPort> <IPort id="q" type="Quaternion" defValue="handRepr.q"><ShortDesc>Change rotation</ShortDesc></IPort><IPort id="handRepr" type="VRObject">
<ShortDesc> Object that represents the users' hand </ShortDesc> </IPort> <IPort id="scene" type="Scene"> <ShortDesc>Selectable objects</ShortDesc> </IPort> <IPort id="addObject" type="VRObject"><ShortDesc>Dynamically added objects</ShortDesc> </IPort> <IPort id="removeObject" type="VRObject"><ShortDesc>Dynamically removed objects</ShortDesc></IPort> <OPort id="object" type="VRObject"><ShortDesc>Selected object</ShortDesc> </OPort>
</FilterClass>
Class Declaration (2)
<FilterClass id="GoGoIT"><Filter id="gogo" type="GoGo"></Filter> <Filter id="select" type="SelectByTouchingIT"></Filter> <VRObject id="cubeObj" primitive="Box"/> <ObjectHolder id="cube"> <Input id="setVisible" target="gogo" port="setVisible"/> | <Input id="object" target="_self" port="cubeObj"/> </ObjectHolder> <Binding target="gogo" port="pos"> <Port target="select" port="pos"/> </Binding> <Binding target="gogo" port="q"> <Port target="select" port="q"/> </Binding> <IPort id="K" type="float" defValue="0.167"> <Port target="gogo" port="K"/> </IPort> <IPort id="posHand" type="Pos3D"> <Port target="gogo" port="pHand"/> <Port target="cube" port="p"/> </Iport>...<OPort id="object" type="VRObject"> <Port target="select" port="object"/> </OPort>
</FilterClass>
Application Definition
<App> <!-- Load the scene --> <Scene id="scene" filename="scene.wrl"/> <Object id="handRepr" filename="hand.wrl"/> <!-- Platform-dependent section --> <ODevice id="console"/> <IDevice id="handTracker"/> <!-- Connections --> <Input id="pos" target="handTracker" port="pos"/> <Input id="q" target="handTracker" port="q"/> <!-- IT instances, with iport initialization --> <ObjectHolder id="handRepresentation"> <Input id="setTranslation" target="_self" port="pos"/> <Input id="setRotation" target="_self" port="q"/> </ObjectHolder> <Filter id="select" type="SelectByTouching"> <Input id="handRepr" target="_self" port="handRepr"/> <Input id="pos" target="_self" port="pos"/> <Input id="q" target="_self" port="q"/> <Input id="scene" target="_self" port="scene"/> </Filter> <Filter id="feedback" type="FeedbackOneIT"> <Input id="object" target="select" port="object"/> </Filter>
</App>
Instantiation
<App> …<ODevice id="console"/> <IDevice id="handTracker"/> <Filter id="select" type="SelectByTouching"> <Input id="handRepr" target="_self" port="handRepr"/> <Input id="pos" target="_self" port="pos"/> <Input id="q" target="_self" port="q"/> <Input id="scene" target="_self" port="scene"/> </Filter> <Filter id="feedback" type="FeedbackOneIT"> <Input id="object" target="select" port="object"/> </Filter>
</App>
<FilterClass id="GoGoIT"><Filter id="gogo" type="GoGo"></Filter> <Filter id="select" type="SelectByTouchingIT"></Filter> <VRObject id="cubeObj" primitive="Box"/>
</FilterClass>
Constant and Connection Declaration
<App> …<!-- Connections --> <Input id="pos" target="handTracker" port="pos"/> <Input id="q" target="handTracker" port="q"/> <!-- IT instances, with iport initialization --> <ObjectHolder id="handRepresentation"> <Input id="setTranslation" target="_self" port="pos"/> <Input id="setRotation" target="_self" port="q"/> </ObjectHolder> <Filter id="select" type="SelectByTouching"> <Input id="handRepr" target="_self" port="handRepr"/> <Input id="pos" target="_self" port="pos"/> <Input id="q" target="_self" port="q"/> <Input id="scene" target="_self" port="scene"/> </Filter>
</App>
Filter Connection
<FilterClass id="GoGoIT">... <ObjectHolder id="cube"> <Input id="setVisible" target="gogo" port="setVisible"/> | <Input id="object" target="_self" port="cubeObj"/> </ObjectHolder> <Binding target="gogo" port="pos"> <Port target="select" port="pos"/> </Binding> <Binding target="gogo" port="q"> <Port target="select" port="q"/> </Binding> <IPort id="posHand" type="Pos3D"> <Port target="gogo" port="pHand"/> <Port target="cube" port="p"/> </Iport>...<OPort id="object" type="VRObject"> <Port target="select" port="object"/> </OPort>
</FilterClass>
Geometry of VR Objects
<App> <!-- Load the scene --> <Scene id="scene" filename="scene.wrl"/> <Object id="handRepr" filename="hand.wrl"/> ...
</App>
<FilterClass id="GoGoIT"><VRObject id="cubeObj" primitive="Box"/> ...
</FilterClass>
Embedded Documentation
<FilterClass id="SelectByTouching"> <Description> Implements selection by collision detection. </Description> <IPort id="p" type="Pos3D" defValue="handRepr.pos"><ShortDesc>Change of position</ShortDesc> </IPort><IPort id="q" type="Quaternion" defValue="handRepr.q"><ShortDesc>Change rotation</ShortDesc></IPort><IPort id="handRepr" type="VRObject">
<ShortDesc>Object that represents the users' hand</ShortDesc> </IPort> <IPort id="scene" type="Scene"> <ShortDesc>Selectable objects</ShortDesc> </IPort> <IPort id="addObject" type="VRObject"><ShortDesc>Dynamically added objects</ShortDesc> </IPort><IPort id="removeObject" type="VRObject"><ShortDesc>Dynamically removed objects</ShortDesc></IPort> <OPort id="object" type="VRObject"> <ShortDesc>Selected object</ShortDesc> </OPort>
</FilterClass>
Element Overloading
IPort/OPort<FilterClass id="SelectByTouching">
<IPort id="p" type="Pos3D" defValue="handRepr.pos"><ShortDesc>Change of position</ShortDesc></IPort> <OPort id="object" type="VRObject"><ShortDesc>Selected object</ShortDesc> </OPort>
</FilterClass>
<FilterClass id="GoGoIT"><IPort id="posHand" type="Pos3D"> <Port target="gogo" port="pHand"/> <Port target="cube" port="p"/> </IPort><OPort id="object" type="VRObject"> <Port target="select" port="object"/> </OPort>
</FilterClass>
Element Overloading (2)
Input<App>
<!-- Connections --> <Input id="pos" target="handTracker" port="pos"/> <Input id="q" target="handTracker" port="q"/>
</App>
<FilterClass id="GoGoIT"><ObjectHolder id="cube"> <Input id="setVisible" target="gogo" port="setVisible"/> | <Input id="object" target="_self" port="cubeObj"/> </ObjectHolder>
</FilterClass>
Filter
Reuse
<FilterClass id="GoGoIT"><Filter id="gogo" type="GoGo"></Filter> <Filter id="select" type="SelectByTouchingIT"></Filter>
</FilterClass>
<App> <Filter id="select" type="SelectByTouching"> <Input id="handRepr" target="_self" port="handRepr"/> <Input id="pos" target="_self" port="pos"/> <Input id="q" target="_self" port="q"/> <Input id="scene" target="_self" port="scene"/> </Filter>
</App>