Определить матрицу преобразования - PullRequest
6 голосов
/ 13 июля 2009

В качестве продолжения моего предыдущего вопроса об определении параметров камеры я сформулировал новую проблему.

У меня есть две картинки одного и того же прямоугольника:

Первое - это изображение без каких-либо преобразований и показывает прямоугольник как есть.

На втором изображении показан прямоугольник после применения трехмерного преобразования (XYZ-вращение, масштабирование, XY-преобразование). Это заставило прямоугольник выглядеть как трапеция.

Я надеюсь, что следующая картина описывает мою проблему:

альтернативный текст http://wilco.menge.nl/application.data/cms/upload/transformation%20matrix.png

Как определить, какие преобразования (точнее, какая матрица преобразований) вызвали это преобразование?

Я знаю расположение углов в пикселях на обоих изображениях, поэтому я также знаю расстояния между углами.

Ответы [ 4 ]

2 голосов
/ 14 июля 2009

Я в замешательстве. Это проблема 2D или 3D?

Насколько я понимаю, у вас есть плоский прямоугольник, встроенный в трехмерное пространство, и вы смотрите на две его двухмерные "картинки" - одну из исходной версии и одну на основе преобразованной версии. Это правильно?

Если это так, значит, для решения проблемы недостаточно информации. Например, предположим, что две картинки выглядят одинаково. Это может быть связано с тем, что перевод является идентичностью, или это может быть потому, что перевод сдвигает прямоугольник вдвое дальше от камеры и удваивает его размер (таким образом, делая его абсолютно одинаковым).

1 голос
/ 14 июля 2009

Это математическая задача, а не программирование ..

вам нужно определить набор уравнений (ваша матрица преобразований, я думаю, это 3 уравнения), а затем решить его для 4 преобразований угловых точек.

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

0 голосов
/ 14 июля 2009

Решение не будет уникальным, как указывает Alex319.

Если второе изображение действительно трапеция, как вы говорите, то это не будет слишком сложно. Это трапеция (не параллелограмм) из-за перспективы, поэтому она должна быть равнобедренной трапецией.

Нарисуйте две диагонали. Они пересекаются в центре прямоугольника, так что позаботится о переводе.

Вращайте трапецию, пока ее параллельные стороны не будут параллельны двум сторонам исходного прямоугольника. (Какие два? Это не имеет значения.)

Проведите третью параллель через центр. Масштабируйте его по сторонам прямоугольника, который вы выбрали.

Теперь для вращения вне плоскости. Измерьте расстояние от центра до одной из параллельных сторон и используйте закон синусов.

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

0 голосов
/ 14 июля 2009

Судя по имеющейся у вас информации, это не так просто. Однако я дам вам несколько идей для игры. Если бы у вас были трехмерные координаты углов, вам было бы легче. Вот основная идея.

  1. Переместить угол к началу координат. После этого будут происходить ротации о происхождении.
  2. Определить векторы осей. Сделайте это, вычтя соседние углы из исходной точки. Это будут локальные оси X и Y для вашего мира.
  3. Определить углы, используя векторы. Вы можете использовать точки и перекрестные произведения, чтобы определить угол между локальной осью x и глобальной осью x (1, 0, 0).
  4. Поворот на угол на шаге 3. Это даст вам новую ось x, которая должна соответствовать глобальной оси x и новой локальной оси y. Затем вы можете определить другое вращение вокруг оси x, которое приведёт ось y в соответствие с глобальной осью y.

Без координат z вы можете видеть, что это будет сложно, но это общий процесс. Надеюсь, это поможет.

...