На другой вопрос пользователь, который ответил (Рикки) мне, также сказал следующее (что я все еще нахожу немного запутанным):
Когда я говорю, что они должны оставаться
перпендикулярно, я имею в виду, что если вы
вращать векторы независимо друг от друга
одно и то же преобразование снова и снова,
ошибки с плавающей точкой могут закрадываться и
они могут отличаться от
перпендикуляр. Точка (x, y), точка (y, z) и
точка (x, z) должна быть очень близка к нулю.
Если нет, вам нужно сделать кросс
продукты и перпендикулярно их.
Это так же просто, как перезапись
z = крест (х, у), тогда у = крест (z, х).
В моей системе камер есть 3 соответствующих вектора, эти векторы являются числами с плавающей запятой и всегда нормализованы. Опорные векторные точки в направлении, куда смотрит камера, UpVector и RightVector говорят сами за себя.
Любой, кто знает, как ответить, должен ответить, конечно, но Рики, если ты там, пожалуйста, помоги мне ...
1) Что именно означает точка (x, y), точка (y, z) и точка (x, z)? Это произведение точек между этими векторами? Я полагаю ... Но какие (x, y, z) соответствуют моим ссылкам, UpVector и RightVector? Я немного растерялся ...
2) Тогда эти точечные произведения должны быть очень близки к нулю, как именно это проверить? Я видел такой код, чтобы добиться того же в подобном контексте:
const float Math::EPSILON = 1e-6f;
Math::closeEnough(<floating_point_variable_to_check>, 0.0f);
static bool closeEnough(float f1, float f2) {
// Determines whether the two floating-point values f1 and f2 are
// close enough together that they can be considered equal.
return fabsf((f1 - f2) / ((f2 == 0.0f) ? 1.0f : f2)) < EPSILON;
}
Полагаю, это достаточно хорошо?
3) Где мне в точности выполнить все эти проверки и заново перпендикулярно векторам? У меня есть 3 функции, которые вращают камеру, Pitch, Yaw и Roll (последняя, которую я так мало использую), только эти функции изменяют эти единицы измерения. Должен ли я выполнять проверки и исправления каждый раз, когда вызываю одну из этих функций поворота, или это будет слишком много? Где и когда тогда?
4) И последнее, но не менее важное: чтобы исправить их, нужно переписать векторы перекрестным произведением, имеет смысл, поскольку я хочу, чтобы они были перпендикулярны друг другу. Но разве в приведенной выше цитате отсутствует один кросс-продукт? И имеет ли значение порядок, в котором я выполняю эти исправления?