Swapping your Y and Z is not sufficient to change your coordinate system.  And if you need to change handedness you have to do other things.  Assuming your handedness is the same, you need to perform a clockwise 90 degree rotation about x.  (or swap y and z and negate one of them.)

For example, if your engine is the same handedness as MAX swap the y and the z and negate the Y.  This works for me as the engine that I'm working on right now has the same handedness as MAX.

swap = -y;
y = z;
z = swap;

As a side note, are you doing the swizzle at run-time?  If so why?  Why not take care of this at export time, then you never have to worry about using MAX's coordinate system to calculate the parent matrices using your coordinate system.

--Pete

-----Original Message-----
Sent: Monday, March 29, 2004 9:53 PM
To: gdalgorithms-list@lists.sourceforge.net
Subject: [Algorithms] Using animation keys from 3DSMax

Apologies if this isn't the right place for this, I've tried a few online forums, including Discreet's Sparks website without much response. Here's my issue.

For the rotations on my animation keys I'm using the quats defined by Max. The only issue that I had to overcome with that was that my engine understands y to be up, whereas Max understands z to be up. This was easily solved by swapping columns 2 & 3 when I converted animation keys into matrices before sending to the skinning routine (thereby swapping the y/z axes -- effectively the animation engine works in "Max's space").

Now that I'm trying to do some simple IK stuff, I'm having problems. Since all of the rotation keys that I use are considered to be in your parent's bone space, I need to calculate the rotation for a bone in Max's z-up quat space. I'm trying to do a simple CCD system, and I thought it would be sufficient to simply swizzle y/z of the axis of rotation when I build my quats, but that doesn't seem to be working -- I'm getting results that look just plain wrong.

Obviously I'm missing something obvious, can somebody help me out here?

Thanks,
Ryan Greene