PDA

View Full Version : Mirrors and Nvis Nvisor


vissimutah
02-10-2010, 02:03 PM
using the Knowledge base mirror code in conjunction with the Knowledge base nvisor code seems to blank the right eye of the nvisor.


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=v iz.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.