Как получить прогнозируемый угол от кватерниона по определенной оси? - PullRequest
1 голос
/ 06 февраля 2012

Я использую кватернионы в моей игре для вычисления некоторых базовых углов.

Теперь я пытаюсь получить угол кватерниона по определенной оси.Итак, дан кватернион и новая ось.Могу ли я вернуть спроецированный угол назад?

Мне кажется, это хороший способ рассчитать угол между двумя векторами со знаком.Код написан на Unity3D C #, но это не обязательно так.Это более общий метод.

public static float DirectionalAngle(Vector3 from, Vector3 to, Vector3 up)
{
    // project the vectors on the plane with up as a normal
    Vector3 f = Vector3.Exclude(up, from);
    Vector3 t = Vector3.Exclude(up, to);

    // creates an angle-axis rotation
    Quaternion q = Quaternion.FromToRotation(f, t);

    // do something to get the angle out of the quaternion,
    // given the new axis.
    // TODO: Make this method. Doesn't exist.
    Quaternion q2 = Quaternion.GetAngleFromAxis(q, Vector3.right);

    return q2.Angle(q2);
}

Я всегда могу получить угол и ось от кватерниона, а также x, y, z, w и углы Эйлера.Но я не вижу способа получить спроецированный угол от кватерниона на оси.

1 Ответ

1 голос
/ 07 февраля 2012

Я нашел это! Единственное, что мне нужно было сделать - это повернуть кватернион таким образом, чтобы он был ориентирован в локальном пространстве. Похоже, этот метод подходит для всех самолетов, на которых я его тестировал.

public static float DirectionalAngle(Vector3 from, Vector3 to, Vector3 up)
{
    // project the vectors on the plane with up as a normal
    Vector3 f = Vector3.Exclude(up, from);
    Vector3 t = Vector3.Exclude(up, to);

    // rotate the vectors into y-up coordinates
    Quaternion toZ = Quaternion.FromToRotation(up, Vector3.up);
    f = toZ * f;
    t = toZ * t;

    // calculate the quaternion in between f and t.
    Quaternion fromTo = Quaternion.FromToRotation(f,t);

    // return the eulers.
    return fromTo.eulerAngles.y;
}
...