Need help with Mouse controls and smooth camera movements...

i am working on code that changes the altitude of the camera relative to a game map when the mouse wheel is scrolled up or down…

i’ve gotten it to work, but i think that the scrolling is too rigid… is there any way i can change this code so that the scroll wheel creates a fluid and smooth movement?

import direct.directbase.DirectStart
from direct.task.Task import Task
from direct.showbase.DirectObject import DirectObject
from pandac.PandaModules import WindowProperties
from pandac.PandaModules import Texture
from pandac.PandaModules import TextureStage
from pandac.PandaModules import Vec3
from pandac.PandaModules import Vec4


# Shader input: Sky
_sky      = Vec4( 0.25, 0.5, 1.25, 0 )            # r, g, b, skip (default blue value was 1)
_clouds   = Vec4( 0.0014, 0.0012, 0.0018, 0.0010 ) # vx, vy, vx, vy
_lightvec = Vec4( 1, 0, 1, 0 )                 # x, y, z, skip
_fog      = Vec4( 0.16, 0.32, 0.36, 0.0002 )   # r, g, b, density


#Game class
class World( DirectObject ):


	#first things loaded
    def __init__( self ):

        # Control
	# stores down buttons
        self.heading = 0
        self.pitch = 0
        self.mouse = [ 0, 0, 0 ]
	self.Xkeys = [ 0 , 0 ]
	self.Ykeys = [ 0 , 0 ]
	self.Zkeys = [ 0 , 0 ]
        self.wheel = [ 0, 0, 0 ]

        # Setup
	# loads components
       
        self._setupBase( )
        self._setupInput( )
        self._setupCamera( )
        self._setupTerrain( )
      	self._setupSky( )
     
	#sky setup
        render.setShaderInput( 'fog', _fog )
        render.setShaderInput( 'lightvec', _lightvec )

	#update camera and sky
        taskMgr.add( self.updateCamera, 'updateCamera' )
        taskMgr.add( self.updateScene, 'updateScene' )

    # _________________________________________________________________________
    # CONTROL

	#sets keys up or down state

    def setMouseButton( self, button, value ):
        self.mouse[ button ] = value

    def setWheel( self, button, value ):
        self.wheel[ button ] = value

    def setXKey(self, key, val): 
        self.Xkeys[key] = val

    def setYKey(self, key, val): 
        self.Ykeys[key] = val

    def setZkey(self, key, val): 
        self.Zkeys[key] = val

    def toggleWireframe( self ):
        base.toggleWireframe( )

    def toggleTexture( self ):
        base.toggleTexture( )

    def screenshot( self ):
        base.screenshot( 'screenshots/' )

    def exit( self ):
        taskMgr.stop( )


 	
    # _________________________________________________________________________
    # SETUP


	#base setup

    def _setupBase( self ):
        props = WindowProperties( )
        props.setCursorHidden( True )

        self.centerx = base.win.getProperties( ).getXSize( )/2
        self.centery = base.win.getProperties( ).getYSize( )/2

        base.disableMouse( )
        base.setBackgroundColor( 0, 0, 0 )
        base.win.requestProperties( props )
        base.win.movePointer( 0, self.centerx, self.centery )


	#accepts keyboard and mouse

    def _setupInput( self ):
        self.accept( 'f1', self.toggleWireframe )
        self.accept( 'f3', self.screenshot )
        self.accept( 'escape', self.exit )
	self.accept("arrow_left", self.setXKey, [ 0, 1 ] ) 
	self.accept("arrow_left-up", self.setXKey, [ 0, 0 ] )
	self.accept("arrow_right", self.setXKey, [ 1, 1 ] )
	self.accept("arrow_right-up", self.setXKey, [ 1 ,0 ] )
	self.accept("arrow_up", self.setYKey, [ 0 ,1 ] )
	self.accept("arrow_up-up", self.setYKey, [ 0, 0 ] )
	self.accept("arrow_down", self.setYKey, [1, 1 ] )
	self.accept("arrow_down-up", self.setYKey, [ 1, 0 ] )
	self.accept("page_up", self.setZkey, [0, 1 ] )
	self.accept("page_up-up", self.setZkey, [ 0, 0 ] )
	self.accept("page_down", self.setZkey, [1, 1 ] )
	self.accept("page_down-up", self.setZkey, [ 1, 0 ] )

        self.accept( 'mouse1', self.setMouseButton, [ 0, 1 ] )
        self.accept( 'mouse1-up', self.setMouseButton, [ 0, 0 ] )
        self.accept( 'mouse2', self.setMouseButton, [ 1, 1 ] )
        self.accept( 'mouse2-up', self.setMouseButton, [ 1, 0 ] )
        self.accept( 'mouse3', self.setMouseButton, [ 2, 1 ] )
        self.accept( 'mouse3-up', self.setMouseButton, [ 2, 0 ] )
        self.accept( 'wheel_up', self.setWheel,[ 0, 1 ])
	self.accept( 'wheel_down', self.setWheel, [ 1, 1])
    


	#loads terrain
    def _setupTerrain( self ):
        tex0 = loader.loadTexture( 'levels/Desertland1_TX.jpg' )
        tex0.setMinfilter( Texture.FTLinearMipmapLinear )
        np = loader.loadModel( 'levels/Desertland1.egg' )
        np.reparentTo( render )
        np.setPos(0, 0, 0 )
        np.setTexture(tex0)
	np.setHpr( 0,0, 180 )
	

	#loads sky
    def _setupSky( self ):
        self.skyNP = loader.loadModel( 'environment/sky.egg' )
        self.skyNP.reparentTo( render )
        self.skyNP.setScale( 8000, 8000, 3000 )
        self.skyNP.setPos( 0, 0, 0 )
        self.skyNP.setTexture( loader.loadTexture( 'environment/clouds.png' ) )
        self.skyNP.setShader( loader.loadShader( 'environment/sky.sha' ) )
        self.skyNP.setShaderInput( 'sky', _sky )
        self.skyNP.setShaderInput( 'clouds', _clouds )
    
    def _setupCamera( self ):
       
        # Setup scene camera
        cam0 = base.cam.node( )
        cam0.getLens( ).setNear( 100 )
        cam0.getLens( ).setFar( 10000 )
        cam0.setTagStateKey( 'Normal' )
        base.camera.setPos( -500, -500, 600 ) # Initial position
    

#_________________________________________________________________________
    # TASKS



	#moves the camera on keypress or mouse wheel
    def updateCamera( self, task ):
	md = base.win.getPointer( 0 )
        x = md.getX( )
        y = md.getY( )
	speed = 0
        rotation = 0

	
# camera X control keys
# 0 = left
# 1 = right

# camera Y control keys
# 0 = up
# 1 = down
# 

# camera Z control keys
# 0 = page up
# 1 = page down
# 


	if self.Xkeys[ 0 ]:
	     base.camera.setX(base.camera,-10)
 
	elif self.Xkeys [ 1 ]:
	     base.camera.setX(base.camera,+10)
 

        
	if self.Ykeys[ 0 ]:
	     zz = camera.getZ()
             base.camera.setY(base.camera,+10)
	     base.camera.setZ( zz )
 
        elif self.Ykeys [ 1 ]:
	     zz = camera.getZ()
             base.camera.setY(base.camera,-10)
	     base.camera.setZ( zz )
 

        if base.win.movePointer( 0, self.centerx, self.centery ):
            self.heading += ( x - self.centerx ) * -0.2
            self.pitch += ( y - self.centery ) * -0.2
            self.pitch = clampScalar( self.pitch, -80.0, 80.0 )


        if self.mouse[ 1 ]:
	     base.camera.setHpr(self.heading, self.pitch,0)


	if self.wheel[0]:
	     base.camera.setZ(base.camera.getZ()+12)	
             self.setWheel(0,0)

	elif self.wheel[1]:
	     base.camera.setZ(base.camera.getZ()-12)
	     self.setWheel(1,0)

	elif self.Zkeys [0]:
             base.camera.setZ(base.camera.getZ()+8)

	elif self.Zkeys [1]:
             base.camera.setZ(base.camera.getZ()-8)
        
	#base.camera.setPos( base.camera, Vec3( 0, 1, 0 ) * speed )
       # base.camera.setHpr( self.heading, self.pitch, rotation )


#control Z
	if camera.getZ() < 100:
	   camera.setZ(101)
	
	elif camera.getZ() > 3000:
	   camera.setZ(2999)

#control Y
	if camera.getY() < -4000:
	   camera.setY(-3999)

	elif camera.getY() > 4000:
	   camera.setY(3999)

#control X
	if camera.getX() < -4000:
	   camera.setX(-3999)

	elif camera.getX() > 4000:
	   camera.setX(3999)



        self.last = task.time
        return Task.cont



	#updates sky
    def updateScene( self, task ):
            # Re-center sky dome
        pos = base.camera.getPos( )
        pos.setZ( 0 )
        self.skyNP.setPos( pos )
   	render.setShaderInput( 'time', task.time )
        return Task.cont




#Runs the game

world = World( )
run( )

Nobody can help ???

I don’t know if you’re still watching this thread, but you could try adding an interval increment to the camera’s response to the mouse wheel. Instead of just setting it to a new value, make it increment toward the new value until it reaches it. Right now you’re just telling it to jump up or down 12 when the wheel is moved. That’s making it jerky because it’s a sizable jump. You could just lower that value, but that will make scrolling slower. Try incrementing, so it takes a few frames to make the whole jump.

Or automate the whole thing with an interval.

Essentially:

when wheel moves:
if an interval on camera already playing, kill it.
create and start a new interval on the camera from the current position to the desired final position.