кватернион в угол - PullRequest
       13

кватернион в угол

2 голосов
/ 14 декабря 2010

Хорошо, вот как я это делаю:

float xrot = 0;
float yrot = 0;
float zrot = 0;

Quaternion q = new Quaternion().fromRotationMatrix(player.model.getRotation());
if (q.getW() > 1) {
    q.normalizeLocal();
}

float angle = (float) (2 * Math.acos(q.getW()));
double s = Math.sqrt(1-q.getW()*q.getW());

// test to avoid divide by zero, s is always positive due to sqrt
// if s close to zero then direction of axis not important
if (s < 0.001) {
    // if it is important that axis is normalised then replace with x=1; y=z=0;
    xrot = q.getXf(); 
    yrot = q.getYf();
    zrot = q.getZf();
    // z = q.getZ();
} else {
    xrot = (float) (q.getXf() / s); // normalise axis
    yrot = (float) (q.getYf() / s);
    zrot = (float) (q.getZf() / s);
}

Но, кажется, это не работает, когда я пытаюсь использовать его:

player.model.addTranslation(xrot * player.speed, 0, zrot * player.speed);

AddTranslationтребуется 3 числа, чтобы переместить мою модель на большее количество пробелов (x, y, z), но тогда я даю ей числа выше, которые не перемещают модель в направлении ее вращения (в плоскости XZ)

Почему это не работает?

Редактировать: новый код, хотя сейчас около 45 градусов.

Vector3 move = new Vector3();
move = player.model.getRotation().applyPost(new Vector3(1,0,0), move);
move.multiplyLocal(-player.speed);
player.model.addTranslation(move);

1 Ответ

1 голос
/ 14 декабря 2010

xrot, yrot и zrot определяют ось вращения, заданную кватернионом.Я не думаю, что вы хотите использовать их в вашем addTranslation() вызове ... в общем, это не имеет никакого отношения к направлению движения.

Что я имею в виду под этим:Ваш трехмерный объект - скажем, ради аргумента, что это самолет - будет иметь определенное предпочтительное направление движения в своей исходной системе координат.Поэтому, если исходная ориентация имеет центр масс в начале координат и пропеллер где-то вдоль оси + X, плоскость хочет лететь в направлении + X.

Теперь вы вводите некоторое преобразование координат, которое вращаетСамолет в другую ориентацию.Это вращение описывается матрицей вращения или, что то же самое, кватернионом.В каком направлении самолет хочет двигаться после поворота?

Вы можете найти это, взяв единичный вектор в направлении + X: (1,0, 0,0, 0,0), затем применив к этому вектору матрицу вращения или кватернион, чтобы преобразовать его в новую систему координат.(Затем масштабируйте его по скорости, как вы делали выше.) Компоненты X, Y и Z преобразованного масштабированного вектора дают желаемое добавочное движение по каждой оси.Этот преобразованный вектор обычно , а не будет осью вращения кватерниона, и я думаю, что это, вероятно, ваша проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...