Как сделать разные ортогональные проекции Пиглета?

Я сделал два видовых экрана куба, но оба они являются фронтальными ортогональными проекциями, и мне нужно, чтобы один из них был сбоку. Вот код рисования draw_small — рисование маленького статического куба dwar_big — рисование большого куба, который может двигаться, масштабироваться и вращаться

    def on_draw(self) :

        self.clear()

        pgl.glClear(pgl.GL_COLOR_BUFFER_BIT | pgl.GL_DEPTH_BUFFER_BIT)

        pgl.glViewport(0, 0, 650, 500)
        pgl.glMatrixMode(pgl.GL_PROJECTION)
        pgl.glLoadIdentity()
        pgl.glOrtho(-1300 / 8, 1300 / 8, -1000 / 8, 1000 / 8, 100, 500)
        pgl.glMatrixMode(pgl.GL_MODELVIEW)
        pgl.glLoadIdentity
        pgl.glTranslatef(0, 0, -100)
        pgl.glPolygonMode(pgl.GL_FRONT_AND_BACK, pgl.GL_FILL)
        draw_small()

        pgl.glPushMatrix()
        pgl.glTranslatef(self.x, self.y, self.z)
        pgl.glRotatef(self.xRotation, 1, 0, 0)
        pgl.glRotatef(self.yRotation, 0, 1, 0)
        pgl.glRotatef(self.zRotation, 0, 0, 1)
        pgl.glScalef(self.zoom, self.zoom, self.zoom)

        if not transparant:
            pgl.glPolygonMode(pgl.GL_FRONT_AND_BACK, pgl.GL_FILL)
        else:
            ogl.glPolygonMode(pgl.GL_FRONT_AND_BACK, pgl.GL_LINE)

        draw_big()

        pgl.glPopMatrix()


        pgl.glViewport(650, 0, 650, 500)
        pgl.glMatrixMode(pgl.GL_PROJECTION)
        pgl.glLoadIdentity()
        pgl.glOrtho(-1300 / 8, 1300 / 8, -1000 / 8, 1000 / 8, 0, 500)
        pgl.glMatrixMode(pgl.GL_MODELVIEW)
        pgl.glLoadIdentity()
        pgl.glTranslatef(0, 0, -100)
        pgl.glPolygonMode(pgl.GL_FRONT_AND_BACK, pgl.GL_FILL)

        draw_small()

        pgl.glPushMatrix()
        pgl.glTranslatef(self.x, self.y, self.z)
        pgl.glRotatef(self.xRotation, 1, 0, 0)
        pgl.glRotatef(self.yRotation, 0, 1, 0)
        pgl.glRotatef(self.zRotation, 0, 0, 1)
        pgl.glScalef(self.zoom, self.zoom, self.zoom)

        if not transparant:
            pgl.glPolygonMode(pgl.GL_FRONT_AND_BACK, pgl.GL_FILL)
        else:
            pgl.glPolygonMode(pgl.GL_FRONT_AND_BACK, pgl.GL_LINE)

        draw_big()

        pgl.glPopMatrix()

person Popeye The Sailor    schedule 12.03.2019    source источник


Ответы (1)


Просто поверните вид на 90 градусов вокруг оси Y в пространстве вида:

pgl.glMatrixMode(pgl.GL_MODELVIEW)
pgl.glLoadIdentity
pgl.glTranslatef(0, 0, -100) 
pgl.glRotatef(-90, 0, 1, 0) # roatet 90 degrees around view space y axis

Обратите внимание, что левый и правый вид создаются с помощью pgl.glRotatef(-90, 0, 1, 0) и pgl.glRotatef(90, 0, 1, 0).
Вид сверху и снизу получаются путем поворота вокруг оси X, с помощью pgl.glRotatef(90, 1, 0, 0) соответственно pgl.glRotatef(-90, 0, 1, 0).

person Rabbid76    schedule 12.03.2019