координаты изменились при переходе с pygame+rabbyt на pyglet+rabbyt

Я работаю над 2D-игрой и решил перейти с SDL на OpenGL. Я взял rabbyt в качестве обертки opengl для рендеринга своих спрайтов и использовал pymunk (бурундук) для своей физики. Я использовал pygame для создания окна и rabbyt для рисования спрайтов на экране.

Я обнаружил, что с pygame+rabbyt координата (0,0) находится в середине экрана. Мне понравился этот факт, потому что представление координат в физическом движке было таким же, как и в моем графическом движке (мне не нужно пересчитывать координаты при рендеринге спрайтов).

Затем я переключился на pyglet, потому что хотел рисовать линии с помощью OpenGL — и обнаружил, что внезапно координата (0,0) оказалась в левом нижнем углу экрана.

Я подозревал, что это как-то связано с функцией glViewport, но только rabbyt выполняет эту функцию, а pyglet касается ее только при изменении размера окна.

Как я могу установить координату (0,0) в середине экрана?

Я не очень хорошо знаком с OpenGL и после нескольких часов гугления и проб и ошибок ничего не нашел... Надеюсь, кто-нибудь сможет мне помочь :)

Изменить: дополнительная информация :)

Это мой код инициализации экрана pyglet:

self.window = Window(width=800, height=600)
rabbyt.set_viewport((800,600))
rabbyt.set_default_attribs()

Это мой код инициализации экрана pygame:

display = pygame.display.set_mode((800,600), \
  pygame.OPENGL | pygame.DOUBLEBUF)
rabbyt.set_viewport((800, 600))
rabbyt.set_default_attribs()

Редактировать 2: я просмотрел источники pyglet и pygame и не обнаружил в коде инициализации экрана ничего, что имело бы какое-то отношение к области просмотра OpenGL... Вот источник двух функций кролика:

def set_viewport(viewport, projection=None):
    """
    ``set_viewport(viewport, [projection])``

    Sets how coordinates map to the screen.

    ``viewport`` gives the screen coordinates that will be drawn to.  It
    should be in either the form ``(width, height)`` or
    ``(left, top, right, bottom)``

    ``projection`` gives the sprite coordinates that will be mapped to the
    screen coordinates given by ``viewport``.  It too should be in one of the
    two forms accepted by ``viewport``.  If ``projection`` is not given, it
    will default to the width and height of ``viewport``.  If only the width
    and height are given, ``(0, 0)`` will be the center point.
    """
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    if len(viewport) == 4:
        l, t, r, b = viewport
    else:
        l, t = 0, 0
        r, b = viewport
    for i in (l,t,r,b):
        if i < 0:
            raise ValueError("Viewport values cannot be negative")
    glViewport(l, t, r-l, b-t)

    if projection is not None:
        if len(projection) == 4:
            l, t, r, b = projection
        else:
            w,h = projection
            l, r, t, b = -w/2, w/2, -h/2, h/2
    else:
        w,h = r-l, b-t
        l, r, b, t = -w/2, w/2, -h/2, h/2
    glOrtho(l, r, b, t, -1, 1)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()

def set_default_attribs():
    """
    ``set_default_attribs()``

    Sets a few of the OpenGL attributes that sprites expect.

    Unless you know what you are doing, you should call this at least once
    before rendering any sprites.  (It is called automatically in
    ``rabbyt.init_display()``)
    """
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)
    glEnable(GL_BLEND)
    #glEnable(GL_POLYGON_SMOOTH)

Спасибо, Штеффен.


person stefreak    schedule 25.11.2010    source источник
comment
Попробуйте glTranslate2f(window.width/2, window.height/2) или что-то подобное перед рендерингом; это должно установить начало координат в центре.   -  person li.davidm    schedule 25.11.2010


Ответы (1)


Как предположил l33tnerd, источник можно поместить в центр с помощью glTranslatef... Я добавил следующее ниже моего кода инициализации экрана:

pyglet.gl.glTranslatef(width/2, height/2, 0)

Спасибо!

person stefreak    schedule 25.11.2010