Euler Angles as provided by Florin Herinean

The following is provided as a courtesy to the world by Florin Herinean.

I've (Florin) worked in the past days on an algorithm to get the euler angles (or roll, pitch, yaw) from a Transform3D, which is missing at the moment from the j3d api. Since it seems that i'm finally getting reliable results on it, I want to share my work with you all. The algorithm is adapted on the theoretical paper "Computing Euler angles from a rotation matrix" by Gregory G. Slabaugh - the original one wasn't working due to floating point errors.

Usage:

  TransformAnalyzer ta = new TransformAnalyzer();
  ta.setTransform(<your transform>); //pass in a Transform3D
  ta.analyze();
  Vector3d eulers = ta.getEuler();

Known limitations:
1. doesn't produce euler angles at all if the transform contains shears.
2. in case of reflection transform, the angles are computed relative to the reflected transform around (0, 0, 0).

For those singular cases, the TransformAnalyzer provides the following methods:

- analyze() - throws EulerException if the transform contains shears or the Euler angles could not be computed for whatever reasons.
- isShear() - true if there was an exception due to shears.
- isValidEuler() - true if there is at least one valid set of Euler angles.
- isReflection() - true if the set of Euler angles is relative to the reflection around (0, 0, 0).

EulerException.java

TransformAnalyzer.java