It did occur to me that it might be using radians, but seeing as the internal axisangletoquat function

gave me the correct result with the input in degrees, and there does not appear to be any degrees-radians conversion going on, I did not even think to double check.

Turns out it does though. I am an idiot.

But then what happens when I pass it to the output port? Does it automatically convert everything to degrees instead? (Edit3: it does. The more you know ☆彡)

Edit:

Dug up crotationf's private AxisAngletoQuat function and recreated it in ICE. It works perfectly fine. I am now even more confused.

The code is correct, but is somehow fetching the wrong axis-angle numbers? As far as I can tell it's using the very same numbers as crotationf::GetAxisAngle uses and returns, so that shouldn't be possible.

Given the specified angle-axis input the math in this function does return the correct quat (WXYZ <0.793353, 0.430459, 0.000000, 0.430459>), but setRepresentation and getQuarternion are returning something else (WXYZ: 0.968688,-0.154892,-0.116874,-0.154892)

Code: Select all

```
SICPPSDK_INLINE void CRotationf::AxisAngleToQuat( const CVector3f& in_vctAxis, const float in_fAngle, CQuaternionf& out_quat)
{
float fCos, fSin;
CVector3f vct(in_vctAxis);
fCos = cos( in_fAngle * 0.5f );
fSin = sin( in_fAngle * 0.5f );
vct.SetLength( fSin );
out_quat.Set( fCos, vct.GetX(), vct.GetY(), vct.GetZ() );
}
```

___________

After prototyping everything in ICE I sat down to recreate a custom ice node that does a lot of rotation math.

Alas, rotationf is not behaving as one (I) would expect, and I am evidently not even managing to declare them correctly.

Code: Select all

```
MATH::CRotationf rot;
rot.Set(MATH::CVector3f(0.7071,0.0,0.7071),75); //Set from axis-angle rotation
```

Code: Select all

```
Application().LogMessage("Rot converted to quat: "+CString(rot.GetQuaternion()));
Rot converted to quat: WXYZ: 0.968688,-0.154892,-0.116874,-0.154892
```

Further, if I fetch the axis-angle after changing the representation to euler I end up with

Code: Select all

```
rot.SetRepresentation(MATH::CRotationf::siEulerRot);
rotVector = rot.GetAxisAngle(rotAngle);
Application().LogMessage("rot axis/angle output: "+CString(rotVector)+", "+CString(rotAngle));
-0.623862,-0.470737,-0.623862, 0.501808
```

Code: Select all

```
rot.SetRepresentation(MATH::CRotationf::siQuaternionRot);
rotVector = rot.GetAxisAngle(rotAngle);
Application().LogMessage("rot axis/angle output: "+CString(rotVector)+", "+CString(rotAngle));
-0.707107,-0,-0.707107, 0.398223
```

Both different from the 0.7071, 0.0, 0.7071, 75 input, but consistent after the first conversion (changing back to axis-angle afterwards does not affect the result).

As I have understood it, I were to change the rotation representation it should still be representing the same rotation, and thus the axis-angle representation should remain unchanged.

Evidently I have no idea what I am doing. Any pointers?