Рендеринг куба с помощью pyopengl с использованием фрейма tkinter

Я пытаюсь визуализировать куб с помощью tkinter frame opengl. Но я не знаю, в чем проблема, куб не показывал ожидаемые 2 строки. Проверьте мой код. Пожалуйста, помогите мне написать код и есть ли у вас PDF-файлы, чтобы научить меня работать с opengl. Я не могу найти много ресурсов в Интернете

import tkinter as tk

from OpenGL.GL import *

from pyopengltk import 
OpenGLFrame

cubeVertices = 
((1,1,1),(1,1,-1), 
(1,-1,-1),(1,-1,1),. 
(-1,1,1),(-1,-1,-1), 
(-1,-1,1),(-1,1,-1))
cubeEdges = ((0,1),. 
(0,3),(0,4),(1,2),. 
(1,7),(2,5),(2,3),. 
(3,6),(4,6),(4,7),. 
(5,6),(5,7))
classframe(OpenGLFrame):

  def initgl(self):
        glViewport(0,0,250,250)
        

        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glOrtho(0,self.width,self.height,0,-1,1)

        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
  
  def redraw(self):
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
        glPushMatrix()
        glRotatef(90,0.0,1.0,0.0)
        glBegin(GL_LINES)
        glColor3f(0.0,1.0,0.0)
        for cubeEdge in cubeEdges:
     for cubeVertex in cubeEdge:
               glVertex3fv(cubeVertices[cubeVertex])
        glEnd()
        glPopMatrix()            
root = tk.Tk()
app = frame(root,width=900, height=600)  
  app.pack( 
fill=tk.BOTH,expand=tk.YES)
app.mainloop()

введите описание изображения здесь


person Lord_daniel    schedule 23.06.2020    source источник


Ответы (1)


Вам необходимо изменить матрицу проекции. Поскольку куб имеет размер 2x2x2, а проекция является ортогональной проекцией в оконном пространстве, куб будет покрывать всего 4 пикселя в окне. Измените пространство обзора и увеличьте расстояние до ближней и дальней плоскости. Обратите внимание: геометрия должна находиться между ближней и дальней плоскостями, иначе геометрия будет обрезана. Например:

glOrtho(-10, 10, -10, 10, -10, 10)

В любом случае я рекомендую использовать Перспективную проекцию. Матрица проекции определяет трехмерное пространство (пространство клипа), которое проецируется на двумерное окно просмотра. На перспективной проекции это пространство представляет собой усеченную пирамиду (Просмотр усеченной пирамиды). Матрицу можно установить с помощью gluPerspective. Например:

classframe(OpenGLFrame):

  def initgl(self):
        glViewport(0,0,250,250)
        

        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        # glOrtho(-10, 10, -10, 10, -10, 10)
        gluPerspective(90, self.width/self.height, 0.1, 10.0)

        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()

Значение для ближней плоскости и дальней плоскости должно быть больше 0,0, а дальняя плоскость должна быть больше ближней плоскости 0 < near < far. В приведенном выше примере ближняя плоскость равна 0,1, а дальняя плоскость 10. Когда вы рисуете геометрию, вы должны убедиться, что геометрия находится между ближней и дальней плоскостями (в пространстве отсечения, соответственно, в просматриваемом объеме), иначе геометрия будет обрезана.

Используйте gluLookAt, чтобы определить матрицу представления с точка зрения (0, -3, 0), которая находится на определенном расстоянии от начала мира (0, 0, 0):

classframe(OpenGLFrame):
    # [...]

    def redraw(self):
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        
        # define view matrix
        glLoadIdentity()
        gluLookAt(0, -3, 0, 0, 0, 0, 0, 0, 1)
        
        glPushMatrix()
        glRotatef(90,0.0,1.0,0.0)
        glBegin(GL_LINES)
        glColor3f(0.0,1.0,0.0)
        for cubeEdge in cubeEdges:
            for cubeVertex in cubeEdge:
               glVertex3fv(cubeVertices[cubeVertex])
        glEnd()
        glPopMatrix() 

Что такое координаты глазного пространства?

person Rabbid76    schedule 23.06.2020