6
$\begingroup$

I want to use Blender to make a dynamic character. I want to know if it is possible to make a number of keyframes for facial expressions and then have the ability (using python's game engine) to choose which face I want the current face to morph into?

Ok, so I have been trying to master Python scripting with Blender's Game Engine. I would like to make a basic game where you can tell the face, within the Python Console, what expression to do, running code from the Text Editor. Here is some code I wrote in the text editor after making two keyframes 'Basis' and 'Surprise' in Blender Render:

def Face(Expression):
if Expression == 'basis':
    C.object.data.shape_keys.key_blocks['Basis'].value=0.0 #I believe this should make the animation morph to the Basis as defined in my key frame 
    print('basis')
elif Expression == 'surprise':
    C.boject.data.shape_keys.key_blocks['Surprise'].value=1.0 #Again this is defined in my key frame
    print('surprise')
else:
    print('invalide entry')

When I click Run Script it seems to compile with no errors. When I enter the Python Console and type "Face('basis')" I get the following error:

Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
NameError: name 'Face' is not defined  

Firstly is the game engine capable of making a game where you can change character's facial expressions. Would it be better to manipulate bones in the face rather than morphing between key frames? And, how do I call the function I wrote in the text editor in the Python Console? I also want to know if I called the 'object.shape_key' from C properly from the python code? Very detailed Q I know, thanks for the help guys!

$\endgroup$

1 Answer 1

9
$\begingroup$

There are at least two ways to create and animate facial expressions, not even involving python (although it's possibly to automate this):

  1. Shape Keys - allows you to deform mesh vertices and blend multiple "states" together and also animate
  2. Armature - a skeleton to control the mesh, with strong control over deformation using vertex weights, but also more complicated

I recommend to try out Shape Keys:

  • Start Blender and remove (X) the default cube
  • Add a Monkey (aka Suzanne)
  • Go to Object data tab in Properties Editor
  • Click the plus button + in the Shape Keys panel twice (will create Basis and Key 1)

    Shape Keys Panel with Basis and Key 1 for Monkey mesh
  • Switch Suzanne into Edit Mode (Tab)
  • Deselect all (A) and pick some vertices, e.g. the right eyebrow
  • Enable Proportional Editing if you wish to deform nearby, non-selected vertices as well
  • Move the vertices up a bit (G)
  • Go back to Object Mode (Tab)
  • With Key 1 in the Shape Keys panel selected, move the Value slider to see the transition between the base shape and the keyed shape.
  • Use I over the slider or right-click and pick Insert Keyframe to animate the value and thus the facial expression transition!

    Animated Shape Keys - Suzanne

You can create a Shape Key with Python like:

shapekey = bpy.context.object.shape_key_add(name="Key", from_mix=True)

See the API docs - Object.shape_key_add for details.

The value slider can be animated by inserting a keyframe, here's the most simple way:

# we stored the shape key reference above in the variable "shapekey",
# which should be equal to bpy.context.object.data.shape_keys.key_blocks['Key']
shapekey.value = 0.3 # set value 
shapekey.keyframe_insert(data_path="value", frame=15) # now keyframe 0.3 at frame 15

See the API docs - keyframe_insert()


More on Shape Keys:
http://wiki.blender.org/index.php/Doc:2.6/Manual/Animation/Techs/Shape/Shape_Keys

If you look into Armature pose animations, make sure to have a look at the Pose Library panel!

It's also worth to have a look at the NLA editor (non-linear animation). It allows you to blend multiple Actions together:
http://wiki.blender.org/index.php/Doc:2.6/Manual/Animation/Editors/NLA

$\endgroup$
2
  • $\begingroup$ @CubeBot88 If this is what you want, please consider to mark it as your answer. :) $\endgroup$ Commented Jan 30, 2014 at 2:04
  • $\begingroup$ This thread pretty much answers my question, thanks anyways guys! blenderartists.org/forum/… $\endgroup$
    – CubeBot88
    Commented Mar 3, 2014 at 13:23

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .