Я совершенно новичок в OpenGL и полностью ржавый на C++. Для школьного задания мне нужно изменить код стартового кода C++, чтобы создать рудиментарную 2D-анимацию.OpenGL: применить гомографическое преобразование к стеку матрицы
Я хотел бы преобразовать единичный квадрат в различные трапеции. Я могу вычислить гомологии, которые достигают этого, но я не могу понять, как применить их к стеку матриц.
Существующий код вида:
// Draw rectangle
glLoadIdentity();
glPushMatrix();
glScalef(HEIGHT, WIDTH, 1.0)
// C++ code to set colour
// C++ code to draw square
glPopMatrix()
рисует прямоугольник, масштабированное по высоте и ширине с выбранным цветом, как и ожидалось.
Один из homographies является:
1.0 0.0 0.0
0.0 9.0/4.0 3.0/4.0
0.0 1.0/12.0 1.0/4.0
Он преобразует точки: (1, 1), (-1, 1), (-1, -1), (1, -1), чтобы (3, 9), (-3, 9), (-6, -9), (6, -9) соответственно.
Я представляю это в столбцах порядка, как:
float homographyBody[9] = {1.0, 0.0, 0.0, 0.0, 9.0/4.0, 1.0/12.0, 0.0, 3.0/4.0, 1.0/4.0}
Однако, подставляя:
glMultMatrixf(homographyBody)
для:
glScalef(HEIGHT, WIDTH, 1.0)
не имеет желаемый эффект.
Никакая комбинация умножения и масштабирования, по-видимому, не может отображать ничего, кроме длинного клина, простирающегося от точки, близкой к началу вверх и вправо.
Я подозреваю, что я просто не осведомлен о какой-то базовой концепции. Любые советы приветствуются.
Спасибо. Да, дополнительная «=» была опечаткой. Моя матрица 3x3 для гомографии находится в стандартной форме, но мой массив с плавающей точкой преобразует ее в порядок столбцов, как указано в OP. Я не могу понять карту с любого из этих заказов на тот, который вы дали для представления 4x4. Не могли бы вы объяснить это сопоставление? – Schemer
@Schemer Я добавил несколько объяснений. –
Большое спасибо за это. Гуглинг для ответа был приключением и половиной, прежде чем я отправился в SO. Я применил вашу расширенную матрицу, и теперь гомография теперь отображается правильно. – Schemer