WorldViz User Forum

WorldViz User Forum (https://forum.worldviz.com/index.php)
-   Vizard (https://forum.worldviz.com/forumdisplay.php?f=17)
-   -   3d-movement (https://forum.worldviz.com/showthread.php?t=1664)

Andy 10-06-2008 07:41 AM

3d-movement
 
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.

Code:

#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:
Code:

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:

Code:

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:
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:
Code:

keyTracker = viztracker.Keyboard6DOF(forward=viz.KEY_UP,backward=viz.KEY_DOWN,left=viz.KEY_LEFT,right=viz.KEY_RIGHT)


All times are GMT -7. The time now is 05:08 AM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Copyright 2002-2023 WorldViz LLC