2016-10-26 6 views
2

Я хочу прочитать следующие значения из единства кватернионы https://docs.unity3d.com/ScriptReference/Quaternion.htmlRead конкретных значений из кватерниона

Если вращение х (шаг) составляет 180 (в качестве альтернативы 0)

Если у поворота (профилирование) 180 (в качестве альтернативы 0)

Какая наиболее эффективная формула для получения поворота z (рыскания)?

Я нашел эту формулу онлайн, чтобы получить ось z, является ли это наиболее показательным? г = Кв/SQRT (1-QW * QW) http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/

+0

Из любопытства, какой ваш прецедент, где вам нужно определить на тысячу или более углов на каждый кадр? – Serlite

+0

@Serlite 1000 раз за кадр было преувеличением, чтобы способствовать пониманию того, что производительность очень важна. Мне это нужно для определения нестационарного столкновения, где задействован прямоугольный коллайдер. Почему я делаю дополнительную систему поверх Unity's по очень конкретной и сложной причине. – Martin

ответ

0

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

Найдено код онлайн и формы его, чтобы удовлетворить мои потребности, это преобразует только угол г в радианы (1.3 мс 10K итераций)

public double GetZAngle(Quaternion q1) 
{ 
    double sqw = q1.w * (double)q1.w; 
    double sqx = q1.x * (double)q1.x; 
    double sqy = q1.y * (double)q1.y; 
    double sqz = q1.z * (double)q1.z; 
    double unit = sqx + sqy + sqz + sqw; // If normalized is one, otherwise is correction factor 
    double test = (double)q1.x * q1.y + (double)q1.z * q1.w; 
    if (test > 0.499 * unit) // Singularity at north pole 
     return Math.PI/2; 
    if (test < -0.499 * unit) // Singularity at south pole 
     return -Math.PI/2; 
    return Math.Asin(2 * test/unit); 
} 

Там нет четкой картины просто различить, если х и у углы были равны 0, но здесь есть фрагмент кода, показывающий, как извлечь все из них в радианах (2,14 мс 10 Кбайт итераций (быстрее, чем Unity в 3 мс)) http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/

1

Вы не должны использовать сложную формулу для того, чтобы считывать значение из кватернион. Единство уже сделало это для вас!

Самый простой способ читать Эйлера угол из кватернионов как это:

Vector3 angle = rotation.eulerAngles; 

вы можете прочитать каждый поворот легко angle.x, ...

+0

Извините, должно быть, сказал, почему я это делаю. Quaternion.eulerAngles преобразуется за одну длинную операцию, это дорогостоящая операция, когда она выполняется до 1000 раз каждые 1/60 секунды (3 мс для 10000 итераций). Мне просто нужно знать, если оси x и y равны 180 и читают z-угол. Когда вам нужен только один угол, все они преобразуются, что является недостатком оптимизации со стороны Unity, в основном потому, что он не оптимизирован 2D. – Martin

+0

@ Мартин Хо! не знал об этом. Спасибо за вашу точность –

Смежные вопросы