使用适当的剪裁在opengl中创建旋转的3d形状

时间:2014-04-16 19:12:11

标签: opengl enthought pyglet canopy depth-buffer

我正在尝试创建一个不断旋转的三角形金字塔。我从一个教程示例中获取了一些代码以获得旋转,我认为它正在工作,但是我的图形在z轴上被剪切了。从我在各种教程,论坛等中看到的,openGL的默认z范围为(-1,1)。如何更改此项以显示我的数字的全部范围?

谢谢(这是我的代码)

import pyglet

from pyglet.gl import *

rx = ry = rz = 0

config = Config(sample_buffers=1, samples=4, depth_size=1000, double_buffer=True,)
win = pyglet.window.Window(resizable=True, config=config)

@win.event

def update(dt):
    global rx, ry, rz
    rx += dt * 1
    ry += dt * 80
    rz += dt * 30
    rx %= 360
    ry %= 360
    rz %= 360
pyglet.clock.schedule(update)

@win.event
def on_draw():

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    glTranslatef(200, 200, -4)
    glRotatef(rz, 0, 0, 1)
    glRotatef(ry, 0, 1, 0)
    glRotatef(rx, 1, 0, 0)


    glBegin(GL_TRIANGLES)

    glVertex3f(-100.0, 0.0, 0.0)
    glVertex3f(100.0, 0.0, 0.0)
    glVertex3f(0, 200.0, 0.0)

    glVertex3f(-100.0, 0.0, 0.0)
    glVertex3f(0.0, 0.0, -100.0)
    glVertex3f(0.0, 200.0, 0.0)

    glVertex3f(100.0, 0.0, 0.0)
    glVertex3f(0.0, 0.0, -100.0)
    glVertex3f(0.0, 200.0, 0.0)

    glVertex3f(-100.0, 0.0, 0.0)
    glVertex3f(0.0, 0.0, -100.0)
    glVertex3f(100.0, 0.0, 0.0)
    glEnd()

    glLoadIdentity()
    #glTranslatef(1.5, 0.0, -10.0)          

pyglet.app.run()

1 个答案:

答案 0 :(得分:0)

OpenGL具有Projection和ModelView的矩阵。

您想要的是将投影矩阵从默认矩阵更改为更合适的矩阵。

而不是

glLoadIdentity()
glTranslatef(200, 200, -4)

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(-1000, 1000, -1000, 1000, -1000, 1000)

glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glTranslatef(200, 200, -4)

glOrtho(x_min, x_max, y_min, y_max, z_min, z_max)是最有可能实现的地方。

如果您想要3D投影,请使用gluPerspective