OK, so you do have animation data. For some reason it’s just not playing on your model. There are a couple of possibilities.
(1) Maybe the joint hierarchy doesn’t match exactly between your animation egg file and your model egg file. This shouldn’t happen when the animation comes from the same Max file as the model, but weirder converter bugs have happened.
(2) Maybe the joint hierarchy does match exactly, but the root name doesn’t match. Panda uses the root name to determine whether the animation is intended to be applied to a given model. Again, this shouldn’t be different if they came from the same Max file, but whatever. However, the Actor interface ignores the root name; presently, only the pview interface respects it; so if you are not able to see the animation using the Actor interface, it’s probably not this problem.
You can test both of these with a command like this:
egg-optchar -lsv panda-model.egg panda-walk4.egg
This will report a list of joints found in the model and animation files. With each joint, it may list either “(static)” meaning no animation was found for the joint, and/or “(empty)” meaning no vertices were found for the joint. You should see a number of joints that have neither flag given; these are animated joints that do contain vertices.
Also, keep an eye out for error messages when binding the animation. You might even turn on verbose character debugging output, by putting the following line in your Config.prc file:
notify-level-chan debug
With this line in place, you should see output something like this when you create your Actor and play your animation for the first time:
>>> a = Actor('panda-model.egg', {'walk' : 'panda-walk4.egg'})
:egg2pg: Reading /e/player/models/panda-model.egg
:gobj: Loading texture /e/player/models/maps/panda-model.jpg
:egg2pg: Flattened 1 nodes.
:chan(debug): Found 0 anims:
:chan(debug): Found 1 parts:
panda_walk_character
>>> a.loop('walk')
:egg2pg: Reading /e/player/models/panda-walk4.egg
:egg2pg: Flattened 2 nodes.
:chan(debug): binding Dummy_hips to AnimChannelMatrixXfmTable Dummy_hips
:chan(debug): binding Bone_lr_leg_hip to AnimChannelMatrixXfmTable Bone_lr_leg_hip
:chan(debug): binding Bone_lr_leg_upper to AnimChannelMatrixXfmTable Bone_lr_leg_upper
:chan(debug): binding Bone_lr_leg_lower to AnimChannelMatrixXfmTable Bone_lr_leg_lower
:chan(debug): binding Bone_lr_foot to AnimChannelMatrixXfmTable Bone_lr_foot
:chan(debug): binding Bone_lr_foot_nub to AnimChannelMatrixXfmTable Bone_lr_foot_nub
:chan(debug): binding Bone_rr_leg_hip to AnimChannelMatrixXfmTable Bone_rr_leg_hip
:chan(debug): binding Bone_rr_leg_upper to AnimChannelMatrixXfmTable Bone_rr_leg_upper
:chan(debug): binding Bone_rr_leg_lower to AnimChannelMatrixXfmTable Bone_rr_leg_lower
:chan(debug): binding Bone_rr_foot to AnimChannelMatrixXfmTable Bone_rr_foot
:chan(debug): binding Bone_rr_foot_nub to AnimChannelMatrixXfmTable Bone_rr_foot_nub
:chan(debug): binding Bone_spine01 to AnimChannelMatrixXfmTable Bone_spine01
:chan(debug): binding Bone_spine02 to AnimChannelMatrixXfmTable Bone_spine02
:chan(debug): binding Bone_spine03 to AnimChannelMatrixXfmTable Bone_spine03
:chan(debug): binding Bone_spine_nub to AnimChannelMatrixXfmTable Bone_spine_nub
:chan(debug): binding Dummy_lf_foot_heel to AnimChannelMatrixXfmTable Dummy_lf_foot_heel
:chan(debug): binding Dummy_lf_foot_toe to AnimChannelMatrixXfmTable Dummy_lf_foot_toe
:chan(debug): binding Dummy_lr_foot_heel to AnimChannelMatrixXfmTable Dummy_lr_foot_heel
:chan(debug): binding Dummy_lr_foot_toe to AnimChannelMatrixXfmTable Dummy_lr_foot_toe
:chan(debug): binding Dummy_rf_foot_heel to AnimChannelMatrixXfmTable Dummy_rf_foot_heel
:chan(debug): binding Dummy_rf_foot_toe to AnimChannelMatrixXfmTable Dummy_rf_foot_toe
:chan(debug): binding Dummy_rr_foot_heel to AnimChannelMatrixXfmTable Dummy_rr_foot_heel
:chan(debug): binding Dummy_rr_foot_toe to AnimChannelMatrixXfmTable Dummy_rr_foot_toe
:chan(debug): binding Dummy_shoulders to AnimChannelMatrixXfmTable Dummy_shoulders
:chan(debug): binding Bone_lf_clavicle to AnimChannelMatrixXfmTable Bone_lf_clavicle
:chan(debug): binding Bone_lf_leg_upper to AnimChannelMatrixXfmTable Bone_lf_leg_upper
:chan(debug): binding Bone_lf_leg_lower to AnimChannelMatrixXfmTable Bone_lf_leg_lower
:chan(debug): binding Bone_lf_foot to AnimChannelMatrixXfmTable Bone_lf_foot
:chan(debug): binding Bone_lf_foot_nub to AnimChannelMatrixXfmTable Bone_lf_foot_nub
:chan(debug): binding Bone_neck to AnimChannelMatrixXfmTable Bone_neck
:chan(debug): binding Bone_jaw01 to AnimChannelMatrixXfmTable Bone_jaw01
:chan(debug): binding Bone_jaw02 to AnimChannelMatrixXfmTable Bone_jaw02
:chan(debug): binding Bone_jaw03 to AnimChannelMatrixXfmTable Bone_jaw03
:chan(debug): binding Bone_jaw_nub to AnimChannelMatrixXfmTable Bone_jaw_nub
:chan(debug): binding Bone_skull to AnimChannelMatrixXfmTable Bone_skull
:chan(debug): binding Bone_skull_nub to AnimChannelMatrixXfmTable Bone_skull_nub
:chan(debug): binding Dummy_jaw to AnimChannelMatrixXfmTable Dummy_jaw
:chan(debug): binding Bone_rf_clavicle to AnimChannelMatrixXfmTable Bone_rf_clavicle
:chan(debug): binding Bone_rf_leg_upper to AnimChannelMatrixXfmTable Bone_rf_leg_upper
:chan(debug): binding Bone_rf_leg_lower to AnimChannelMatrixXfmTable Bone_rf_leg_lower
:chan(debug): binding Bone_rf_foot to AnimChannelMatrixXfmTable Bone_rf_foot
:chan(debug): binding Bone_rf_foot_nub to AnimChannelMatrixXfmTable Bone_rf_foot_nub
>>>
All the “binding” messages mean that Panda has associated the animation data with its corresponding skeleton joint. You should see one of these lines for each joint in your model.
David