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