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