質問

私は2Dゲームに取り組んでおり、SDLからOpenGLに切り替えることにしました。私はスプライトをレンダリングし、物理学のためにPymunk(Chipmunk)を使用するためのOpenGLラッパーとしてRabbytを取りました。窓を作成するために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ビューポートと関係のある画面初期化コードで何も発見しませんでした... 2つの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)

ありがとう、ステフェン

役に立ちましたか?

解決

L33tnerdが示唆したように、原点はGltranslatefで中央に配置できる可能性があります...画面の初期化コードの下に以下を追加しました。

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

ありがとう!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top