OpenGLで2Dと3Dを混合します(Pygletを使用)
質問
PygletのOpenGLで2Dと3Dをミックスしようとしています。つまり、3Dシーンを描画し、正書法の投影に切り替えて、上に物を描きます。 3Dスタッフを描画し、投影マトリックスをスタックに押し、Glortho投影マトリックスを実行し、2Dスタッフを描画してから、前のマトリックスをスタックからポップします。 3Dのものはうまく描かれていますが、何らかの理由で、2D部品はそれ自体でさえまったく描画していません。これがコードです:
class Window(pyglet.window.Window):
# resolution
width, height = 1024, 786
def __init__(self, width, height):
# initialise window
super(Window, self).__init__(width, height)
# set title
self.set_caption("OpenGL Doss")
# call update() at 30fps
pyglet.clock.schedule_interval(self.update, 1 / 30.0)
glEnable(GL_TEXTURE_2D) # enable textures
glShadeModel(GL_SMOOTH) # smooth shading of polygons
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glDepthFunc(GL_LEQUAL)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) # make stuff look nice
self.world = World() # initialise world
self.label = pyglet.text.Label('Hello, world',
font_name='Times New Roman',
font_size=20,
width=10, height=10)
def on_resize(self, width, height):
print 'on resize'
if height == 0:
height = 1
glViewport(0, 0, width, height) # specify viewport
# load perspective projection matrix
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45, 1.0 * width / height, 0.1, 100.0)
#glLoadIdentity()
def on_draw(self):
self.set3d()
# draw 3d stuff
self.world.draw()
self.set2d()
# draw 2d stuff
self.draw2d()
self.unSet2d()
def update(self, dt):
"called at set interval during runtime"
#maze = self.world.maze
maze_platform = self.world.maze_platform
pacman = maze_platform.maze.pacman
maze_platform.update()
# send it world pointer
pacman.update(self.world)
def on_key_press(self, symbol, modifiers):
control.press(symbol, modifiers)
def on_key_release(self, symbol, modifiers):
control.release(symbol, modifiers)
def set3d(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glEnable(GL_DEPTH_TEST) # enable depth testing
# reset modelview matrix
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def set2d(self):
glDisable(GL_DEPTH_TEST)
# store the projection matrix to restore later
glMatrixMode(GL_PROJECTION)
glPushMatrix()
# load orthographic projection matrix
glLoadIdentity()
#glOrtho(0, float(self.width),0, float(self.height), 0, 1)
far = 8192
glOrtho(-self.width / 2., self.width / 2., -self.height / 2., self.height / 2., 0, far)
# reset modelview
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
#glClear(GL_COLOR_BUFFER_BIT)
def unSet2d(self):
# load back the projection matrix saved before
glMatrixMode(GL_PROJECTION)
glPopMatrix()
def draw2d(self):
z=-6
n=100
glTranslatef(0, 0.0, -z)
glBegin(GL_TRIANGLES)
glVertex3f(0.0, n, 0.0)
glVertex3f(-n, -n, 0)
glVertex3f(n, -n, 0)
glEnd()
def main():
window = Window(Window.width, Window.height)
pyglet.app.run()
print 'framerate:', pyglet.clock.get_fps(), '(error checking = %s)' % pyglet.options['debug_gl']
if __name__ == '__main__': main()
#command = 'main()'
#cProfile.run(command)
解決
各レンダリングでモデルビューと投影行列を完全にリセットし、3Dから2Dに移動するときにプッシュ/ポップを使用しないことをお勧めします。
しかし、私はあなたが悪い座標を使用しているので、シーンがクリッププレーンの外に描かれているのではないかと思います。部分的には、クリッピングプレーンに近いゼロを置くことを少し疑っています。通常、2D要素はz = 0で描画されます。
近くのクリッププレーンを-1に置いてみてください。
また、draw2dでgltranslatef(0、0.0、-z)を呼んでいる理由も少しわかりません。気にしません。
他のヒント
の draw2d()
試す glDisable(GL_TEXTURE_2D)
と glColor3ub(255,255,255)
三角形を描く前に。
必ず再確認してくださいglEnable(GL_TEXTURE_2D)
電話する前に world.draw()
テクスチャのジオメトリを使用する場合。
所属していません StackOverflow