【问题标题】:PyOpenGL or OpenGL picking question (Not color picking)PyOpenGL 或 OpenGL 挑选问题(不是颜色挑选)
【发布时间】:2021-04-26 09:31:52
【问题描述】:

我有一个使用PyOpenGL 库绘制球体的小型python 程序。代码有以下流程

  • 绘制球体

    如果有命中,则使用下面的

    SELECT_BUFFER_SIZE = 512
    x, y = event.x(), event.y()
    # required to call this to force PyQt to read from the correct, updated buffer
    viewport = glGetIntegerv(GL_VIEWPORT)
    # print viewport
    w = viewport[2] - viewport[0]
    h = viewport[3] - viewport[1]
    aspect_ratio = w / h
    
    
    glSelectBuffer(SELECT_BUFFER_SIZE)
    glRenderMode(GL_SELECT)
    
    glInitNames()
    glPushName(0)
    
    glMatrixMode(GL_PROJECTION)
    glPushMatrix()
    glLoadIdentity()
    gluPickMatrix(x, viewport[3] - y, 5, 5, viewport)
    
    glOrtho( *** setting the schene***) 
    
    **-draw spheres using glLoadName(for each)**
    
    glMatrixMode(GL_PROJECTION)
    glPopMatrix()
    glFlush()
    
    buffer = glRenderMode(GL_RENDER)
    
    # print buffer
    for hit_record in buffer:
        _, _, names = hit_record
        print(names)
    

但是当我尝试打印名称时,虽然我在窗口上只点击了其中一个,但两个名称都被打印了。应该是什么解决方案

简而言之,我试图在 Pyqt5 窗口中使用相同颜色的 PyOpenGL 绘制三个球体(白色),但我试图让它们有资格被挑选。我也有旋转、移动和放大的能力。所以这些功能在完成后不应该破坏挑选。(正如评论中所问的,这不是家庭作业。这是我过去两年工作的一个副项目。所以这个问题只是很小的一部分我的代码。)

【问题讨论】:

  • 这是一个练习/家庭作业吗?如果是这样,也许告诉你的老师/助教/教授,选择模式从来没有得到特别好的支持,已经完全从现代 OpenGL 中删除,使用它会退回到软件后备实现,因为没有GPU 以那种的方式工作。如果您想以正确的方式进行 OpenGL,请渲染到索引缓冲区(不要与索引颜色模式混淆)或使用剪裁遮挡查询。
  • 这不是作业。我正在将此作为满足我需求的副项目。 Spheres 只是这里的例子,但我想要做的事情比这要大得多。你介意指出一些正确方法的例子吗?我可以很容易地把注意力转移到那个地方。

标签: python opengl pyqt5 pyopengl


【解决方案1】:

我不太确定这是否会有所帮助
我承认我没有阅读实际代码,
我不太明白球体是否在它们之间或与球体发生碰撞边界本身

我曾经遇到过一个类似的问题,我很长时间都无法理解。
但基本上一个命中被打印了两次,因为两个对象都记录了一个命中,
所以每当他们已经hit each other 打印了两条命中信息。

我使用了他们的 ID(或放在列表或类似的地方)
所以只有其中一个(ID 较大的那个)会打印消息

我不知道这是否有帮助,但可能就是这样。

【讨论】:

  • 感谢您的回复。但这里的问题是,当我转动场景时,虽然我选择了第二个,但我只得到第一个球体作为命中。我仍然对如何解决这个问题一无所知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 2017-02-26
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
相关资源
最近更新 更多