Текстурное отображение изогнутого прямоугольника в OpenGL [python]

У меня возникли проблемы с отображением текстур в OpenGL в python. Я пытаюсь нарисовать прямоугольник, изогнутый сверху и снизу, но пока мне удалось сделать его изогнутым только снизу. Почему-то верх не хочет образовывать изогнутую линию. Я использую эту функцию с параметром 0,2:

def DrawAWobble(y_wobble):
    R = y_wobble/2.0 - 1/(2.0*y_wobble)

    glBegin(GL_POLYGON)
    x = 0.0
    while x<2.1:
        glTexCoord2f(x*0.5, 1.0); glVertex2f(x/2 - 0.5, 0.5 + (R + math.sqrt(R**2 - (1 - x)**2 + 1)))
        x += 0.1

    x = 2.0
    while x>-0.1:
        glTexCoord2f(x*0.5, 0.0); glVertex2f(x/2 - 0.5, -0.5 + (R + math.sqrt(R**2 - (1 - x)**2 + 1)))
        x -= 0.1
    glEnd()

Результат, который я получаю, находится слева, а я должен получить что-то вроде правой части изображения.

введите здесь описание изображения


person jk7800    schedule 23.06.2012    source источник
comment
Не знаю, связано ли это с вашей проблемой, но FYI GL_POLYGON поддерживает только рисование выпуклых многоугольников. Возможно, вы как-то путаете его с вогнутой формой.   -  person Tim    schedule 23.06.2012


Ответы (1)


Тим, комментатор, прав. Проблема в GL_POLYGON. Проблема в том, что графический процессор должен выяснить, как триангулировать ваш произвольный многоугольник, и он делает это таким образом, что ваше отображение не сохраняется. Что вам, вероятно, хотелось бы, так это использовать одну четырехугольную или треугольную полосу для рендеринга этого; вместо того, чтобы работать по краю вашего многоугольника, чередуйте вперед и назад и работайте поперек. Что-то вроде этого (очевидно, не проверено):

def DrawAWobble(y_wobble,step=0.1):
    R = y_wobble/2.0 - 1/(2.0*y_wobble)

    glBegin(GL_QUAD_STRIP)
    x = 0.0
    while x<2.0+0.5*step:
        glTexCoord2f(0.5*x,0.0); glVertex2f(0.5*(x-1), -0.5 + R + (R*R-(1-x)*(1-x)+1)**0.5)
        glTexCoord2f(0.5*x,1.0); glVertex2f(0.5*(x-1),  0.5 + R + (R*R-(1-x)*(1-x)+1)**0.5)
        x += step
    glEnd()
person imallett    schedule 23.06.2012
comment
Вау, спасибо, это работает довольно хорошо. Хотя сама бы до такого не додумалась. ^^ - person jk7800; 23.06.2012
comment
Я рекомендую никогда не использовать GL_POLYGON, потому что способ триангуляции также зависит от реализации. - person imallett; 24.06.2012