PDA

View Full Version : 3d-movement


Andy
10-06-2008, 07:41 AM
I use "vizcave" and I would like to navigate the vitual viewpoint via keyboard. For the real-position of the user I use a tracking-system and for navigation I would like to use the keyboard.


#Virtual viewpoint (Translate view origin 1 meter up and back)
vp = [0, 1, -1]

#Use tracker for automatically updating cave
cave.setTracker(pos=tracker)

#Create vizcave.CaveView object for manipulating viewpoint in cave environment
origin = vizcave.CaveView(tracker)

#Translate view origin
origin.setPosition(vp)


now I use the "viz.KEYDOWN_EVENT" to set an new origin:

def onKeyDown(key):
if key == 'z': #forward
vp[2] += 5*viz.elapsed()
if key == 'b': #backwards
vp[2] -= 5*viz.elapsed()
if key == 'g': #left
vp[0] -= 5*viz.elapsed()
if key == 'h': #right
vp[0] += 5*viz.elapsed()
origin.setPosition(vp)


There are two problems:
- First, the movement is not very smooth
and
- If I rotate the viewpoint (origin.setEuler()) the direction of the movement is the same as before (if I rotate -90 degrees yaw, I have to press "go left" to move forward).

How can I smoothen the movement?
Is there a function to automatically adapt the movement to the current pos?

Andy
10-06-2008, 08:36 AM
For the second "problem" I found a posible solution:


if key == 'z': #forward
origin.setPosition(
(origin.getPosition()[0]+(math.sin(vizmat.DEG_TO_RAD*origin.getEuler()[0])*0.1)),
(origin.getPosition()[1]),
(origin.getPosition()[2]+(math.cos(vizmat.DEG_TO_RAD*origin.getEuler()[0])*0.1))
)
if key == 'b': #backwards
origin.setPosition(
(origin.getPosition()[0]-(math.sin(vizmat.DEG_TO_RAD*origin.getEuler()[0])*0.1)),
(origin.getPosition()[1]),
(origin.getPosition()[2]-(math.cos(vizmat.DEG_TO_RAD*origin.getEuler()[0])*0.1))
)

and so on

Do you know a better way?

farshizzo
10-06-2008, 02:49 PM
You can use the viztracker.Keyboard6DOF() object to setup keyboard navigation and link it to the CaveView object. Here is sample code:import viztracker
keyTracker = viztracker.Keyboard6DOF()
viz.link(keyTracker, origin)The Keyboard6DOF object uses the WASD keys by default for navigation. You can customize the keys by passing the following optional keyword arguments to the constructor:

forward - key for moving forward
backward - key for moving backward
right - key for strafing right
left - key for strafing left
turnRight - key for rotating right
turnLeft - key for rotating left

For example, if you wanted to use the arrow keys for moving around you would use the following code to create the keyboard tracker object:keyTracker = viztracker.Keyboard6DOF(forward=viz.KEY_UP,backwar d=viz.KEY_DOWN,left=viz.KEY_LEFT,right=viz.KEY_RIG HT)