|
#1
|
|||
|
|||
Tracking skews collisions
I have elegant, functioning collision code. However, once a tracker is introduced to the environment it stops working.
The MainView repeatedly teleports or twitches away from the encountered item instead of making contact and sliding. It's seizure worthy. I have tried so many workarounds for this, but nothing stabilizes the collision code. I'm assuming it's a tracking-Vizard incompatibility issue, since it works fine in a mouse controlled environment. We're using the DK 2 Rift for orientation and PPT for position tracking. I've seen a couple of people on the WorldViz forums with similar problems, but their questions were unfortunately never answered. |
#2
|
|||
|
|||
Can you post example Vizard code that reproduces the issue for you?
|
#3
|
|||
|
|||
I simplified the code as much as I could. It replicates the same problem of glitchy collisions and the problem of 'Collided' calls en masse.
Code:
import viz import time import string import vizact import vizcam import random import oculus import vizinfo import vizshape import vizinput import viztracker import vizproximity viz.go() # Run Vizard. #Flags isIn = False inWhat = -1 inWhere = None # Counters. revisitCtr = 0 # Arrays. o_house = [] t_ball = [] houses = [] NUM_HOUSES = 24; # Detect and add the oculus rift ---------------------------------------------------------- # hmd = oculus.Rift(); vrpn = viz.add('vrpn7.dle') #Other code should use tracker number 5 posTracker = vrpn.addTracker('PPT0@WORLDVIZ-PC', 5) isense = viz.add('intersense.dle') oriTracker = hmd.getSensor() oriTracker.reset(viz.RESET_OPERATORS) if not hmd.getSensor(): sys.exit('Oculus Rift not detected') # Check if HMD supports position tracking ----------------------------------------------- # headTracker = viz.mergeLinkable(posTracker, oriTracker) supportPositionTracking = hmd.getSensor().getSrcMask() & viz.LINK_POS if supportPositionTracking: # Add camera bounds model camera_bounds = hmd.addCameraBounds() camera_bounds.visible(False) def CheckPositionTracked(): if hmd.getSensor().getStatus() & oculus.STATUS_POSITION_TRACKED: camera_bounds.color(viz.GREEN) else: camera_bounds.color(viz.RED) vizact.onupdate(0, CheckPositionTracked) # Setup navigation node and link to main view navigationNode = viz.addGroup() viewLink = viz.link(navigationNode, viz.MainView) viewLink.preMultLinkable(hmd.getSensor()) # Apply user profile eye height to view --------------------------------------------------- # profile = hmd.getProfile() if profile: viewLink.setOffset([0,profile.eyeHeight,0]) else: viewLink.setOffset([0,1.8,0]) headlink = viz.link(headTracker, viz.MainView) headlink.reset(viz.RESET_ORI_RAW) headlink.postScale([2,1,2]) hmd.window = headlink vizact.onkeydown('r', oriTracker.reset) MOVE_SPEED = 2.0 yaw,pitch,roll = headlink.getEuler() m = viz.Matrix.euler(yaw,0,0) # Add sensor to self. manager = vizproximity.Manager() target = vizproximity.Target(headlink) manager.addTarget(target) height = 1.3 # Enable Collision Detection --------------------------------------------------------------# #viz.MainView.collision( viz.ON ) viz.collision(viz.ON) viz.MainView.stepsize(3) #this seems to make the rejection twitching less violent def mycollision(info): print 'Collided' viz.callback(viz.COLLISION_EVENT, mycollision) # Environment Setup ----------------------------------------------------------------------- # day = viz.add('sky_day.osgb') ground = viz.add('tut_ground.wrl') LOCATIONS = [ [1, 0, -5] ,[-5, 0, 1] ,[5, 0, 1] ,[3, 0, 2] ,[2, 0, 2] ] columns = [] # Birdhouse Setup ------------------------------------------------------------------------- # def make_a_home(): col_num = 0 for pos in LOCATIONS: print 'Add a house' newCol = viz.addChild('plant.osgb') #Create collision boxes and link to birdhouses colBox = viz.add('box.wrl', scale=[0.5, 8, 0.5]) colBox.collideBox() colBox.disable(viz.DYNAMICS) colLink = viz.link( newCol, colBox ) colBox.disable(viz.RENDERING) columns.append(newCol) x_val = pos[0] z_val = pos[2] print col_num print pos[0] print pos[2] columns[col_num].setPosition([x_val, 0, z_val]) col_num +=1 make_a_home(); Additionally, we tried to turn on collisions with vizconnect, as well. However, the moment we useviz.collision(viz.ON), it disconnects our avatar from MainView. Do you know why this occurs? |
#4
|
|||
|
|||
The problem is the position of the navigation node keeps going after the viewpoint stops from a collision. When you try to back away from a collision object it takes awhile for the navigation node to catch up to the viewpoint.
A solution for this is to use a view_collision module written for use with vizconnect. This checks for collisions against an avatar object and then goes back up the chain to modify any transport node that's driving it. To be clear, no avatar needs to be rendered, that's just what vizconnect uses to group the head tracker and any hand trackers. I've attached an example that includes the view_collision module, the main script that adds a maze and collisions, and desktop vizconnect configuration files. If you create your own vizconnect config file with PPT+Oculus and load that with the maze script it should work with collisions. The setup for the collision detection is in warehouse_maze.py: Code:
ac = view_collision.AvatarCollision(collideTrackers=True) ac.setCollideList([vizconnect.AVATAR_HEAD]) ac.setTransport(vizconnect.getTransport().getNode3d()) |
#5
|
|||
|
|||
Hey Jeff,
I tried to use your module (view_collission) but some issues appeared: 1)it was an error when trying to use the self._avatar.getSkeleton().getBoneDict() 2) I'm using a transport and not an avatar so i need to replace the avatar commands with transport ones, how can i do that? I'm using vizconnect with oculus rift Dk2 AS TRACKER, than the transport is walking and the input device is xbox 1 controller (using direct input) and finally the oculus rift DK2 as display (hirarchic order - tracker->transport->display) Thanks in advance. |
#6
|
|||
|
|||
There's no need to download the view collision module I attached in my previous post. The latest view collision module is now included with the Vizard installation. If you have a vizconnect file with an avatar and transport then you can run the following code:
Code:
import viz import vizconnect from vizconnect.util import view_collision vizconnect.go('vizconnect_config.py') maze = viz.addChild('maze.osgb') ac = view_collision.AvatarCollision() ac.setCollideList([vizconnect.AVATAR_HEAD]) ac.setTransport(vizconnect.getTransport().getNode3d()) |
#7
|
|||
|
|||
You can go to Help > Check for Updates to download the latest version of Vizard. There have been updates to the collision module. When you upgrade to 5.3, you'll also need to upgrade the Oculus runtime to version 0.8.
The transport should be a parent of the avatar so the avatar moves when the transport moves. |
Tags |
collision, glitch, teleport, tracking, twitch |
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Using vizcave without tracking | pcatalano | Vizard | 3 | 01-08-2013 11:17 AM |
Can I get real time Intersense tracking data from another computer on the network? | GoldenSun | Vizard | 4 | 04-30-2008 08:42 PM |
tracking with multiple LEDS | dan12345 | Precision Position Tracker (PPT) | 7 | 04-02-2008 11:44 PM |
ImmersaDesk system tracking | kgarr | Vizard | 10 | 09-14-2006 12:17 PM |
tracking using quaternarion data | jfreeman | Vizard | 2 | 06-01-2005 09:48 AM |