Поговорив с Майком еще немного, я определил, что у него есть глубинные проблемы, которые сначала необходимо решить, прежде чем пытаться их решить. Похоже, что он использует устаревший OpenGL (glPush / Pop) и не имеет доступа к рассматриваемым матрицам. Я проинструктировал его изучить современный opengl, а затем вернуться к этой c топи позже.
Однако я обнаружил, что вы действительно можете извлечь поворот из матрицы преобразования RTS. В OpenTK, который он использует, это делается с помощью ExtractRotation () Matrix4, что дает вам четверть. Затем вы используете функцию ToEulerAngles () Quaternion, чтобы получить Vector3, который символизирует вращение в радианах. Последний шаг - преобразовать эти радианы в градусы, используя что-то вроде этого:
/// <summary>
/// Converts radians to degrees.
/// </summary>
/// <param name="radians">The angle in radians.</param>
public static float ToDegrees(float radians)
{
return radians * 57.29578f;
}
/// <summary>
///
/// </summary>
/// <param name="radians"></param>
/// <returns></returns>
public static Vector3 ToDegrees(Vector3 radians)
{
return new Vector3(ToDegrees(radians.X),ToDegrees(radians.Y), ToDegrees(radians.Z));
}
И это даст вам поворот компонентов xy и z. Следует отметить еще раз, что это работает только для RTS Transformations. И, как окончательное мнение, ничего из этого не следует использовать в коде, чувствительном к производительности; вместо этого я бы посоветовал где-нибудь сохранить поворот, чтобы вы могли быстро ссылаться на него вместо того, чтобы пытаться извлечь его, и, если необходимо, синхронизируйте c и создайте матрицу преобразования на слое под ним.