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




Этот должен сделать вам
Это не работает, так как у меня нет углов; только желаемый вектор направления.
Вы можете определить углы, используя базовый триггер ... SOH CAH TOA Если вы не знаете свой базовый триггер, вам не следует копаться в векторах ...
Я знаю, что могу работать с углами, но это крайне неэффективно. Должно быть возможно вычислить матрицу, используя только перекрестные произведения.
Если вы не можете произнести слово «обезьяна», то вам не следует баловаться английским языком.
The question there involves getting a rotation to a certain axis, whereas I'm concerned with getting a rotation matrix.
Ну и дела, интересно, можешь ли ты повернуть преобразовать одно в другое?
Кстати, ваше текущее решение по выбору произвольной оси Y и последующей реортогонализации должно работать нормально; он выглядит ошибочно или, по крайней мере, плохо написанным. «z_vec» - не лучшее имя переменной для оси ординат. Что вообще с порядком "z, x, y"?
Если это по-прежнему не работает, попробуйте вносить случайные изменения, пока это не произойдет - транспонируйте матрицу, инвертируйте векторы, пока не получите четное количество ошибок знака, и тому подобное.
Кроме того, ваш тон голоса кажется грубым, учитывая, что вы просите незнакомцев потратить свое время, помогая вам.
Вопрос в том, чтобы получить поворот на определенную ось, тогда как меня интересует получение матрицы вращения.
См. Мои комментарии к приведенному выше ответу. Да, я мог бы это сделать, но я бы хотел, чтобы вышеуказанная реализация работала.
Прости за это. Я работал над этим несколько часов, так что сейчас я очень расстроен.
Н.П. Я полагаю, что случайное переворачивание векторов помогло? Должен любить программирование графики ...
Ваш вопрос практически невозможно понять, особенно часть о «половине вектора скорости».