Signpost 2.0 Design

See the Signpost Project Page by Michael Knapp.

A short presentation on the ideas detailed here.

Content

User Interface components

Augmentation

Augmentation is world stabilized graphics that convey some information or highlight features. They should appear overlayed to the real world geometry. This includes

Walls

Portals

Markers

Other static geometry

Navigation help

Lines along the floor or in the air, throughout the building along the path, bread crumps on the floor, arrows on walls and floor

World in miniature model

Selection of destination

Level of Error for presentation selection

Design Ideas

The main observation is that we have a single source of geometry that is could be reused but needs to be rendered in very different styles. The room geometry needs to be rendered with different styles for walls, portals, markers. Not all rooms should be rendered at all times. Some rendering techniques, such has hidden line and translucent + wire frame require several rendering passes over parts or all of the geometry. Basically we would like to have a matrix of rendering styles and geometry parts to be flexible setable :

Room part
Augmentation
WIM
other
Portals Room 1
translucent + wireframe
solid
...
Walls Room 1
invisible
solid
...
Markers Room 1
visible
invisible
...
Portals Room 2
...
...
...
Line of path
hidden line
filled
...

To implement this we will have one scene graph that stores the geometry in useful chunks such as rooms, further divided into semantically different geometry parts. Then there will be hooks at the appropriate places where different drawstyles and materials (and other gadgets such as GLTweak nodes to have only z-buffer rendering etc.) can be added. These will be switched depending on the context of the current traversal. Each different representation will use this scenegraph in an appropriate graph (necessary transformations to have the correct display) and set it's context. It can then easily switch between different styles of representation by changing only it's own drawstyles.

The different parts of the user interface such as Augmentation, WIM, way finding and path computation (this includes creating the line for example), should be as independend of each other as possible. Their common denominator is the use of the same geometry to express and compute their functionality. Therefore it appears as a good design choice to factor out this common scene graph and let each component interact only with this common scene graph but not with the other modules (or only as far as necessary). This leads to the following components :

We opt to implement these modules as single dedicated Studierstube applications. This way we can investigate how to design good interfaces between Stb apps. It should promote the reuse of these advanced interface components in other applications and simplify development as well. The single modules should also be more accessible to other developers than a large black box style application.

Idea : we reuse the one geometry several times for different rendering styles plus selections. We can augment the central geometry and only get a selection of components. that allows us to directly only display a subset such as the current path.

User Interface Specifications

WIM

Floating WIM

PIP

Augmentation

Augmentation

Pip

Local Navigation

HUD display

Augmented display

Pip

Map Overview application

Augmentation

Pip

Collaboration application

Only PIP based to send commands to other users

Collaboration

We want to add the following collaboration features:

Shared Views

A passive form of collaboration will only support shared views. A local user can see the same information as a remote user. Moreover its local display can be controlled by the local user, whereas the data itself is only manipulated by the remote user either implicitly (by moving around) or explicitly (selecting a new path etc.).

Tasks

An active form of collaboration supports the users in completing certain tasks. The following tasks could be interesting :

Software Design

The different parts of the overall Signpost application will be implemented as individual Studierstube applications that communicate via OpenInventor type interfaces, generally fields and routes. They also display or manipulate a shared state encapsulated in a common scene graph which is reused by each Studierstube application as it needs. The following components exist :

Components

All components share the following design attributes :

BAUKit

The BAUKit application simply stores the central scene graph. This is an elaborate structure of geometry that offers a lot of hooks to render it differently or parts of it. This is detailed in the scene graph diagrams on Michaels web page. Some details of how to influence the rendering of the scene graph :

WIMKit

The WIMKit takes care of the visualization in a World-In-Miniature model. It uses several BAUClient nodes to render the model in a window. The window is either attached to the PIP or floating in front of the user, orientationally world stabilized. We also want to add the look down feature described by Höllerer later. On the PIP it provides options to change the visualization. The model itself in the window can be scaled and dragged to show only parts of the whole model. It has the following fields :

SoSFBool floatingWIM
a flag that denotes whether the wim floats in front of user or is attached to pip
SoSFFloat scale
scale of model in wim
SoSFVec3f center
current center of the model in the wim
SoSFEnum renderStyle
defines how to draw the geometry in the WIM. Possible values are WIREFRAME, TRANSLUCENT
SoSFEnum content
defines what to render in the WIM. This can be either only the current room, all rooms along the desired path or the whole model.Possible values are ROOM, PATH, ALL
SoSFBool auxGeometry
defines whether to render any auxiliary geometry in the common scene graph.
SoSFBool visible
defines whether the WIM is visible or not at all
SoMFString path
sets the rooms that belong to the current path. This is an input field for other components to use.
SoSFString currentRoom
sets the current room of the user. This is an input field for other components to use.

Other future options might include other rooms to highlight as well.

AugmentationKit

The AugmentationKit renders augmentation information, that is overlays that are registered with the real world, such as wireframe models of walls etc. On the PIP it provides options to change the visualization. It has the following fields :

SoSFEnum content
defines which part of the model to render. The options are only the current room, the rooms along the path, or all. Possible values are ROOM, PATH, ALL
SoSFEnum roomStyle
defines how to render the room geometry. This includes not at all, as wireframes, hiddenlines or translucent walls.Only walls, floors, etc. are rendered but no portals ! Possible values are INVISIBLE, WIREFRAME, HIDDENLINE, TRANSLUCENT
SoSFEnum portalStyle
defines how to render the portal geometry of selected portals !. This includes not at all, as wireframes, hiddenlines or translucent. Possible values are values INVISIBLE, WIREFRAME, HIDDENLINE, TRANSLUCENT
SoSFBool visible
switch augmentation of completely
SoSFBool auxGeometry
show / hide auxiliary geometry
SoMFString path
input field for the chosen path
SoSFString currentRoom
input field for current room

NavigationKit

The navigation kit is an application without looks but a lot of brain :). It only renders navigational aids, but does the wayfinding algorithms and similar stuff. Actually the navigational aids could be moved to another application as well. It has the following fields :

Input fields

SoSFString destinationRoom
the destination room, this is an input field used to set the room, the user wants to go to.
SoSFVec3f postion
user position, from an SoTrakEngine
SoSFRotation orientation
user orientation, from same SoTrakEngine as above

Output fields

SoSFString currentRoom
the current room, I think this is an output field. If merged with startRoom it will also be an input field
SoMFString path
output field with path of rooms to follow.
SoSFString portalIndex
index of portal to next room in path
SoMFVec3f linePoints
2 values to draw the stroked arrow geometry between user and portal
SoSFRotation arrowDirection
rotation output for HUD arrow
SoSFInt32 arrowState
switch output for HUD arrow

State fields related to user interface

These fields are not necessary on the kit itself, they are directly provided by button widgets on the PIP.

SoSFBool showPortals
render only the special portals or not. This sets for all visualizations if they render the portals to go through or not.
SoSFBool showLine
show red line through the model, this could also be done with fixed arrows at turning points (where the red line has to bend a lot) !!
SoSFBool showArrow
show the directional arrow, a 2D icon
SoSFBool showHUD
show heads up display with textual information on:

Note: indoor / outdoor navigation has different paradigmas. Outdoor waypoints are main points, indoors areas or spaces are the objects one deals with. There is an obvious duality between the two, but still can we integrate this or not ??

 

CollaborationKit

This kit implements collaborative features by manipulating another users components. The general design has one instance per user and the master instance runs on the users kit. The slave instances manipulate the other components described before. This is a sort of proxy model, where the remote slave clients act as proxies for the master copy on the users computer. As for each user such a collaboration kit exists, we do not need to switch master properties and it is easily extendible to more users (allthough it might not scale to well to large numbers :). The following figure gives an overview how the interaction between collaboration kits and others will work.

The CollaborationKit also provides a visualization of the user for the other users by inserting an avatar icon into the auxiliary geometry of the other users BAUKit scene graph. It controls this geometry via tracking information and the updates received from the master copy.

It has the following fields :

These fields control the appearance of the user on remote kits and passes information to the remote kits about its state (current room, path etc.)

SoSFInt32 user
the user id of the user it represents
SoSFBool visible
whether the users position should be visible (to others) as avatar
SoSFString currentRoom
the users current room
SoMFString path
the users current path to its destination room.

These variables are used to control other users. The slave copy residing on the machine of the target user will set the information set in the other fields accordingly. The protocol is simple. Any change to targetRoom or targetPath is set for the current targetUser. Therefore you first set the targetUser and then can send several changes by updating the targetRoom.

SoSFInt32 targetUser
user id of the user who's state is to be changed.
SoSFString targetRoom
set the destionation room of the target user
SoMFString targetPath
set the path of the target user (does this make sense, if we can set the destination room already ?)