LINUX.ORG.RU

[openGL] Как из двумерного изображения построить трехмерную NURBS-поверхность?

 


0

1

Прошу сильно не пинать, но в интернете так ничего найти и не смог. Есть примерно то, что мне нужно (34-й пример nehe). Однако, там строится обычная «угловатая» поверхность, а мне нужно получить сглаженную поверхность.

Т.е. суть такая: нужно загрузить изображение и на его основе построить контрольные точки по равномерной сетке (т.е. уровни интенсивности изображения будут играть роль z-координаты). При этом очень не хочется создавать на основе изображения трехмерную матрицу контрольных точек (т.к. только эта матрица потребует ~60МБ оперативки, а если изображений несколько - получим полный абзац...)

☆☆☆☆☆

В GLU уже есть NURBS. Возьмите ваши точки и передайте туда. Не все, но, допустим, каждую 10-ю.

ilias
()
Ответ на: комментарий от ilias

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

Вот я и думал: может, в GL-ных NURBS'ах есть какие-то вычислители, позволяющие реализовать задуманное мною без костылей...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от ilias

Это не то, там тоже через одно место массив контрольных точек сделано. Хотя очень часто координаты x и y у контрольных точек распределены равномерно, в поверхностях нет разрывов и нет кратных точек.

Если это невозможно реализовать средствами openGL-ного NURBS, придется писать страшнючий велосипед...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Видите ли, не существует универсальных способов преобразования сетки в NURBS.

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

В общем, без знания особенностей поверхности ничего конкретного сказать нельзя.

ilias
()
Ответ на: комментарий от ilias

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

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Ну тогда почитайте педивикию (http://en.wikipedia.org/wiki/Nurbs) по теме и аппроксимируйте вашу поверхность. Расположите контрольные точки числом в 100 раз меньше по каждой из координат так, чтобы поверхность проходила сквозь них. Если исходная поверхность гладкая, то аппроксимация пройдет на ура.

ilias
()
Ответ на: комментарий от ilias

Контрольных точек должно быть ровно столько, сколько пикселей в изображении (т.к. это изображение совершенно не гладкое). Получаем минимум 9000000 контрольных точек...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

> Контрольных точек должно быть ровно столько, сколько пикселей в изображении

Пардон муа, но причем тут тогда NURBS? Просто преобразуйте вашу матрицу в GL Mesh, да и скормите OpenGL.

Суть аппроксимации как раз в том, чтобы выбросить лишние точки и достраивать их на лету по формулам и контрольным точкам. Это такое сжатие с потерями.

ilias
()
Ответ на: комментарий от Eddy_Em

такую поверхность вполне можно рисовать даже за один раз, но без nurbs, естественно (какой еще nurbs при 9000000 точек)

note173 ★★★★★
()
Ответ на: комментарий от note173

Хочется сгладить шумы, а самодеятельностью заниматься не хочется... Но, видимо, придется.

Eddy_Em ☆☆☆☆☆
() автор топика

> Прошу сильно не пинать, но в интернете так ничего найти и не смог.

Вроде материал есть в книге: Френсис Хилл. OpenGL для профессионалов.
Там как раз много страниц про NURBS расписано. Книга ~1000 страниц.

pacify ★★★★★
()
Ответ на: комментарий от Eddy_Em

> Подходят только NURBS или (что реализуется еще хуже) - симплекс-сплайны.

Есть еще бета-сплайны (n-мерные).

pacify ★★★★★
()
Ответ на: комментарий от note173

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

В общем, как говорится, «будем искать»...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от pacify

У меня что-то подобное тоже есть. Толку от нее мало (старая книга).

Eddy_Em ☆☆☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.