Матрица вращения для вектора направления

StackOverflow https://stackoverflow.com/questions/216294

  •  03-07-2019
  •  | 
  •  

Вопрос

Некоторое время я играл с некоторыми алгоритмами в интернете, и я не могу заставить их работать, поэтому я задаю этот вопрос здесь;

Я пытаюсь визуализировать линию вектора скорости из точки. Рисование линии не сложно: просто вставьте линию с длиной 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'?

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

Также твой голос звучит грубо, учитывая, что ты просишь незнакомцев тратить свое время на помощь тебе.

Другие советы

Это следует сделать вам

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top