View Single Post
  #1  
Old 02-10-2010, 02:03 PM
vissimutah vissimutah is offline
Member
 
Join Date: Aug 2009
Posts: 2
Mirrors and Nvis Nvisor

using the Knowledge base mirror code in conjunction with the Knowledge base nvisor code seems to blank the right eye of the nvisor.

Code:
import viz

vprn = viz.add('vrpn7.dle')

headTracker = vprn.addTracker('PPT0@172.19.1.23')

headlink = viz.link(headTracker,viz.MainView)

viz.eyeheight(0)

viz.displaymode(2560, 1024) 

viz.go(viz.STEREO | viz.FULLSCREEN)

REFLECT_MASK = viz.LAST_MASK << 1

def addMirror(mirror,mat=None):

	#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()
	
	for eye in (viz.RENDER_LEFT,viz.RENDER_RIGHT):
		
		#Create render texture
		tex = viz.addRenderTexture()

		#Create render node for rendering reflection
		lens = viz.addRenderNode(size=[1024,1024])
		lens.setCullMask(REFLECT_MASK)
		lens.attachTexture(tex)
		lens.setInheritView(True,viz.POST_MULT)
		lens.disable(viz.CULL_FACE,op=viz.OP_OVERRIDE)
		lens.disable(eye)
		
		#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.1])
		
		#Project reflection texture onto mirror
		mirror.texture(tex)
		mirror.texGen(viz.TEXGEN_PROJECT_EYE)

import nvis
nvis.nvisorSX()

#Add gallery environment
gallery = viz.add('gallery.ive')

import vizlens
pincushion = vizlens.PincushionDistortion()

#Use existing painting as mirror and specify the matrix
mirror = gallery.getChild('art04-FACES')
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('vcc_female.cfg')

#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)
Each section of provided code utilizes different arguments to viz.go(), but I haven't managed to correct the problem by using either or both of them.

I've also tried using the monocular mirror code but that creates more complicated problems.
Reply With Quote