如何绘制单个3D点?

Pep*_*o33 2 python opengl pyopengl python-3.x opengl-compat

我将Python 3与PyOpenGL结合使用,我需要在空间中绘制单个点。我知道一个点没有体积,但是我不知道是否有一种简单的方法可以在某些坐标处绘制点/球。编辑:我在pygame和tkinter gui内使用opengl

我尝试了以下代码:

glEnable(GL_POINT_SMOOTH)
glBegin(GL_POINTS)
glColor3d(1, 1, 1)
glPointSize(200)
glVertex3d(1, 1, 1)
glEnd() # This throws an error
Run Code Online (Sandbox Code Playgroud)

错误:

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 = ()
)
Run Code Online (Sandbox Code Playgroud)

Rab*_*d76 5

引起该错误的原因glPointSize()是,用glBegin/ glEnd序列调用。这是不允许的。
您必须在glPointSize之前致电glBegin,例如:

glEnable(GL_POINT_SMOOTH)
glPointSize(5)

glBegin(GL_POINTS)
glColor3d(1, 1, 1)
glVertex3d(0, 0, 0)
glEnd()
Run Code Online (Sandbox Code Playgroud)

一旦图元绘制由开始glBegin它仅允许指定顶点坐标(glVertex)和更改属性(例如glColorglTexCoord...),直到绘制结束(glEnd)。
所有其他指令将被忽略并导致GL_INVALID_OPERATION错误(错误代码1282)。


请注意,如果模型视图矩阵和投影矩阵是单位矩阵,则坐标(1、1、1)是视口的顶部,右侧(远方)点。
坐标(0,0,0)将位于视图(体积)的中心。

而如果使用透视投影,

gluPerspective(40, display[0]/display[1], 0.1, 50)
Run Code Online (Sandbox Code Playgroud)

那么该点的z坐标必须小于-near(在示例中,近平面为0.1)并且大于-far(远平面为50),否则该点将被视锥的近平面或远平面裁剪。请注意,视图空间的Z轴指向视口之外。例如

glVertex3d(0, 0, -1)
Run Code Online (Sandbox Code Playgroud)