[2.5] FPS MouseLook Script

######################################################
#
#   MouseLook.py        Blender 2.54
#
#	Adapted by ProperVandal from 2.49 source at tutorialsforblender3d.com
#
#   Released under the Creative Commons Attribution 3.0 Unported License.	
#
#   If you use this code, please include this information header.
#
######################################################

import bge

# define main program
def main():
	
	# set default values
	Sensitivity =  0.0005
	Invert = 1
	Capped = False

	
	# get controller
	controller = bge.logic.getCurrentController()
	
	# get the object this script is attached to
	obj = controller.owner
	
	# get the size of the game screen
	gameScreen = gameWindow()
	
	# get mouse movement
	move = mouseMove(gameScreen, controller, obj)
	
	# change mouse sensitivity?
	sensitivity =  mouseSen(Sensitivity, obj)
	
	# invert mouse pitch?
	invert = mousePitch(Invert, obj)
	
	# upDown mouse capped?
	capped = mouseCap(Capped, move, invert, obj)
	
	# use mouse look
	useMouseLook(controller, capped, move, invert, sensitivity)
		
	# Center mouse in game window
	centerCursor(controller, gameScreen)
	
#####################################################

# define game window
def gameWindow():
	
	# get width and height of game window
	width = bge.render.getWindowWidth()
	height = bge.render.getWindowHeight()
	
	return (width, height)

#######################################################

# define mouse movement function
def mouseMove(gameScreen, controller, obj):

	# Get sensor named MouseLook
	mouse = controller.sensors["MouseLook"]

	# extract width and height from gameScreen
	width = gameScreen[0]
	height = gameScreen[1]

	# distance moved from screen center
	x = width/2 - mouse.position[0]
	y = height/2 - mouse.position[1]
	
	# initialize mouse so it doesn't jerk first time
	if 'mouseInit' in obj == False:
		obj['mouseInit'] = True
		x = 0
		y = 0
	
	#########	stops drifting on mac osx
   	
	# if sensor is deactivated don't move
	if not mouse.positive:
		x = 0
		y = 0
	
	#########  -- mac fix contributed by Pelle Johnsen
			   	 
	# return mouse movement
	return (x, y)


######################################################

# define Mouse Sensitivity
def mouseSen(sensitivity, obj):
	
	# check so see if property named Adjust was added
	if 'Adjust' in obj == True:
		
		# Don't want Negative values
		if obj['Adjust'] < 0.0:
			obj['Adjust'] = 0.0
		
		# adjust the sensitivity
		sensitivity = obj['Adjust'] * sensitivity

	# return sensitivity
	return sensitivity

#########################################################

# define Invert mouse pitch
def mousePitch(invert, obj):
	
	# check to see if property named Invert was added	
	if 'Invert' in obj == True:
			
		# pitch to be inverted?
		if obj['Invert'] == True:
			invert = -1
		else:
			invert = 1
			
	# return mouse pitch
	return invert

#####################################################

# define Cap vertical mouselook
def mouseCap(capped, move, invert, obj):
	
	# check to see if property named Cap was added
	if 'Cap' in obj == True:			
	
		# import mathutils
		import Mathutils
		
		# limit cap to 0 - 180 degrees
		if obj['Cap'] > 180:
			obj['Cap'] = 180
		if obj['Cap'] < 0:
			obj['Cap'] = 0
		
		# get the orientation of the camera to world axis
		camOrient = obj.orientation
		
		# get camera Z axis vector
		camZ = [camOrient[0][2], camOrient[1][2], camOrient[2][2]]
		
		# create camera z axis vector 
		vec1 = Mathutils.Vector(camZ)
		
		# get camera parent
		camParent = obj.parent
		
		# get parent orientation to world axis
		parentOrient = camParent.orientation
		
		# get parent z axis vector
		parentZ = [parentOrient[0][2], parentOrient[1][2], parentOrient[2][2]]
		
		# create parent z axis vector
		vec2 = Mathutils.Vector(parentZ)
		
		# find angle between two
		angle = Mathutils.AngleBetweenVecs(vec1, vec2)
			
		# get amount to limit mouselook
		capAngle = obj['Cap']
				
		# get mouse up down movement
		moveY = move[1] * invert
			
		# check capped angle against against camera z-axis and mouse y movement
		if (angle > (90 + capAngle/2) and moveY > 0)   or (angle < (90 - capAngle/2) and moveY < 0)  == True:
			
			# no movement
			capped = True
	
	# return capped
	return capped

###############################################

# define useMouseLook
def useMouseLook(controller, capped, move, invert, sensitivity):
				
	# get up/down movement
	if capped == True:
		upDown = 0
	else:
		upDown = move[1] * sensitivity * invert 
		
	# get left/right movement
	leftRight = move[0] * sensitivity * invert 
		
	# Get the actuators
	act_LeftRight = controller.actuators["LeftRight"]
	act_UpDown = controller.actuators["UpDown"]  
	
	# set the values
	act_LeftRight.dRot = [ 0.0, 0.0, leftRight]
	act_LeftRight.useLocalDRot = False  
	
	act_UpDown.dRot = [ upDown, 0.0, 0.0]
	act_UpDown.useLocalDRot = True
	
	# Use the actuators 
	controller.activate(act_LeftRight)
	controller.activate(act_UpDown) 
	
#############################################

# define center mouse cursor
def centerCursor(controller, gameScreen):
	
	# extract width and height from gameScreen
	width = gameScreen[0]
	height = gameScreen[1]
	
	# Get sensor named MouseLook
	mouse = controller.sensors["MouseLook"]
	
	# get cursor position
	pos = mouse.position
		
	# if cursor needs to be centered
	if pos != [ int(width/2), int(height/2)]:
		
		# Center mouse in game windowp
		bge.render.setMousePosition(int(width/2), int(height/2))
		
	# already centered.  Turn off actuators
	else:
		# Get the actuators
		act_LeftRight = controller.actuators["LeftRight"]
		act_UpDown = controller.actuators["UpDown"]  
		
		# turn off the actuators 
		controller.deactivate(act_LeftRight)
		controller.deactivate(act_UpDown) 

##############################################

# Run program
main()

The credits are in the header of the code, I found this on a youtube video while searching for the script (I’m not familiar enough with the new API to re-write it myself). :RocknRoll:

1 Like

thanks for sharing! Tried something similar a few days ago but couldn’t spend more than a few minutes in researching and i’ve never done anything serious with the BGE. This could help me mess with it again :slight_smile:

1 Like

Yes thanks for posting this, there seam to be a lot of articles at the moment that purport to be for Blender 2.5 that direct people to the 2.49 mouse look scripts that fail with errors. I am sure this is frustrating people at the moment. Edit: Just for clarity this works with the tutorial “http://www.tutorialsforblender3d.com/Game_Engine/MouseLook/MouseLook_First_1.html

1 Like

I have noticed that there a problem with the recognition of the game properties on the camera object the test to see if the property is in the object always returns false (or a datatype that equates to false in the comparison) Python is not in my coding repertoire so I’m not sure what the correct syntax is, however if the conditional is removed the rest of the function can access and use the property so its something wrong with the statement “if ‘Adjust’ in obj == true:” what that would be I don’t know.

1 Like

Hi, it doesn’t seem to work for me on blender 2.5. I have followed the tutorial on tutorialsforblender3d, is this working for other people?

1 Like

The mean of this &lt; is this < and the mean of this &gt; is this >.
I replaced it and it’s worked!

anyway this script is very old try this is much easy and customizable for the newer versions:

The upper script I converted to work at the newer versions:

######################################################
#
#   MouseLook.py        Blender 2.55 or newer!
#
#	Adapted by ProperVandal from 2.49 source at tutorialsforblender3d.com
#
#   Released under the Creative Commons Attribution 3.0 Unported License.	
#
#   If you use this code, please include this information header.
#
######################################################
import bge

def main():
	
	# set default values
	Sensitivity =  0.0010
	Invert = 1
	Capped = False

	
	controller = bge.logic.getCurrentController()
	obj = controller.owner
	gameScreen = gameWindow()
	move = mouseMove(gameScreen, controller, obj)
	sensitivity =  mouseSen(Sensitivity, obj)
	invert = mousePitch(Invert, obj)
	capped = mouseCap(Capped, move, invert, obj)
	useMouseLook(controller, capped, move, invert, sensitivity)
	centerCursor(controller, gameScreen)

def gameWindow():
	width = bge.render.getWindowWidth()
	height = bge.render.getWindowHeight()
	
	return (width, height)

def mouseMove(gameScreen, controller, obj):
	mouse = controller.sensors["MouseLook"]

	width = gameScreen[0]
	height = gameScreen[1]
	x = width/2 - mouse.position[0]
	y = height/2 - mouse.position[1]
	if 'mouseInit' in obj == False:
		obj['mouseInit'] = True
		x = 0
		y = 0
	if not mouse.positive:
		x = 0
		y = 0
	return (x, y)

def mouseSen(sensitivity, obj):
	if 'Adjust' in obj == True:
		if obj['Adjust'] < 0.0:
			obj['Adjust'] = 0.0
		sensitivity = obj['Adjust'] * sensitivity
	return sensitivity

def mousePitch(invert, obj):
	if 'Invert' in obj == True:
		if obj['Invert'] == True:
			invert = -1
		else:
			invert = 1
	return invert

def mouseCap(capped, move, invert, obj):
	if 'Cap' in obj == True:			
		import Mathutils
		if obj['Cap'] > 180:
			obj['Cap'] = 180
		if obj['Cap'] < 0:
			obj['Cap'] = 0
		camOrient = obj.orientation
		camZ = [camOrient[0][2], camOrient[1][2], camOrient[2][2]]
		vec1 = Mathutils.Vector(camZ)
		camParent = obj.parent
		parentOrient = camParent.orientation
		parentZ = [parentOrient[0][2], parentOrient[1][2], parentOrient[2][2]]
		vec2 = Mathutils.Vector(parentZ)
		angle = Mathutils.AngleBetweenVecs(vec1, vec2)
		capAngle = obj['Cap']
		moveY = move[1] * invert
		if (angle > (90 + capAngle/2) and moveY > 0)   or (angle < (90 - capAngle/2) and moveY < 0)  == True:
			capped = True
	return capped

###############################################

# define useMouseLook
def useMouseLook(controller, capped, move, invert, sensitivity):
				
	# get up/down movement
	if capped == True:
		upDown = 0
	else:
		upDown = move[1] * sensitivity * invert 
		
	# get left/right movement
	leftRight = move[0] * sensitivity * invert 
		
	# Get the actuators
	act_LeftRight = controller.actuators["LeftRight"]
	act_UpDown = controller.actuators["UpDown"]  
	
	# set the values
	act_LeftRight.dRot = [ 0.0, 0.0, leftRight]
	act_LeftRight.useLocalDRot = False  
	
	act_UpDown.dRot = [ upDown, 0.0, 0.0]
	act_UpDown.useLocalDRot = True
	
	# Use the actuators 
	controller.activate(act_LeftRight)
	controller.activate(act_UpDown) 
	
#############################################

# define center mouse cursor
def centerCursor(controller, gameScreen):
	
	# extract width and height from gameScreen
	width = gameScreen[0]
	height = gameScreen[1]
	
	# Get sensor named MouseLook
	mouse = controller.sensors["MouseLook"]
	
	# get cursor position
	pos = mouse.position
		
	# if cursor needs to be centered
	if pos != [ int(width/2), int(height/2)]:
		
		# Center mouse in game windowp
		bge.render.setMousePosition(int(width/2), int(height/2))
		
	# already centered.  Turn off actuators
	else:
		# Get the actuators
		act_LeftRight = controller.actuators["LeftRight"]
		act_UpDown = controller.actuators["UpDown"]  
		
		# turn off the actuators 
		controller.deactivate(act_LeftRight)
		controller.deactivate(act_UpDown) 

##############################################

# Run program
main()

and all fine.

Thanks.

1 Like