Source code for morse.blender.mocap_human_control

import logging; logger = logging.getLogger("morse." + __name__)

######################################################
#
#    mocap_human_control.py        Blender 2.61
#
#    Modified version of
#      human_control.py by Michael Karg
#
#    Gilberto Echeverria
#    09 / 07 / 2012
#
######################################################

import math
from morse.core import blenderapi

[docs]def move(contr): """ Read the keys for specific combinations that will make the camera move in 3D space. """ # get the object this script is attached to human = contr.owner # set the movement speed speed = human['Speed'] # Get sensor named Mouse keyboard = contr.sensors['All_Keys'] # Default movement speed move_speed = [0.0, 0.0, 0.0] rotation_speed = [0.0, 0.0, 0.0] keylist = keyboard.events for key in keylist: if key[1] == blenderapi.input_active(): if key[0] == blenderapi.IKEY: move_speed[0] = speed elif key[0] == blenderapi.KKEY: move_speed[0] = -speed elif key[0] == blenderapi.JKEY: rotation_speed[2] = speed elif key[0] == blenderapi.LKEY: rotation_speed[2] = -speed elif key[0] == blenderapi.UKEY: move_speed[1] = speed elif key[0] == blenderapi.OKEY: move_speed[1] = -speed # The second parameter of 'applyMovement' determines # a movement with respect to the object's local # coordinate system human.applyMovement( move_speed, True ) human.applyRotation( rotation_speed, True ) """ elif key[1] == blenderapi.input_just_activated(): # Other actions activated with the keyboard # Reset camera to center if key[0] == blenderapi.NKEY and keyboard.positive: reset_view(contr) """
[docs]def head_control(contr): """ Move the target of the head and camera Use the movement of the mouse to determine the rotation for the human head and camera. """ # get the object this script is attached to human = contr.owner scene = blenderapi.scene() target = scene.objects['Head_Empty'] # get the camera on the human head camera = scene.objects['Human_Camera'] # set mouse sensitivity sensitivity = human['Sensitivity'] # Do not move the camera if the current view is using another camera if camera != blenderapi.scene().active_camera: return # Get sensor named Mouse mouse = contr.sensors['Mouse'] if mouse.positive: # get width and height of game window width = blenderapi.render().getWindowWidth() height = blenderapi.render().getWindowHeight() # get mouse movement from function move = mouse_move(human, mouse, width, height) # Amount, direction and sensitivity left_right = move[0] * sensitivity up_down = move[1] * sensitivity target.applyMovement([0.0, left_right, 0.0], True) target.applyMovement([0.0, 0.0, up_down], True) # Reset mouse position to the centre of the screen # Using the '//' operator (floor division) to produce an integer result blenderapi.render().setMousePosition(width//2, height//2)
[docs]def read_pose(contr): """ Test function to access the bone rotation data """ armature = contr.owner logger.info("The armature is: '%s' (%s)" % (armature, type(armature))) for channel in armature.channels: if 'X_' not in channel.name: rotation = channel.joint_rotation logger.info("\tChannel '%s': (%.4f, %.4f, %.4f)" % (channel, rotation[0], rotation[1], rotation[2]))
[docs]def reset_view(contr): """ Make the human model look forward """ human = contr.owner scene = blenderapi.scene() target = scene.objects['Head_Empty'] # Reset the Empty object to its original position target.localPosition = [0.5, 0.0, 1.6]
[docs]def near_object(contr): """ Store the object that is near the hand This script is called from the logic bricks of Hand_Grab.R """ scene = blenderapi.scene() hand_empty = scene.objects['Hand_Grab.R'] near_sensor = hand_empty.sensors['Near'] near_object = near_sensor.hitObject hand_empty['Near_Object'] = near_object #if near_object is not None: #hand_empty.parent.localOrientation = [math.pi/2, 0.0, 0.0] #logger.debug(near_object.name + " can be grasped!")
[docs]def grabbing(contr): """ Mark an object as selected by the user """ scene = blenderapi.scene() human = contr.owner hand_empty = scene.objects['Hand_Grab.R'] #sphere = scene.objects['SelectionSphere'] lmb = human.sensors['LMB'] selected_object = hand_empty['Near_Object'] # Check that a button was pressed if lmb.getButtonStatus(blenderapi.LEFTMOUSE) == blenderapi.input_just_activated: # Check that no other object is being carried if contr.owner['DraggedObject'] is None or contr.owner['DraggedObject'] == '': # If the object is draggable if selected_object is not None and selected_object != '': # Clear the previously selected object, if any contr.owner['DraggedObject'] = selected_object # Remove Physic simulation #selected_object.suspendDynamics() # Parent the selected object to the hand target selected_object.setParent (hand_empty) # Drop the object when the left mouse button is released if lmb.getButtonStatus(blenderapi.LEFTMOUSE) == blenderapi.input_just_released: #if lmb.getButtonStatus(blenderapi.RIGHTMOUSE) == blenderapi.input_just_activated: # Clear the previously selected object, if any if contr.owner['DraggedObject'] is not None and contr.owner['DraggedObject'] != '': previous_object = contr.owner["DraggedObject"] # Remove the parent previous_object.removeParent() # Place the object on the nearest surface #morse.helpers.place_object.do_place(previous_object) # Reset rotation of object previous_object.worldOrientation = [0.0, 0.0, 0.0] # Restore Physics simulation #previous_object.restoreDynamics() #previous_object.setLinearVelocity([0, 0, 0]) #previous_object.setAngularVelocity([0, 0, 0]) # Clear the object from dragged status contr.owner['DraggedObject'] = None
[docs]def mouse_move(human, mouse, width, height): """ Get the movement of the mouse as an X, Y coordinate. """ # distance moved from screen center # Using the '//' operator (floor division) to produce an integer result x = width//2 - mouse.position[0] y = height//2 - mouse.position[1] # intialize mouse so it doesn't jerk first time try: human['mouseInit'] except KeyError: x = 0 y = 0 # bug in Add Property # can't use True. Have to use 1 human['mouseInit'] = 1 # return mouse movement return x, y