координаты изменились при переносе из pygame + rabbyt в pyglet + rabbyt - PullRequest
1 голос
/ 25 ноября 2010

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

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

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

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

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

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

Редактировать: Дополнительная информация:)

Это мой код инициализации экрана 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 ... Вот источник двух функций rabbyt: *

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)

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

1 Ответ

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

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

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

Спасибо!

...