C ++ Вращение вектора в 3-х измерениях (точка) в другое пространство объектов - PullRequest
1 голос
/ 18 января 2011

Я работал над алгоритмами обнаружения столкновений для алгоритма OBB, и я дошел до того, что он работает, но я нахожу строки, эквивалентные в рамке, действительно неэффективным способом с помощью некоторого взломанного кода (используя Ogre3dузлов), но мне бы очень хотелось, чтобы это было как можно проще с некоторыми небольшими алгоритмами.

В основном у меня есть 2 очка и прямоугольник (для простоты можно использовать 1-точечное решение для каждого), и этидве точки составляют линию.Коробку можно вращать так, как она хочет, поэтому мне нужно повернуть коробку так, чтобы она была выровнена по оси.Для этого мне также нужно повернуть точки на одно и то же пространство по оси.Я смог сделать это, когда работал в двух измерениях, но у меня возникли проблемы с поиском решения с помощью 3D.

Я понимаю концепцию, легко иллюстрируемую, когда я думал о том, как воткнуть карандаш в глиняную коробку, а затем повернуть ее,быть выровненным по оси, а затем выполнять расчеты по выравниванию по оси, делая это намного проще, но код, заставляющий вращать линии, доставляет мне проблемы.Любая помощь будет оценена :)

1 Ответ

0 голосов
/ 18 января 2011

Если у вас есть прямоугольник в 3D, вы можете думать о нем, как о сгенерированном тремя единичными векторами a, b и c, каждый из которых существует в 3-пространстве вместе с некоторой начальной точкой O. В качестве шага предварительной обработкидавайте начнем с предположения, что O является источником, и, следовательно, что у вас есть точки в блоке, определяются двумя векторами u = (x0, y0, z0) и v = (x1, y1, z1).Вопрос, на который вы теперь хотите ответить, - предположим, что мы применили преобразование вращения, чтобы повернуть прямоугольник так, чтобы a, b и c были выровнены по осям x, y и z соответственно, что бы точкиты и v будешь?

Я могу ошибаться, но думаю, что это можно сделать с помощью простой математики.Вы можете начать с размышления о преобразовании, которое вы сделаете, чтобы перейти от нормального канонического основания к основанию, определенному векторами вашего блока.Эта матрица задается как

      | | | 
M = ( a b c )
      | | | 

То есть матрица, столбцы которой a, b и c.

Теперь, когда у нас есть матрица M, мы можем думать о матрице, котораяинвертирует это преобразование (т.е. отображает единичные векторы a, b и c в выровненные по оси единичные векторы) как обратное к M, M -1 .Однако, если вы выбрали векторы a, b и c, определяющие ограничивающий прямоугольник как ортонормированный (что, если предположить, что векторы ортогональны, вы можете сделать, нормализуя их), то M -1 = M T , транспонирование M, которое задается как

        - a -
M^T = ( - b - )
        - c -

То есть матрица, первая строка которой a, вторая строка b, а третья строкас.Учитывая эти векторы, вы можете выяснить, где будут точки u и v, если повернуть прямоугольник как M T u и M T v, оба из которых являются выражениями, которые не должныслишком сложно вычислить.

Надеюсь, это поможет!

...