0

我正在尝试创建一个简单的程序,当您单击它时,它将在鼠标的位置绘制一个球体。

问题是其他空白窗口没有显示。在下面的代码中,我至少确认它注册了鼠标点击,并且正在保存鼠标位置。我认为问题出在我的显示功能的某个地方,我只是不确定在哪里或为什么。

我所做的大部分工作都是基于这个例子。

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()
4

1 回答 1

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)

它们看起来仍然不像球体,因为它们缺乏给人以深度印象的渐变阴影,但这是一个照明问题,是一个更复杂的话题。

于 2013-09-25T18:05:40.137 回答