如何绘制单个 3D 点?



我正在使用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

错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:Program Files (x86)Python37-32libtkinter__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-32libsite-packagesOpenGLlatebind.py", line 61, in __call__
return self.wrapperFunction( self.baseFunction, *args, **named )
File "C:Program Files (x86)Python37-32libsite-packagesOpenGLGLexceptional.py", line 45, in glEnd
return baseFunction( )
File "C:Program Files (x86)Python37-32libsite-packagesOpenGLplatformbaseplatform.py", line 409, in __call__
return self( *args, **named )
File "C:Program Files (x86)Python37-32libsite-packagesOpenGLerror.py", line 232, in glCheckError
baseOperation = baseOperation,
OpenGL.error.GLError: GLError(
err = 1282,
description = b'operacixf3n no vxe1lida',
baseOperation = glEnd,
cArguments = ()
)

导致该错误是因为glPointSize()是在glBegin/glEnd序列中调用的。
您必须在glBegin之前调用glPointSize,例如:

glEnable(GL_POINT_SMOOTH)
glPointSize(5)
glBegin(GL_POINTS)
glColor3d(1, 1, 1)
glVertex3d(0, 0, 0)
glEnd()

一旦基元的绘制开始glBegin就只允许指定顶点坐标(glVertex)和更改属性(例如glColorglTexCoord...),直到绘制结束 (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)

另请参阅即时模式和旧版 OpenGL

最新更新