如何绘制单个 3D 点?
How can I draw single 3D points?
我正在使用 Python 3 和 PyOpenGL,我需要在 space 中绘制单个点。我知道一个点没有体积,但我不知道是否有一种简单的方法可以在某些坐标处绘制 point/sphere。
编辑:我在 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-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 = ()
)
错误是因为glPointSize()
在glBegin
/glEnd
序列中被调用。这是不允许的。
您必须在 glBegin
之前调用 glPointSize
,例如:
glEnable(GL_POINT_SMOOTH)
glPointSize(5)
glBegin(GL_POINTS)
glColor3d(1, 1, 1)
glVertex3d(0, 0, 0)
glEnd()
一旦图元绘制由 glBegin
it is only allowed to specify vertex coordinates (glVertex
) and change attributes (e.g. 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),否则该点将被裁剪通过视锥体的近平面或远平面。
请注意视图 space z-axis 指向视口之外。例如
glVertex3d(0, 0, -1)
我正在使用 Python 3 和 PyOpenGL,我需要在 space 中绘制单个点。我知道一个点没有体积,但我不知道是否有一种简单的方法可以在某些坐标处绘制 point/sphere。 编辑:我在 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-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 = ()
)
错误是因为glPointSize()
在glBegin
/glEnd
序列中被调用。这是不允许的。
您必须在 glBegin
之前调用 glPointSize
,例如:
glEnable(GL_POINT_SMOOTH)
glPointSize(5)
glBegin(GL_POINTS)
glColor3d(1, 1, 1)
glVertex3d(0, 0, 0)
glEnd()
一旦图元绘制由 glBegin
it is only allowed to specify vertex coordinates (glVertex
) and change attributes (e.g. 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),否则该点将被裁剪通过视锥体的近平面或远平面。
请注意视图 space z-axis 指向视口之外。例如
glVertex3d(0, 0, -1)