How to use morph targets / key shapes?

I have a rigged model with bones and key shapes (morph targets).
The model in gltf and imported using panda3d-gltf.
I can see the “morph” line using actor.listJoints()
I have tried something like this:

np = actor.control_joint(None, 'modelRoot', '1')

But panda keeps telling: “Actor(warning): Cannot control joint 1”
I even tried to use key shape names instead of index.

As far as I know, you need to call the egg-optchar utility to get access to the node. However it is not entirely clear how to apply this to gltf

No, what you’re doing is correct, no egg-optchar needed. Can you share the file?

Made a simple example for testing:

#!/usr/bin/env python3

import sys

from direct.showbase.ShowBase import ShowBase
from import Actor

class Demo(ShowBase):
    def __init__(self):
        super().__init__() = Actor('cube.glb')

        self.morph =, 'modelRoot', '1')

        self.accept('q', sys.exit)
        self.accept('f3', self.toggleWireframe)

if __name__ == '__main__':
    demo = Demo()

cube.glb (56.7 KB)
cube.blend (795.1 KB)

No CharacterSlider is being created for this morph. Please file this test case as a bug report on the panda3d-gltf project, thanks!

It looks like what’s happening is that panda3d-gltf is expecting the mesh to have default weights assigned, which this one doesn’t.

Actually, this looks like a trivial fix. I just pushed a fix to panda3d-gltf; please try the latest version.

Note that the morph is named “Test” and not “1”, so it should be accessed as “Test”.

It still doesn’t work. I have tried with a morph name (Test) as well.

It works for me with latest Git panda3d-gltf and manipulating “Test”.

Did you touch cube.glb or clear the model-cache after the update?

Nice. It works now. It was cached. Thanks!