Матрица вращения для вектора направления
Вопрос
Некоторое время я играл с некоторыми алгоритмами в интернете, и я не могу заставить их работать, поэтому я задаю этот вопрос здесь;
Я пытаюсь визуализировать линию вектора скорости из точки. Рисование линии не сложно: просто вставьте линию с длиной velocity.length
в график. Это помещает линию по центру в точке в направлении оси Y. Нам нужно получить это сейчас в правильном вращении и переводе.
Трансляционный вектор не сложно вычислить: это половина вектора скорости. Ротационная матрица, однако, чрезвычайно неуловима для меня. Учитывая вектор направления <x, y, z>
, какая матрица мне нужна?
Изменить 1: Смотри; если вы не понимаете вопрос, вы, вероятно, не сможете дать мне ответ.
Вот что у меня сейчас есть:
Vector3f translation = new Vector3f(); translation.scale(1f/2f, body.velocity); Vector3f vec_z = (Vector3f) body.velocity.clone(); vec_z.normalize(); Vector3f vec_y; // reference vector, will correct later if (vec_z.x == 0 && vec_z.z == 0) { vec_y = new Vector3f(-vec_z.y, 0f, 0f); // could be optimized } else { vec_y = new Vector3f(0f, 1f, 0f); } Vector3f vec_x = new Vector3f(); vec_x.cross(vec_y, vec_z); vec_z.normalize(); vec_y.cross(vec_x, vec_z); vec_y.normalize(); vec_y.negate(); Matrix3f rotation = new Matrix3f( vec_z.z, vec_z.x, vec_z.y, vec_x.z, vec_x.x, vec_x.y, vec_y.z, vec_y.x, vec_y.y ); arrowTransform3D.set(rotation, translation, 1f);
на основе этой статьи . И да, я попробовал стандартную матрицу вращения (vec_x.x, vec_y.x и т. Д.), И она не сработала. Я вращал столбцы и строки, чтобы увидеть, есть ли эффект.
Изменить 2:
Извиняюсь за грубую формулировку моих комментариев.
Похоже, что произошла комбинация двух ошибок; один из них, на который указал House MD (действительно плохое именование переменных: vec_z
было на самом деле vec_y
и т. д.), а другой - то, что мне нужно было инвертировать матрицу, прежде чем передать ее движку рендеринга (транспонирование было близко!). Итак, модифицированный код:
Vector3f vec_y = (Vector3f) body.velocity.clone(); vec_y.normalize(); Vector3f vec_x; // reference vector, will correct later if (vec_y.x == 0 && vec_y.z == 0) { vec_x = new Vector3f(-vec_y.y, 0f, 0f); // could be optimized } else { vec_x = new Vector3f(0f, 1f, 0f); } Vector3f vec_z = new Vector3f(); vec_z.cross(vec_x, vec_y); vec_z.normalize(); vec_x.cross(vec_z, vec_y); vec_x.normalize(); vec_x.negate(); Matrix3f rotation = new Matrix3f( vec_x.x, vec_x.y, vec_x.z, vec_y.x, vec_y.y, vec_y.z, vec_z.x, vec_z.y, vec_z.z ); rotation.invert();
Решение
Dupe. а> р>
Вопрос здесь заключается в получении поворота на определенной оси, тогда как меня интересует получение матрицы вращения. Ну и дела, интересно, не могли бы вы превратить один из них в другой ? Кстати, ваше текущее решение выбрать произвольную ось y и затем переортогонализовать должно работать нормально; это выглядит ошибочным, или, по крайней мере, плохо написано. « Если это все еще не работает, попробуйте вносить случайные изменения до тех пор, пока это не сработает - транспонируйте матрицу, отменяйте векторы, пока у вас не будет четного числа ошибок знака, такого рода вещи. Также твой голос звучит грубо, учитывая, что ты просишь незнакомцев тратить свое время на помощь тебе.
z_vec
» не является хорошим именем переменной для оси Y. Что с порядком 'z, x, y'?
Другие советы
Это следует сделать вам