如何在带有Lighing On的Pyglet / OpenGL中突出显示所选的3D几何?

时间:2017-04-25 07:27:22

标签: python-3.x opengl pyglet

我试图在pyglet中进行鼠标拾取,我发现很难突出显示选择,特别是在glLight打开的情况下,因为它们会覆盖对象颜色。

这是我的代码的一般结构。我试图绘制一个你可以选择并移动网格点的网格(将会有从这些点生成的结构,因此是3d照明)。我知道glMaterialfv的if语句是荒谬的,但那是我尝试过的。他们曾经在draw()函数中。

那么我应该怎样做才能突出显示3D灯光场景中的选择?我应该指定不同的高光照明吗?我该怎么做?或者我是否应该使用不同的绘图功能不断添加和删除选定的点到不同的批次(这是否浪费)?你的一般方法是什么?

(作为一项实验,我尝试为此mousepicking example添加灯光,并在灯亮起时停止工作。)

任何帮助都将受到高度赞赏!

#grid class
def __init__(self,rows,cols,spacingX,spacingZ):
    self.rows, self.cols = rows, cols
    #......some other code generating the grid#
    self.hilightIndex = None
    self.Lines = pyglet.graphics.Batch()
    self.Dots = pyglet.graphics.Batch()
    self.pointList = {}
    #grid points#
    for row in range(self.rows+1):
        for col in range(self.cols+1):
            point=#something
            self.pointList[(row,col)]=point
            if (row,col)==self.hilightIndex:    #selected
                glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(1, 1, 1, 1))
                glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, vec(1, 1, 1, 1))
            else:
                glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0, 0, 0, 1))
                glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, vec(0, 0, 0, 1))

            glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50)
            self.Dots.add(1,GL_POINTS, None,('v3f',point))
    #grid lines#
    for row in range(self.rows):
        for col in range(self.cols):
            uL=self.pointList[(row,col)] 
            #......*4 points of the grid
            self.Lines.add(2,GL_LINES, None,('v3f/stream',uL+uR))
            #......*4 sides
            glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0, 0, 0, 1.0))
            glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, vec(0, 0, 0, 1))
            glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50)



def draw(self):
    #......some line stipple and point size code
    self.Lines.draw()
    self.Dots.draw()

0 个答案:

没有答案