From: Pablo Figueroa [pfiguero@cs.ualberta.ca] Sent: Wednesday, November 29, 2000 7:01 PM To: Doug Bowman Cc: 3dui List; Rex Hartson Subject: Re: notation for 3D interaction techniques Hi all, I'm working on a high level language for interaction techniques (IT) as part of my PhD. Its main characteristics are: - It is independendent of any implementation language (i.e. VRML, C++, Java), but it can be implemented in any of them. - It defines the interface of each IT and how they can collaborate with others in an application, so it is possible to describe composition of ITs. Unfortunately I don't have yet a published paper to refer to, but I can make a brief description here, and more details can be found in my website under "ITLib". The basic idea is that ITs are described as filters with an internal state, multiple inputs, and multiple outputs. The semantics is described (so far) in plain english, but I want to try also a more formal approach with the Object Constraint Language Specification (OCL), part of the Unified Modeling Language (UML) standard. The language is based on XML and a short description of the GoGo interaction technique is as follows: // IT Description This says that GoGo has to inputs (head and hand positions), two outputs (the virtual hand position and the selected object), and a method to computer its output (processImpl). This allows GoGoIT to connect in a dataflow with other ITs in the environment. The state for GoGoIT is composed of three parameters (K, D, and the relative chest position from the head) and three objects: the scene (in order to look for a selected object), a hand representation, and a cube that will show the real hand's position. The comment can be Doug's description (or even the orieginal paper one), or also something more formal like this: (my first draft... ;-> ) ========================== -- The invariant of GoGoIt is as follows context GoGoIT inv: -- some variables for the expression that follows let headPos : Point3D = iportHead.lastValue() let handPos : Point3D = iportHand.lastValue() let chestPos : Point3D = headPos + relativeChestPos -- if the position of the virtual hand is different that the real hand, -- show the cube. if( chestPos.distanceTo( handPos ) < D ) cube.isVisible = false; else cube.isVisible = true; -- The cube is always in the real hand position cube.position = handPos -- The virtual hand is always in the last computed position handRepr.position = virtualHandLocation.lastOutput() -- Now the output is computed as follows context GoGoIT::processImpl -- if there is any input ... pre: iportHead.newValue() || iportHand.newValue() -- the output is computed as follows post: if( chestPos.distanceTo( handPos ) < D ) virtualHandLocation.lastOutput() = handPos else -- R comes from Poupyrev's paper... let dir : Vector = (handPos - chestPos).unitVector() virtualHandLocation.lastOutput() = handPos + dir * K(R - D)^2 selectedObject.lastOutput() = scene.GetSelectedByTouching(handRepr) ========================== OCL is based on an object oriented description of a model, so it can use any OO type and their methods. The specification is at http://www.rational.com/uml/resources/documentation/index.jsp I prefer to read Doug's description, but I'm sure something like the second one is easier to implement... :) If anyone is interested, I'd be glad to give more details. I'm also willing to participate in an group to work on this topic. Best Regards, ------------------------------------------- Pablo Figueroa pfiguero@cs.ualberta.ca PhD Student http://www.cs.ualberta.ca/~pfiguero University of Alberta Relax ... God is in charge -------------------------------------------