我正在尝试创建一个简单的程序,当你点击它时会在鼠标位置绘制一个球体。
问题是其他空白窗口没有显示任何内容。在下面的代码中,我至少确认它注册了鼠标点击,并保存了鼠标位置。我认为问题出在我的显示功能中,我只是不知道在哪里或为什么。
我所做的大部分内容都基于this示例。
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from logging import warning
sphere_locations = [(0, 0)]
def init():
glClearColor(1.0, 1.0, 1.0, 0.0)
glColor3f(0.0, 0.0, 0.0)
glPointSize(5.0)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluOrtho2D(0.0, 100.0, 0.0, 100.0)
glEnable(GL_DEPTH_TEST)
def on_click(button, state, x, y):
global sphere_locations
if button == GLUT_LEFT_BUTTON and state == GLUT_DOWN:
warning("CLICK")
sphere_locations.append((x, y))
def display():
global sphere_locations
warning(sphere_locations)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
for x, y in sphere_locations:
glPushMatrix()
glTranslatef(x, y, 1.0)
glColor3f(0.0, 1.0, 0.0)
glutSolidSphere(0.3, 250, 250)
glPopMatrix()
glFlush()
glutSwapBuffers()
glutPostRedisplay()
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH )
glutInitWindowSize(550, 550)
glutInitWindowPosition(50, 50)
glutCreateWindow("Bubble Pop")
glutDisplayFunc(display)
glutMouseFunc(on_click)
init()
glutMainLoop()
答案 0 :(得分:3)
首先,您的坐标不正确地映射到屏幕像素(鼠标坐标以屏幕像素给出,从顶部/左侧开始)。此外,gluOrtho2D
定义了从-1到1的深度剪切区域。由于我们在此处使用像素,因此您的球体将显示为2像素宽(仅一个环)的纵向切片。使用glOrtho
代替gluOrtho2D
以及以下参数将解决这两个问题:
glOrtho(0.0, 550.0, 550.0, 0.0, -100.0, 100.0);
这将使得从深度-100.0到100.0的所有内容都可见,这对于球体来说已经足够了。
其次,你的“球体”太小而无法看到......因为现在我们以像素工作,将它们的大小增加到一些像素:
glutSolidSphere(15, 250, 250)
它们看起来仍然不像球体,因为它们没有渐变的阴影,给人以深刻的印象,但这是一个照明问题,这是一个更复杂的话题。