Угол, в какую сторону повернуть
Для игры я пытаюсь вычислить угол между тем, куда я смотрю, и положением другого объекта на сцене. Я получил угол, используя следующий код:
Vec3 out_sub;
Math.Subtract(pEnt->vOrigin, pLocalEnt->vOrigin, out_sub);
float angle = Math.DotProductAcos(out_sub, vec3LookAt);
Этот код дает мне угол между тем, где я смотрю, и объектом на сцене. Но есть небольшая проблема.
Когда я смотрю не непосредственно на объект, а немного левее, он говорит, что мне нужно повернуть на 10 градусов, чтобы смотреть прямо на объект. Что совершенно правильно.
Но когда я смотрю немного вправо от объекта, он также говорит, что мне нужно повернуть на 10 градусов, чтобы смотреть прямо на объект.
Проблема здесь в том, что я не могу сказать, в какую сторону повернуть. Я знаю только его 10 градусов. Но нужно ли поворачивать влево или вправо? Вот что мне нужно выяснить.
Как я могу понять это?
2 ответа
Я чувствую необходимость уточнить ответ Игнасио...
В общем, ваш вопрос не обоснован, поскольку "повернуть налево" и "повернуть направо" имеют значение только после того, как вы решите, какой путь "вверх".
Перекрестное произведение двух векторов - это вектор, который говорит вам, какой путь "вверх". То есть, A x B
это "вверх", который вы должны использовать, если вы хотите повернуть налево, чтобы получить от A
в B
, (А величина перекрестного произведения говорит вам, как далеко вы должны повернуть, более или менее...)
Для трехмерных векторов перекрестное произведение имеет аз-компоненту x1 * y2 - y1 * x2
, Если сами векторы являются двумерными (т. Е. Имеют нулевые z-компоненты), то это единственное, что вам нужно вычислить, чтобы получить перекрестное произведение; компоненты x и y перекрестного произведения равны нулю. Так что в 2D, если это число положительное, то "вверх" - это положительное направление z, и вам нужно повернуть налево. Если это число отрицательно, то "вверх" - это отрицательное направление z, и вы должны повернуть налево, когда вверх ногами; то есть поверните направо.
Вам также необходимо выполнить перекрестное произведение на векторы. Затем вы можете получить направление вращения по направлению результирующего вектора.