Esate.ru
Страницы: 1
RSS
Проблема работы поверхности Безье в OpenGL
 
Здравствуйте форумчане. У меня проблема с построением поверхности Безье, в частности использования функции Gl.glMap2f. Функция не строит поверхность, если размерность массива подаваемая на вход превышает 32х32. Может кто-нибудь с этим помочь? А то не прикольно строить 16 или 32 поверхности одновременно, слишком ком уж лагает))
Изменено: Hannibal - 15 Января 2015 18:27:19
 
Если отрисовка не прошла, может glGetError возвращает что-либо посл выхова функции?
Там несколько возм ошибок может быть. GL_INVALID_VALUE в том числе, если uorder/vorder большем чем GL_MAX_EVAL_ORDER?

(продублировал сюда из лс =)
information must be free for all
 
Вот еще наткнулся на такой вопрос
http://stackoverflow.com/questions/2705562/opengl-how-to-draw-bezier-curve-of-degree-higher-then-8


Цитата
y any chance are you get a GL_MAX_EVAL_ORDER error? Bezier curves become unstable at high degrees. I wouldn't be surprised if your OpenGL implementation just gave up.You can use glGet with GL_MAX_EVAL_ORDER to see what your implementation maxes at. If you need something higher, you can always roll your own, which isn't too bad.

Возм как раз все таки дело в ограничении GL_MAX_EVAL_ORDER (надо глянуть значение GL_MAX_EVAL_ORDER через glGet() или glGetIntegerv()
information must be free for all
 
А что значит GL_INVALID_VALUE?? В каком случае она возникает??
А если ошибка в Gl.GL_MAX_EVAL_ORDER? Можно ли как то изменить максимальное значение??
Изменено: Павел Карпов - 15 Января 2015 19:09:34
 
glMap2d(
GLenum target,
GLdouble u1,
GLdouble u2,
GLint ustride,
GLint uorder,
GLdouble v1,
GLdouble v2,
GLint vstride,
GLint vorder,
const GLdouble *points
);

часть возм. ошибок для этой функции

GL_INVALID_VALUE - генерируется если u1 равен u2 или v1 равен v2
GL_INVALID_VALUE - генерируется если ustride или vstride меньше, чем число значений в конкретной точке
GL_INVALID_VALUE - генерируется если uorder или vorder меньше 1 или больше, чем значение , возвращаемое GL_MAX_EVAL_ORDER

нужно вызвать glGetError() после вызова glMap2f() и проверить , не вернет ли она GL_INVALID_VALUE.
ну и проверить значение GL_MAX_EVAL_ORDER, возм оно как раз 32.
information must be free for all
 
GL_MAX_EVAL_ORDER по идее оно зашито в реализацию OpenGL. Надо глянуть что возвращается Gl.glGet(Gl.GL_MAX_EVAL_ORDER), если 32, то наверно дальше никак =(
information must be free for all
 
Спасибо большое за ответы. Я проверил, GL_MAX_EVAL_ORDER как раз равно 32((
Ничего, буду склеивать несколько поверхностей вместе))

http://radikal.ru/fp/85d37ad159d64d6ebd9cbcf7267a75ee

Вот здесь 64 склеенных поверхности)) Время построения 4.92 секунды))
 
выглядит круто, а обязательно с помощью Безье было рисовать?
information must be free for all
 
По теме дипломного проекта да)) А так я реализовал и метод полигонального построения той же поверхности.. Для однотонной поверхности время построения отличается от сеточной на много) Уровень детализации такой же как у предыдущей фотки с поверхностью Безье..
Однотонная http://radikal.ru/fp/b6213fb7396c4db88145cdcfa4b73894
Сеточная http://radikal.ru/fp/361c9041719142e9914e015b918eaa6e
Меня еще интересует наложение текстуры. Как наложить текстуру на полигональную и Безье?
 
На полигональную поверхность стандартным методом наложения текстур,(по ссылке используется DevIL)

По поводу Безье не могу сказать. Примерно по теме - красная книга OpenGL, главы 12.1.2, 12.1.3
information must be free for all
 
Просто при построении полигональной модели мне придется накладывать текстуру на каждый полигон отдельно??
Или можно наложить одну текстуру большим размером на все сразу. Хотелось бы реализовать наложение реальной карты из гула или яндекса))
 
Нужно устанавливать текстурные координаты для каждой вершины - тогда можно использовать одну большую текстуру.
В уроках C#/OpenGL - в 13 уроке описывается загрузка трехмерной модели с наложением на нее текстуры, рекомендую по нему пройтись/изучить

Загрузка трехмерной модели с текстурами: часть 1, часть 2, часть 3

ну и 9 глава в красной книге OpenGL по ссылке выше
information must be free for all
 
Код
                for (int i = 0; i < heightMap.Length; i++)
                {
                    Gl.glBegin(Gl.GL_QUADS);                    

                    for (j = 0; j < heightMap[i].coordVertex.Length; j++)
                    {
                        Gl.glColor3f(heightMap[i].coordVertex[j].color.R, heightMap[i].coordVertex[j].color.G, heightMap[i].coordVertex[j].color.B);
                        Gl.glVertex3i(heightMap[i].coordVertex[j].X, heightMap[i].coordVertex[j].Y, heightMap[i].coordVertex[j].Z);
                    }

                    Gl.glEnd();
                }
Вот это мой код. Т.е мне необходимо сделать такой код??
Код
                for (int i = 0; i < heightMap.Length; i++)
                {
                    Gl.glBegin(Gl.GL_QUADS);                    

                    for (j = 0; j < heightMap[i].coordVertex.Length; j++)
                    {
                        Gl.glColor3f(heightMap[i].coordVertex[j].color.R, heightMap[i].coordVertex[j].color.G, heightMap[i].coordVertex[j].color.B);
                        Gl.glVertex3i(heightMap[i].coordVertex[j].X, heightMap[i].coordVertex[j].Y, heightMap[i].coordVertex[j].Z);
                        Gl.glTexCoord2i(heightMap[i].coordVertexTex[j].X, heightMap[i].coordVertexTex[j].Y);
                    }

                    Gl.glEnd();
                }

Где для карты 1024х1024 точки необходимо присваивать позиционный номер относительно точки??
 
glColor3f не потребуется, glTexCoord2i идет перед установкой вершины.
Ознакомитесь с главами 12 и 13 из уроков и 9 разделом красной книги и все вопросы исчезнут :good:

P.S. на будущее еще будет полезно обратить внимание на glVertexPointer (работает быстрее, чем вызовы каждой вершины по отдельности) и дисплейные списки (они используются в главе 13) для оптимизации производительности.:good:
Изменено: admin - 16 Января 2015 11:52:03 (поправил номера глав =))
information must be free for all
 
Это я для примера скинул. Меня интересует другое. У меня вершины полигона задаются
Код
Gl.glVertex3i(i, j, Z[i*1024+j]);
То при задании текстуры мне нужно такие же координаты передавать??
Код
Gl.glTexCoord2i(i, j, Z[i*1024+j]);
Изменено: Павел Карпов - 16 Января 2015 11:53:24
 
я как раз об этом и говорил: принцип того, как накладываются вершины описан в этих уроках. просто я не хотел весь огромный текст пересказывать и сослался на уроки. Для простейшего примера - если мы текстурируем квадрат , то простейшее наложение текстуры будет {0,0} {0,1} {1,1} {1,0}. т.е. мы обошли все вершины текстуры по кругу (см урок 12). Текстура может содержать и множество небольших кусков, которые накладываются на отдельные полигоны - это уже отдельные дробные координаты. Пример в уроке 13 ну и в красной книге.

Просто там огромное описание всего этого процесса - я не могу уместить ответ в 2х предложениях.
glTexCoord2i принимает 2 координаты - x,y на плоской текстуре. представьте, что вы смотрите на вашу поверхность сверху, т.е. оси Z нет. вот в таком соотв. и надо накладывать координаты.
information must be free for all
 
f = 1.0f/(float)heightMap[i].coordVertex.Length; // считаем что по x и y одинаковое кол-во вершин

Gl.glTexCoord2f(i * f, j * f);

примерно так :)
information must be free for all
 
Снова я:D Разобрался с текстурированием полигональной поверхности:yahoo: Вот что получилось
без текстуры
http://radikal.ru/fp/56089577ef2d40d09921292d644fa01c
с текстурой
http://radikal.ru/fp/3c5b6fba230e4d489499733fca180e18
Осталось разобраться с поверхностью Безье..там вообще печалька:!:
До разобрался с по-тью Безье. Только печалька, наложение текстуры происходит неправильно. Например если строиться 4 поверхности, то нельзя растянуть 1 текстуры на их всех. Она накладывается на каждую в отдельности, т.е. получается 4 одинаковые картинки:evil:
Изменено: Павел Карпов - 16 Января 2015 21:22:02
 
Цитата
До разобрался с по-тью Безье. Только печалька, наложение текстуры происходит неправильно. Например если строиться 4 поверхности, то нельзя растянуть 1 текстуры на их всех. Она накладывается на каждую в отдельности, т.е. получается 4 одинаковые картинки

в таком случае надо 1/4 текстуры на каждую из 4 поверхностей по идее (причем нужную часть для кадой поверхности)

если текстура это квадрат размером 1х1, оси x,y направлены классически

{0,0}{0,0.5}{0.5,0.5}{0.5,0} - левая нижняя часть текстуры (1/4)
{0.5,0}{1,0}{1,0.5}{0.5,0.5} - правая нижняя часть текстуры
{0,0.5}{0.5,0.5}{0.5,1}{0,1} - левая верхняя
{0.5,0.5}{0.5,1}{1,1}{0.5,1} - правая верхняя

типо того.. =)

или как вариант 4 текстуры разные =)
 
Спасибо большое Anvi:good: Помогло, построилось, правда теперь нужно разобраться с правильным расположением наложенных текстур, а то каждую развернуло на 90 градусов)
 
Народ. Подскажите мне необразованному. При изменении угла наблюдения обязательно заново проводить прорисовку поверхности??
 
ну вообще-то да, положение наблюдателя изменилось. обычно не менее 30 раз в секунду перерисовывают. (30fps)
но можно один раз отрисовать поверхность в дисплейный список и дергать его, меня положение камеры. про них говорилось выше в ветке, работает значительно быстрее
Страницы: 1
Читают тему (гостей: 1)

Регистрация

Регистрируясь, вы принимаете правила сайта. Если вы не получили код подтв. регистрации - не забудьте проверить папку спам.
Логин*
Email*
Пароль*
Подтверждение пароля*
 
Логин*
Код*
 

Восстановление пароля

Пожалуйста, заполните поля, после чего вы получите код подтверждения на ваш E-mail. Если код не пришел в течении нескольких минут - проверьте папку спам.
Логин

или Email
 
Логин*
Код подтверждения*
Новый пароль*
Подтверждение пароля*
 

Авторизация

Пожалуйста, авторизуйтесь, для входа на сайт с помощью соц. сети:
  • Используйте вашу учетную запись на Facebook.com для входа на сайт.
  • Используйте вашу учетную запись VKontakte для входа на сайт.
  • Используйте вашу учетную запись Google для входа на сайт.

или с помощью аккаунта на сайте:

Логин
Пароль