Можно ли согнуть или деформировать пространство OpenGL через матрицы ModelView или проекции? - PullRequest
2 голосов
/ 04 ноября 2010

Можно ли согнуть или деформировать пространство OpenGL с помощью нестандартных манипуляций с матрицами ModelView или Projection?

Например, команда glScale (scaleFactor, scaleFactor, noScaleFactor) изменяет размеры всех элементов сцены равномерным образом по осям X и Y.

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

Таким образом, масштабирование команды glScale выше будет зависеть от расположения каждого элемента вдоль оси Z:

glScale (функция 1 (расстояние Z), функция 2 (расстояние Z), noScaleFactor)

Ответы [ 4 ]

5 голосов
/ 04 ноября 2010

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

Вот пример вершинного шейдера Fisheye Lens .

0 голосов
/ 05 ноября 2010

OpenGL не имеет понятия «пространство».Вы не можете сказать «я хотел бы, чтобы все между [0, 0, 0] и [10, 10, 0] было синим» или что-то в этом роде.Выборочное масштабирование должно быть выполнено с помощью вашей программы путем преобразования ваших вертов в соответствии с требованиями, прежде чем они вообще попадут в трубу GL.(То есть, получение расстояния, перемещение вершины вдоль нужной оси, а затем нажатие ТО вниз по линии).Это будет означать гораздо больше работы, но если я пойму, какой эффект вы хотите достичь, вы не сможете сделать это с помощью матриц.

0 голосов
/ 04 ноября 2010

Если вы включите перспективу (например, через gluPerspective или glFrustum), вы получите линейное масштабирование в зависимости от расстояния от виртуальной камеры, которое будет по оси Z по умолчанию. В зависимости от расстояния, которое вы установили для положения камеры, ближней и дальней плоскостей, вы можете / будете получать преувеличенную перспективу, похожую на чрезвычайно широкоугольный объектив - но это все равно будет идеально прямолинейный объектив, так что просто Например, линии в прямоугольнике всегда будут оставаться прямыми без искривления, получаемого с помощью объектива «рыбий глаз».

В конечном счете, однако, все, что делается с матрицами, - это линейные преобразования, поэтому вы не получите деформации или изгиба от них. Если вы хотите получить бочкообразное искажение объектива «рыбий глаз», вам нужно будет сделать это иначе, возможно, в шейдере.

0 голосов
/ 04 ноября 2010

Прошло много времени с тех пор, как я играл с open GL, но моя первая реакция на это будет то, что вы должны взглянуть на использование шейдеров openGL для решения этой проблемы.взгляните на этот пост: текст ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...