2
$\begingroup$

I'll explain the steps to reproduce the most simple example to allow to update a shape key value from python within the game engine. This is supposedly only possible through an armature object.

  • start with a new blender file, use the cube that is provided by default
  • add two shape keys, basis and key1
  • select key1 go in edit mode and scale the cube object to half of its size and exit edit mode

Now i got a cube object with shape keys.

  • add an armature
  • shift select armature and the cube object
  • hit ctrl-p and select "Armature deform -> with empty groups" from the context menu
  • select the cube object and select "Value (Key 1)" in "Graph Editor-> Drivers"
  • under "Drivers" properties
  • select "Avaraged Value" for "Type"
  • set "obj/Bone" to "Armature" / "Bone"
  • set "Type" to "X Location"
  • set "Space" to "World Space"

Now if I change the X location of the aramture/bone, the shape key changes its value and is represented in the mesh in the 3d view.

My problem arises if I try update said location from within the game engine. The cube object does not change it's shape when i change the X location of the bone.

I added a new script called "shapes" with the following content:

import bge

controller = bge.logic.getCurrentController()
owner = controller.owner

if not "init" in owner:
    owner["init"] = 1
    controller.activate(controller.actuators["Armature"])

x = bge.logic.getRandomFloat()
owner.channels["Bone"].location = [x,0,0]
print(owner.channels["Bone"].location)

owner.update()
  • select the armature object and switch to "Logic Editor"
  • add an "Always" sensor with activated "True Level Trigger"
  • add a "Python" controller and select the "shapes" script
  • add a "Armature" actuator with "Constraint Type" "Run Armature"
  • now connect those three boxes

The script chooses a random float value and updates the location of the armature accordingly. I can verify that the location is updated by creating a simple object and parenting it under the bone. The simple objects position will follow the position updates of the bone.

The cube object however does not change it's shape. My simple example can be downloaded.

$\endgroup$
  • $\begingroup$ You could also animate the shape key's influence value using an action and play it with an action actuator logic node. $\endgroup$ – stacker Jun 12 '14 at 14:00

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.