WorldViz User Forum  

Go Back   WorldViz User Forum > Vizard

Reply
 
Thread Tools Rating: Thread Rating: 15 votes, 5.00 average. Display Modes
  #1  
Old 06-03-2013, 03:17 PM
Jennifer Jennifer is offline
Member
 
Join Date: Jun 2013
Posts: 1
Problems with using WIRKS without the Kinect in a mirror setting

Hello,

we have a problem with a setting in which we want to connect the head of an avatar to the camera in front of a mirror. When we use the 2D display this works just fine with the mirror code from this forum.

However, what we would like to do is using the WIRKS system WITHOUT the Kinect. Instead we just use the Inertia Cube and the HMD and want to connect that to the head of the avatar. Therefore, we used parts of the code of the balloonPop Demo file.

This did not work. What happens is that the avatar flies in the middle of the room and through the mirror it seems that the viewpoint is connected to the avatars feet (instead of the head). Somehow the connection of the avatar`s head and the camera seems to be overwritten by the code setting up the HMD.

Probably the problem has to do with the fact that there is still some code that uses Kinect data although we do not use the Kinect (e.g. myTrackers.getHead()). But we have no idea how to set this up properly.

It would be great if you could help us find the problem with this code!

Thanks in advance,
Jennifer


Code:
# Add the path of the common modules.
import sys 
sys.path.insert(0,'C:/Program Files (x86)/WorldViz/Wirks/Vizard Files/Common Modules/')

import viz
import vizact
import vizmat
import math
import random

import Config
import DisplayMode
import InertialLabs
import Instruction
from FAAST import Trackers
from FAAST import Gestures

INSTRUCTION = \
"""

"""

#######################################


#########################################


class BalloonPop(viz.EventClass):
	"""
	
	"""
	
	def __init__(self, headTracker=None):
		viz.EventClass.__init__(self)
		
		self.headTracker = headTracker	
	
	
############################################################
# Main.

import viztask
import Curtain

viz.setMultiSample(4)
viz.setOption('viz.fullscreen.monitor', Config.DISPLAY_ID)
viz.go(viz.FULLSCREEN)


def addKinectTrackers():
	"""
	Add Kinect trackers for each body part, taking into account SENSOR_HEIGHT and MIRROR_MODE.
	"""
	trackers = Trackers.add(sensorHeight=Config.SENSOR_HEIGHT, head=True, mirrorMode=Config.MIRROR_MODE)
	return trackers
	
	
def addKinectGestures():
	"""
	Add Kinect gestures to enable the FAAST reset gesture.
	"""
	
	gestures = Gestures.add()
	return gestures	


def addInertialLabs():
	"""
	Add an InertialLabs sensor with the correct USB COM port number.
	"""
	sensor = InertialLabs.addSensor(port=Config.COM_PORT)
	return sensor


def resetHeading(sensor, link, yawOffset):
	"""
	Reset OS3D heading (such that, upon reset, the user initializes facing virtual north) (this is necessiarily relative to the HMD)
	Virtual north refers to the direction of the positive z axis, or virtual 0 degrees yaw (in Vizard's standard coordinate system) 
	"""
	
	if sensor is not None and link is not None:
		link.reset(viz.RESET_OPERATORS)
		# Get yaw offset
		yaw = sensor.getEuler()[0]
		# Subtract known yaw offset from mounting
		yaw -= yawOffset
		m = sensor.getMatrix()
		m.postEuler(-yaw,0,0)
		m.invert()
		quat = m.getQuat()
		# Apply offset to link
		link.postEuler([-yaw,0,0],target=viz.LINK_ORI_OP,priority=-20)
		link.preQuat(quat,target=viz.LINK_ORI_OP,priority=-20)	


myTrackers = None
displayMode = None
def init():	
	"""
	Initialize the simulation.
	"""
	
	global level, myTrackers, displayMode
	
	# Add the kinect trackers and gestures.
	myTrackers = addKinectTrackers()
	myGestures = addKinectGestures()
	
  #hier scheinbar noch watt aufrufn
	if Config.KINECT_MODE:
		level = BalloonPop(myTrackers.getHead())
	else:
		level = BalloonPop(viz.MainView)

	# Check for the reset gesture.
	vizact.onevent( Gestures.GESTURE_ON_EVENT, lambda k:(k.button==Config.RESET_ID, None), reset )
	
	
	def handleUserChoice():
		"""
		Based on the value of DISPLAY_MODE (in Config.py), select and establish display parameters for the user's view.
		"""
		
		Curtain.load()
		if Config.DISPLAY_MODE is None:
			DisplayMode.showGUI()
			displayMode = DisplayMode.getDisplayMode()
		else:
			displayMode = Config.DISPLAY_MODE
			DisplayMode.setDisplayMode(displayMode)
		
		loadText = showLoadingPage()
		yield Curtain.fadeToBlack()
		
		# Add an instruction box to the simulation window ('F1' shows/hides the instruction box)
		Instruction.add( INSTRUCTION )
		
		# Apply display parameters.
		DisplayMode.setupDisplay()
		
		# If the SONY HMD display mode was chosen, 
		if displayMode == DisplayMode.DISPLAY_HMD:	
			# Add InertialLabs sensor, and set up 6D tracker by merging it with head tracker.
			myILSensor = addInertialLabs()
			head6DoFTracker = viz.mergeLinkable(myTrackers.getHead(), myILSensor)	#myTrackers
			headLink = viz.link(head6DoFTracker, viz.MainView, srcFlag=viz.ABS_GLOBAL)
			resetHeading(myILSensor, headLink, Config.INERTIAL_LABS_OFFSET + 90)
			
			# Reset head orientation
			vizact.onevent( Gestures.GESTURE_ON_EVENT, lambda k:(k.button==Config.RESET_ID, None), resetHeading, myILSensor, headLink, Config.INERTIAL_LABS_OFFSET + 90 )
		
		# Otherwise,
		else:
		
			# Set up user's default view.
			viz.MainView.setPosition(0, Trackers.DEFAULT_HEAD_HEIGHT, -6)			
		loadText.remove()
		yield Curtain.fadeToWorld()
	viztask.schedule(handleUserChoice())


def reset():
	"""
	Reset the simulation, and reset the user's view.
	"""
	
	# If the senor height is None, use the default head height, 1.82m.
	if Config.SENSOR_HEIGHT is None:
		myTrackers.setDefaultHeadHeight()
	
	#if displayMode != DisplayMode.DISPLAY_HMD:
	#	viz.MainView.setPosition(0, myTrackers.getHead().getPosition(viz.ABS_GLOBAL)[1], -6)


def showLoadingPage():
	"""
	Show the 'Loading...' message as the demo prepares to initialize.
	"""
	
	loadText = viz.addText('Loading...', parent=viz.SCREEN, pos=[.5, .5, 0])
	loadText.draworder(101)
	loadText.alignment(viz.TEXT_CENTER_CENTER)
	
	return loadText

#####################################################


REFLECT_MASK = viz.addNodeMask()

def addMirror(mirror,mat=None,eye=viz.BOTH_EYE):

	#If mirror matrix is not specifed, get matrix of mirror object
	if mat is None:
		mat = mirror.getMatrix()

	#Position of mirror
	pos = viz.Vector(mat.getPosition())

	#Direction mirror is pointing
	dir = viz.Vector(mat.getForward())
	dir.normalize()

	#Quaternion rotation of mirror
	quat = mat.getQuat()

	#Create render texture
	tex = viz.addRenderTexture()

	#Create render node for rendering reflection
	lens = viz.addRenderNode(size=[1024,1024])
	lens.attachTexture(tex)
	lens.setInheritView(True,viz.POST_MULT)
	lens.disable(viz.CULL_FACE,op=viz.OP_OVERRIDE)
	lens.setCullMask(REFLECT_MASK)
	if eye == viz.LEFT_EYE:
		lens.disable(viz.RENDER_RIGHT)
		mirror.setMask(REFLECT_MASK|viz.RIGHT_MASK,mode=viz.MASK_REMOVE)
	elif eye == viz.RIGHT_EYE:
		lens.disable(viz.RENDER_LEFT)
		mirror.setMask(REFLECT_MASK|viz.LEFT_MASK,mode=viz.MASK_REMOVE)
	else:
		mirror.setMask(REFLECT_MASK,mode=viz.MASK_REMOVE)

	#Setup reflection matrix
	rot = viz.Matrix.quat(quat)
	invRot = rot.inverse()
	lens.setMatrix(viz.Matrix.translate(-pos)*invRot*viz.Matrix.scale(1,1,-1)*rot*viz.Matrix.translate(pos))

	#Setup reflection clip plane
	s = viz.sign(viz.Vector(dir) * viz.Vector(pos))
	plane = vizmat.Plane(pos=pos,normal=dir)
	dist = plane.distance([0,0,0])
	lens.clipPlane([dir[0],dir[1],dir[2],s*dist-0.01])

	#Project reflection texture onto mirror
	mirror.texture(tex)
	mirror.texGen(viz.TEXGEN_PROJECT_EYE)

#Add environment
environment=viz.add('C:/Figuren/Buero_VR/room2/room2.wrl')
environment.setEuler(90,0,0)
environment.setPosition(1.5,0,-8)

#Add male avatar
avatarMale = viz.add('C:/Users/VR/Documents/Jenni_Dateien/Jenni_StudieII/Dateien zur Aufnahme/business02_m/business02_m_highpoly.cfg')
	
avatarMale.setEuler(270,0,0)
avatarMale.setPosition(-1,0,-5.5)

#Create a mirror
mirror = viz.addTexQuad()
mirror.scale(.8,1,1)
mirror.setPosition(0, 1.5, -4.1)
m = viz.Matrix()
m.setPosition(mirror.getPosition(viz.ABS_GLOBAL))
m.setEuler(180,0,0)

#Apply mirror settings to mirror object
addMirror(mirror,m)

#Increase ambient lighting
viz.MainView.getHeadLight().ambient(1,1,1)

#Create a self avatar
avatar = viz.add('C:/Figuren/2012-05-09 - Uni Duisburg Avatars/F20_HairOpen_NoMakeup.cfg')



def mykeyboard(key):
  # Speech and Animations

	if key == ' ':
		avatar.state(1)
		#avatarMale.addAction(leer, pool=8)
		avatarMale.setPosition(1.5,0,-4.9)

viz.callback(viz.KEYBOARD_EVENT,mykeyboard)


	
#Link avatar body to viewpoint
avatarLink = viz.link(viz.MainView,avatar)
avatarLink.setPos([None,0,None]) #Keep avatar on floor
avatarLink.setEuler([None,0,0]) #Only update avatar yaw
avatar.setMask(viz.LEFT_MASK|viz.RIGHT_MASK,mode=viz.MASK_REMOVE) #Only draw avatar in mirror

#Link avatar head to viewpoint
head = avatar.getBone('Bip01 Head')
head.lock()
viz.link(viz.MainView,head,mask=viz.LINK_ORI)


#####################################################

init()
#vizact.onkeydown(' ', balloonPop.initializeGame)
Reply With Quote
Reply

Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Updated Wirks Ducky Vizard 1 05-31-2013 03:33 PM
kinect + avatars Darkmax Vizard 7 04-19-2013 04:08 PM
Kinect auto selection of skeleton victorqx Vizard 0 05-29-2012 08:30 AM
Problems loading WRL file DrunkenBrit Vizard 2 01-29-2009 12:58 AM
Problems with lighting in 2.0 murm Vizard 6 04-21-2004 09:59 AM


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


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