#1
|
|||
|
|||
UserAvatar questions
Hello, I am using the ideas from
http://vizworkshop.com/articles/walkthrough_app with the intent of making a moving collide capsule to move the camera with. The code looks like this: Code:
import viz class UserSkeleton(viz.EventClass): def __init__(self, eye_height, HeadObjectName, move_speed, turn_speed): viz.EventClass.__init__(self) self.TurnSpeed = turn_speed self.MoveSpeed = move_speed print "Move speed: " + str(move_speed) self.CollideCapsule = viz.addGroup() self.CollideCapsule.setPosition(0,1,0) self.Feet = viz.addGroup(self.CollideCapsule) self.ChestAndCalibration = viz.addGroup(self.Feet) self.ChestAndCalibration.setPosition([0,0,0]) self.HeadNode = viz.addGroup(self.ChestAndCalibration) self.HeadNode.setPosition([0, eye_height-1.2, 0]) self.EyeNode = viz.addGroup(self.HeadNode) self.EyeNode.setPosition([0,.08,.1]) self.ball = viz.add('ball.wrl') self.ball.setScale([.1,.1,.1]) print "HeadNode position: " + str(self.HeadNode.getPosition(viz.ABS_GLOBAL)) self.HeadObject = viz.add('biohead_talk.vzf') self.HeadObject.alpha(.5) #self.physicShape = self.CollideCapsule.collideCapsule(euler=[0,90,0], radius=.36, length=1, friction=.00000001, hardness=.0000001, bounce=0) self.physicShape = self.CollideCapsule.collideCapsule(euler=[0,90,0], radius=.36, length=1, friction=.1, hardness=.0000001, bounce=0) #self.physicShape = self.CollideCapsule.collideBox([.25, 1, .25]) self.velMotor = self.CollideCapsule.addVelocity(velocity=[0,0,0], maxForce=100, gravity=False) self.mouseDx = 0 self.mouseDy = 0 self.callback(viz.MOUSE_MOVE_EVENT, self.onMouseMove) vizact.onupdate(viz.PRIORITY_PHYSICS-1, self.updatePrePhysics) vizact.onupdate(viz.PRIORITY_PHYSICS+1, self.updatePostPhysics) def updatePrePhysics(self): throttle = vizmat.Vector([0,0,0]) ## rotation Control for feet yawChange = self.mouseDx * self.TurnSpeed # move distance throttleChange = self.mouseDy * self.MoveSpeed #print "move speed: " + str(throttleChange) + " Move speed: " + str(self.MoveSpeed) + " Dy: " + str(self.mouseDy) #discard old mouse movement and start collecting new mouse input self.mouseDx = 0 self.mouseDy = 0 feetEuler = self.Feet.getEuler(viz.ABS_GLOBAL) feetEuler[0] = feetEuler[0] + yawChange feetEuler[1] = 0 #no pitch feetEuler[2] = 0 #no roll self.Feet.setEuler(feetEuler, viz.ABS_GLOBAL) ## Translate Control throttle.set([0,0,throttleChange]) #throttle.normalize() #<--direction if throttle.length(): #if throttle not zero #move forward in direction of head newVel = vizmat.Transform() newVel.setTrans(throttle) newVel.postEuler(self.Feet.getEuler(viz.ABS_GLOBAL)) self.velMotor.setVelocity(newVel.getTrans()) else: self.velMotor.setVelocity([0, 0, 0]) def updatePostPhysics(self): self.CollideCapsule.setEuler([0, 0, 0]) self.HeadObject.setPosition(self.HeadNode.getPosition(viz.ABS_GLOBAL), viz.ABS_GLOBAL) self.HeadObject.setEuler(self.HeadNode.getEuler(viz.ABS_GLOBAL), viz.ABS_GLOBAL) viz.MainView.setPosition(self.EyeNode.getPosition(viz.ABS_GLOBAL), viz.ABS_GLOBAL) viz.MainView.setEuler(self.EyeNode.getEuler(viz.ABS_GLOBAL)) #self.ball.setPosition(self.EyeNode.getPosition(viz.ABS_GLOBAL), viz.ABS_GLOBAL) #self.ball.setEuler(self.EyeNode.getEuler(viz.ABS_GLOBAL), viz.ABS_GLOBAL) #print "Head position: " + str(self.HeadObject.getPosition(viz.ABS_GLOBAL)) #print "Capsule position: " + str(self.CollideCapsule.getPosition(viz.ABS_GLOBAL)) #print "Feet position: " + str(self.Feet.getPosition(viz.ABS_GLOBAL)) #print "HeadNode euler: " + str(self.HeadNode.getEuler(viz.ABS_GLOBAL)) #print "EyeNode euler: " + str(self.EyeNode.getEuler(viz.ABS_GLOBAL)) #print "MainView euler: " + str(viz.MainView.getEuler()) #viz.MainView.lookat(self.HeadNode.getPosition(viz.ABS_GLOBAL)) def onMouseMove(self, e): #fuction called twice, once for movement on x axis, once for y axis self.mouseDx = self.mouseDx + e.dx self.mouseDy = self.mouseDy + e.dy def setPosition(self, xyz): self.feet.setPosition(xyz) def setEuler(self, euler): self.head.setEuler(euler) if __name__ == '__main__': viz.go() #viz.move([0, 0, -2]) viz.phys.enable() viz.stepsize(1) #viz.phys.setGravity([0,1,0]) #t = viz.add('tankmaze.wrl') t = viz.add( 'playground.wrl' ) t.setPosition([-10,0,10]) #t = viz.add('C:/AXE/Resource/Rooms/apartment-small3.IVE') #t.setScale([.01, .01, .01]) t.collideMesh(bounce=0, hardness=1, friction=0) user = UserSkeleton(1.82, 'biohead_talk.vzf', .4, .1) def mykeyboard(key): if key == ' ': print "Adding thruster: " user.CollideCapsule.addThruster(mode=viz.ABSOLUTE_LOCAL,force=[0,-20,0]) if key == '1': print "Position: " + str(user.HeadNode.getPosition(viz.ABS_GLOBAL)) print "Adding thruster: " viz.callback(viz.KEYBOARD_EVENT,mykeyboard) It does almost exactly what I want, save for one thing - there are couches in the environment, and the capsule seems to tend to 'climb' up them. Is there any good solution to this using the above method? Or is there some nicer, cleaner method? Thanks, Christian |
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Two questions (networking) | TrashcanPatrol | Vizard | 5 | 05-07-2009 01:46 PM |
3 Easy Questions | JMOwens | Vizard | 3 | 10-03-2007 12:10 PM |
General Questions about Vizard: World Viz | dav | Vizard | 5 | 08-28-2006 03:44 PM |
Antialiasing questions | oodini | Vizard | 1 | 12-06-2005 12:08 PM |
Vizard 2.51 beta testing questions | Gladsomebeast | Vizard | 2 | 03-03-2005 05:09 PM |