Animation Channels and Targets in the Collada Framework

Hey,

I’m trying to use the open collada framework to read a simple animation file (.dae) exported from Maya. I see that an <animation> xml element will contain a number of <source> elements, a <sampler> element, and a <channel> element.

I have animated a single translation component on a joint node, and all the data looks correct in the .dae file.

Now I try to use the COLLADAFramework library to read this information from file. I implement the IWriter interface, and I can observe all the input and output data for my animation data when I implement COLLADAFW::IWriter::writeAnimation().

However I get stuck when I try to obtain the target for this animation. In my simple case, I have a <channel> element in my .dae file that looks like:

<channel source="#top.translate_top_top.translateZ_top-sampler" target="top/translate.Z"/>

But it is not obvious how to obtain the target “top/translate.Z” from the framework’s COLLADAFW::AnimationCurve class.

Can someone point me in the right direction? It feels like I’ve missed something. Thanks!

Hello,

in OpenCOLLADA the connection between the animation and the animated value works different than in COLLADA itself.
Each value that can be animated is derived from Animatable. Using a UniqueId, Animatable references an AnimationList which contains the bindings between the animatable value and the animation.

For an example of how to deal with animations see the COLLADAMaxAnimation*.cpp files that are part of the OpenCOLLADA for 3ds Max plug-in.

Hey, thanks for the info. I’ve had a look at the Animatable usage in the COLLADAMaxAnimation*.cpp files.

What I think I should be doing is going through all the joint nodes in my visual scene, examining each of the Transformation objects in each node’s transformation array, and through the Animatable object, acquiring any valid references to an AnimationList.

I’m still using the example I outlined previously, so I expected to find that the joint “top” would contain a Transformation::Translation object (which is derived from Animatable) that has a valid reference to an AnimationList. This was not the case, I can’t find any valid AnimationList references in any Transformation objects.

Even more suspiciously, I don’t receive a call to my implementation of IWriter::writeAnimationList(), which makes me think I don’t have any AnimationLists, and hence no bindings.

The dae file comes from Maya, is it possible that the conversion has a problem? It does animate correctly in Maya.

Did you verify that there really is an animation in the COLLADA file? Probably it got lost during export from Maya.

Could you provide the COLLADA file?

I can’t upload the COLLADA file unfortunately, so I’ve PM’d you the contents.

I’ve looked closer at my input collada .dae file, and the issue here does seem to be based on the maya collada exporter. I was first alerted to this when i noticed the collada test asset (seymour, the space boy animation) converts correctly with my program.

It seems that the converter outputs my animation with the target “top/translate.Z”, as I first posted:

<channel source="#top.translate_top_top.translateZ_top-sampler" target="top/translate.Z"/>

But in the visual-scene part of the collada .dae file, the joint node doesn’t have the id ‘top’:

<node id="base_top" name="top" sid="base_top" type="JOINT">

I can only assume that the converter combines the path to form an id for animated joint nodes (since the non-animated joints i’ve seen have an id that is identical to the name). If I modify the visual scene so that the joint node has id “top” instead of “base_top”, then my program works!

I’m using the maya plugin published by OpenCollada at Google Code Archive - Long-term storage for Google Code Project Hosting., the current version is OpenCOLLADA_Maya_1.3.0_x86.msi.

I should report this, can anyone tell me how/where i log issues? It would also be interesting to know if anyone else has experienced this issue.