Как я могу нарисовать отдельные 3D-точки? - PullRequest
2 голосов
/ 09 июля 2019

Я использую Python 3 с PyOpenGL, и мне нужно рисовать отдельные точки в пространстве. Я знаю, что у точки нет объема, но я не знаю, есть ли простой способ рисования точки / сферы в определенных координатах. Редактировать: я использую opengl внутри pygame и внутри графического интерфейса tkinter

Я пробовал следующий код:

glEnable(GL_POINT_SMOOTH)
glBegin(GL_POINTS)
glColor3d(1, 1, 1)
glPointSize(200)
glVertex3d(1, 1, 1)
glEnd() # This throws an error

Ошибка:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python37-32\lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
  File "C:/Users/reas/Desktop/Programación/Dibujo/Dibujo.py", line 65, in vista_alzado
    glEnd()
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\OpenGL\latebind.py", line 61, in __call__
    return self.wrapperFunction( self.baseFunction, *args, **named )
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\OpenGL\GL\exceptional.py", line 45, in glEnd
    return baseFunction( )
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\OpenGL\platform\baseplatform.py", line 409, in __call__
    return self( *args, **named )
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\OpenGL\error.py", line 232, in glCheckError
    baseOperation = baseOperation,
OpenGL.error.GLError: GLError(
    err = 1282,
    description = b'operaci\xf3n no v\xe1lida',
    baseOperation = glEnd,
    cArguments = ()
)

1 Ответ

5 голосов
/ 09 июля 2019

Ошибка вызвана тем, что glPointSize() вызывается в последовательности glBegin / glEnd. Это не разрешено.
Вы должны позвонить glPointSize до glBegin, например:

glEnable(GL_POINT_SMOOTH)
glPointSize(5)

glBegin(GL_POINTS)
glColor3d(1, 1, 1)
glVertex3d(0, 0, 0)
glEnd()

После того, как рисование примитивов было начато glBegin, можно указывать только координаты вершины (glVertex) и изменять атрибуты (например, glColor, glTexCoord ...) до окончания розыгрыша (glEnd).
Все остальные инструкции будут проигнорированы и приведут к ошибке GL_INVALID_OPERATION (код ошибки 1282).


Обратите внимание: если матрица вида модели и матрица проекции - это единичная матрица, то координата (1, 1, 1) - это верхняя, правая (дальняя) точка области просмотра.
Координата (0, 0, 0) будет в центре вида (объем).

Принимая во внимание, что если используется перспективная проекция,

gluPerspective(40, display[0]/display[1], 0.1, 50)

тогда координата z точки должна быть меньше, чем -near (ближняя плоскость в данном примере равна 0,1) и больше, чем -far (дальняя плоскость равна 50), в противном случае точка обрезается ближней плоскостью или далеко плоскость зрения усеченного конуса. Обратите внимание, что ось пространства Z указывает на область просмотра. например,

glVertex3d(0, 0, -1)
...