C ++ Вращение вектора в трех измерениях (точка) в пространстве другого объекта

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

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

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


person JeanOTF    schedule 18.01.2011    source источник


Ответы (1)


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

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

      | | | 
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, а третья строка - c. Учитывая эти векторы, вы можете определить, где будут находиться точки u и v, если повернуть прямоугольник как M T u и M T v, оба из которых являются выражениями, которые не должны не будет слишком сложно вычислить.

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

person templatetypedef    schedule 18.01.2011
comment
Довольно сложно :) Мне придется протестировать материал, чтобы на самом деле попытаться получить правильные результаты, потому что это намного сложнее, чем я думал изначально. Спасибо за помощь, определенно толчок в том направлении, в котором мне нужно двигаться. - person JeanOTF; 18.01.2011