У меня есть два объекта в трехмерном пространстве (используя OpenGL для рендеринга всего) одного типа класса. Эти объекты хранят смещения xyz и матрицу вращения, представляющую вашу стандартную матрицу вращения 4×4.
Урезанный пример:
class object {
float rotMatrix[16];
float xyzTrans[3];
//a displaylist for drawing the object
}
Я использую GLUI для элементов управления пользовательского интерфейса, что делает хранение преобразований в формате довольно простым.
Эта проблема:
Мне нужно определить «правильную» ориентацию для одного объекта по отношению к другому. Например, если первый объект направлен прямо вниз по оси z, а второй — тот же, но также повернут примерно на 45 градусов вокруг оси x, это будет считаться «правильным», и мои функции будут делать то, что им нужно. , Конечно, это может варьироваться, может быть, это один и тот же z, но повернутый на x и y, или, может быть, даже немного повернутый вокруг каждой оси. Определение «правильных» поворотов будет сохранено в объекте для сравнения.
В идеале я надеюсь сделать что-то вроде:
bool checkRotation(object* first, object* second) {
//do some comparison stuff
if (eachCheck < someTolerance)
return true;
return false;
}
Можно ли это сделать путем сравнения двух вращательных матриц? Нужно ли конвертировать в кватернионы и использовать их?
Этот вопрос это самое близкое, что я нашел к тому, что я спрашиваю, но оно достаточно отличается, чтобы сбить с толку.
Не полный ответ, но слишком длинный для комментария:
Если у вас есть две честные матрицы вращения, то они должны быть обратимыми и определителями 1. Назовите матрицы A
а также B
, Если вы хотите проверить, что изображения A(X)
а также B(X)
из тот же объект X
под двумя поворотами «близко» в том смысле, что вы можете перейти от A(X)
в B(X)
вращением вокруг указанной оси, это эквивалентно проверке, получена ли матрица путем A
раз обратное B
«почти» вращение вокруг этой оси. Так что, возможно, вы хотите на это посмотреть.
Я не слишком знаком с математическими функциями OpenGL, поэтому не могу предоставить код, извините.
Других решений пока нет …