public void getOrientation(float[] angleAxis) {
    if (angleAxis == null) throw new NullPointerException("angleAxis can not be null");
    if (angleAxis.length < 4) throw new IllegalArgumentException("length must be greater than 3");

    float[] m = new float[16];
    orientation.get(m);

    Vector3 axis = new Vector3(m[6] - m[9], m[8] - m[2], m[1] - m[4]);
    axis.normalize();

    float angle = (float) StrictMath.acos(0.5 * (m[0] + m[5] + m[10] - 1));

    angleAxis[0] = angle;
    angleAxis[1] = axis.x;
    angleAxis[2] = axis.y;
    angleAxis[3] = axis.z;

    // TODO: Handle singularities for angle = 0 and angle = 180 degrees
  }
  public void getCompositeTransform(Transform transform) {
    if (transform == null) throw new NullPointerException("transform can not be null");

    // transform = T R S M

    // Combine translation and rotation (TR)
    float[] m = new float[16];
    orientation.get(m);
    m[3] = translation.x;
    m[7] = translation.y;
    m[11] = translation.z;
    transform.set(m);

    // Apply scale (S)
    transform.postScale(scale.x, scale.y, scale.z);

    // Apply custom (M)
    transform.postMultiply(this.transform);
  }