我试图在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()