PDA

View Full Version : moving and object by mouse but don't know how to stop the movement


nlfrnassimi
02-12-2009, 10:21 PM
my code is to select a ball and move it by mouse, I want to click a key and the ball will remain in that position, but have no idea how to do it.

please help

this is my code :


import viz

viz.go()

ground = viz.add('tut_ground.wrl')
viz.clearcolor(0.5,0.5,1)
ground.disable(viz.PICKING)

soccerball1 = viz.add('soccerball.ive')
soccerball2 = viz.add('soccerball.ive')
soccerball3 = viz.add('soccerball.ive')

soccerball1.translate(-1,1.5,3)
soccerball2.translate(0,1.5,3)
soccerball3.translate(1,1.5,3)

viz.mouse(viz.OFF)

def mouseclick(button):
global ball
if button == viz.MOUSEBUTTON_LEFT:
pickObj = viz.pick()
if pickObj.valid():
ball = pickObj


def mymouse(e):
global ball
if not ball:
return
else:
ball.setPosition((e.x-0.5)*3,e.y*3.5,3)


viz.callback(viz.MOUSEDOWN_EVENT,mouseclick)
viz.callback(viz.MOUSE_MOVE_EVENT,mymouse)

moooh
02-13-2009, 01:07 AM
You will just have to set the ball value to None and the ball should stay at its current position as your code already checks whether or not a ball is active before trying to move it.

You could alter the mouse down function to pick up the ball if none is selected and drop the ball if currently holding one, like this:


def mouseclick(button):
global ball
if button == viz.MOUSEBUTTON_LEFT:
if not ball: #we are not holding a ball, try to pick one up
pickObj = viz.pick()
if pickObj.valid():
ball = pickObj
else: #we were holding a ball, drop it
ball = None


or instead of changing the mousedown function you could make it so that pressing a key on the keyboard drops the ball:

def dropBall:
global ball
ball = None
vizact.onkeydown( 'd', dropBall )


This will drop the ball when the d key is pressed.

nlfrnassimi
02-15-2009, 06:02 PM
Thanks for your help, it works perfect. I have another problem.

I want to assign mouse wheel to be able to move my selected ball in depth. But I have no idea how to do it. Please help.

DrunkenBrit
02-17-2009, 05:33 AM
Maybe something along the lines of:


diffInZ = 3.0 # Value to add/subtract to Z position of selected ball

def onMouseWheel(dir):

global ball # Same ball object selected from previous mouse move callback

# Check 'ball' is valid/one selected from previous callback
ballPos = ball.getPosition()
addZ = -3.0

# If wheel is moving forward, make positive, else leave as negative
if dir > 0:
addZ = 3.0

ball.setPosition( ballPos[0], ballPos[1], ballPos[2] + addZ )

viz.callback(viz.MOUSEWHEEL_EVENT,onMouseWheel)

nlfrnassimi
02-18-2009, 07:39 PM
Thanks for your great help. It worked great.

Just that when I move the ball in depth and then try to move the mouse the ball comes back to front. do you know how should I solve this problem?

moooh
02-19-2009, 12:35 AM
Yes at this line of code ball.setPosition((e.x-0.5)*3,e.y*3.5,3) you have coded to always put the ball at z-coord 3 when moving the mouse. If you want to get the z-coord unaltered by the regular mouse movement you will have to change it to use the z-value from the ball's current position

pos = ball.getPosition() #get the current position
ball.setPosition((e.x-0.5)*3,e.y*3.5, pos[2] ) #pos[2] is the z-coord for the current position

DrunkenBrit
02-19-2009, 12:36 AM
Are you resetting the Z position of the selected ball in the mouse movement callback which moves the ball's X and/or Y position?

nlfrnassimi
02-19-2009, 11:48 PM
Thanks for your help mooh. it works perfect.

nasr
04-26-2009, 07:23 AM
i am also practising to develop a similar application which u come across with. i want to create a virtual room with a table and some books on it. along with a chair and i want to move, rotate the chair with the help of mouse. can u plz post the code for picking up the objects and moving, rotating, thanking you..my code is to select a ball and move it by mouse, I want to click a key and the ball will remain in that position, but have no idea how to do it.

please help

this is my code :


import viz

viz.go()

ground = viz.add('tut_ground.wrl')
viz.clearcolor(0.5,0.5,1)
ground.disable(viz.PICKING)

soccerball1 = viz.add('soccerball.ive')
soccerball2 = viz.add('soccerball.ive')
soccerball3 = viz.add('soccerball.ive')

soccerball1.translate(-1,1.5,3)
soccerball2.translate(0,1.5,3)
soccerball3.translate(1,1.5,3)

viz.mouse(viz.OFF)

def mouseclick(button):
global ball
if button == viz.MOUSEBUTTON_LEFT:
pickObj = viz.pick()
if pickObj.valid():
ball = pickObj


def mymouse(e):
global ball
if not ball:
return
else:
ball.setPosition((e.x-0.5)*3,e.y*3.5,3)


viz.callback(viz.MOUSEDOWN_EVENT,mouseclick)
viz.callback(viz.MOUSE_MOVE_EVENT,mymouse)