Матрица вращения для вектора направления - PullRequest
4 голосов
/ 19 октября 2008

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

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

Ответы [ 2 ]

1 голос
/ 19 октября 2008

Это должно сделать

0 голосов
/ 19 октября 2008

Dupe.

Вопрос заключается в получении поворота на определенной оси, в то время как меня интересует получение матрицы вращения.

Ну и дела, интересно, если бы вы могли превратить конвертировать один в другой ?

Кстати, ваше текущее решение выбрать произвольную ось y и затем переортогонализовать должно работать нормально; это выглядит ошибочным, или, по крайней мере, плохо написано. 'z_vec' не является хорошим именем переменной для оси y. Что с порядком 'z, x, y'?

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

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

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