def initHelicopter(self): """ initialisiere Helicopter mit Hilfe von Obj-Loader """ # load obj File self.objectVertices, self.facesDic, self.matDic, self.bb =\ self.objLoader.loadObjFile(self.filename) (a, b, c), (d, e, f) = self.bb[0], self.bb[1] self.bb = [Vector(a, b, c), Vector(d, e, f)] self.startPosition[1] += abs(b) # vector self.position = self.startPosition self.translationMatrix = geo.translationMatrix(self.position[0], self.position[1], self.position[2]) # initial Helicopter Geometry self.initHelicopterGeometry() rojoData = self.objLoader.createData(self.facesDic["500-D_Rojo"]) maxRotor = [max([x[0] for x in rojoData]), max([x[1] for x in rojoData]), max([x[2] for x in rojoData])] minRotor = [min([x[0] for x in rojoData]), min([x[1] for x in rojoData]), min([x[2] for x in rojoData])] mittel = map(lambda x, y: x + (y - x) / 2, minRotor, maxRotor) #### MAIN self.mainRotor = Rotor(self.vboTextureDic[self.mainRotorMat][0], self.vboTextureDic[self.mainRotorMat][1], self.vboTextureDic[self.mainRotorMat][2], self.objLoader.createData(self.facesDic[ self.mainRotorMat]), self.matDic, self.program, self.mainRotorMat, "main", mittel) #### TAIL und FrontLine separieren tailRotorFaces = [] frontLine = [] for facesList in self.facesDic[self.tailRotorMat]: for faces in facesList: if [singleFace for singleFace in faces if singleFace > 2720]\ != []: tailRotorFaces.append([singleFace for singleFace in faces\ if singleFace > 2720]) if [singleFace for singleFace in faces if singleFace < 2720]\ != []: frontLine.append([singleFace for singleFace in faces]) self.tailRotorData = self.objLoader.createData([tailRotorFaces]) self.tailRotorDataLen = len(self.tailRotorData) self.tailRotorVbo = vbo.VBO(np.array(self.tailRotorData, 'f')) self.tailRotorTextureId = self.vboTextureDic[self.tailRotorMat][1] frontLineData = self.objLoader.createData([frontLine]) frontLineDataLen = len(frontLineData) self.frontLineDataLenList = [] self.frontLineDataLenList.append(frontLineDataLen) frontLineVbo = vbo.VBO(np.array(frontLineData, 'f')) self.frontLineVboList = [] self.frontLineVboList.append(frontLineVbo) frontLineTextureId = self.vboTextureDic[self.tailRotorMat][1] self.frontLineTextureIdList = [] self.frontLineTextureIdList.append(frontLineTextureId) maxRotor = [max([x[0] for x in self.tailRotorData]), max([x[1] for x in self.tailRotorData]), max([x[2] for x in self.tailRotorData])] minRotor = [min([x[0] for x in self.tailRotorData]), min([x[1] for x in self.tailRotorData]), min([x[2] for x in self.tailRotorData])] mittel = map(lambda x, y: x + (y - x) / 2, minRotor, maxRotor) self.tailRotor = Rotor(vbo.VBO(np.array(self.tailRotorData, 'f')), self.vboTextureDic[self.tailRotorMat][1], len(self.tailRotorData), self.objLoader.createData([tailRotorFaces]), self.matDic, self.program, self.tailRotorMat, "heck", mittel, 12) self.actOri = geo.identity() # Frontline zum vboTextureDic hinzufuegen del(self.vboTextureDic[self.tailRotorMat]) if not self.tailRotorMat in self.vboTextureDic.keys(): self.vboTextureDic[self.tailRotorMat] =\ self.vboTextureDic.get(self.tailRotorMat, self.frontLineVboList\ + self.frontLineTextureIdList\ + self.frontLineDataLenList) else: self.vboTextureDic[self.tailRotorMat].append(self.frontLineVboList\ + self.frontLineTextureIdList\ + self.frontLineDataLenList)
class Helicopter(object): def __init__(self, program, objLoader, pos, filename): """ initialisiere den Helicopter @param program: Shader fuer Helicopter inklusive Schattierung @param objLoader: Obj-File Loader fuer die Objektdatei @pos: Startposition des Helicopters @filename: Name der Objektdatei """ self.filename = filename self.startPosition = Vector(pos[0], pos[1], pos[2]) self.position = pos self.objLoader = objLoader self.facesDic = {} self.matDic = {} self.vboList = [] self.textureIdList = [] self.vboTextureDic = {} self.mainRotorMat = "500-D_Negro1" self.tailRotorMat = "500-D_Blanco" self.program = program # init Heli self.initHelicopter() self.speed = 1 def initHelicopter(self): """ initialisiere Helicopter mit Hilfe von Obj-Loader """ # load obj File self.objectVertices, self.facesDic, self.matDic, self.bb =\ self.objLoader.loadObjFile(self.filename) (a, b, c), (d, e, f) = self.bb[0], self.bb[1] self.bb = [Vector(a, b, c), Vector(d, e, f)] self.startPosition[1] += abs(b) # vector self.position = self.startPosition self.translationMatrix = geo.translationMatrix(self.position[0], self.position[1], self.position[2]) # initial Helicopter Geometry self.initHelicopterGeometry() rojoData = self.objLoader.createData(self.facesDic["500-D_Rojo"]) maxRotor = [max([x[0] for x in rojoData]), max([x[1] for x in rojoData]), max([x[2] for x in rojoData])] minRotor = [min([x[0] for x in rojoData]), min([x[1] for x in rojoData]), min([x[2] for x in rojoData])] mittel = map(lambda x, y: x + (y - x) / 2, minRotor, maxRotor) #### MAIN self.mainRotor = Rotor(self.vboTextureDic[self.mainRotorMat][0], self.vboTextureDic[self.mainRotorMat][1], self.vboTextureDic[self.mainRotorMat][2], self.objLoader.createData(self.facesDic[ self.mainRotorMat]), self.matDic, self.program, self.mainRotorMat, "main", mittel) #### TAIL und FrontLine separieren tailRotorFaces = [] frontLine = [] for facesList in self.facesDic[self.tailRotorMat]: for faces in facesList: if [singleFace for singleFace in faces if singleFace > 2720]\ != []: tailRotorFaces.append([singleFace for singleFace in faces\ if singleFace > 2720]) if [singleFace for singleFace in faces if singleFace < 2720]\ != []: frontLine.append([singleFace for singleFace in faces]) self.tailRotorData = self.objLoader.createData([tailRotorFaces]) self.tailRotorDataLen = len(self.tailRotorData) self.tailRotorVbo = vbo.VBO(np.array(self.tailRotorData, 'f')) self.tailRotorTextureId = self.vboTextureDic[self.tailRotorMat][1] frontLineData = self.objLoader.createData([frontLine]) frontLineDataLen = len(frontLineData) self.frontLineDataLenList = [] self.frontLineDataLenList.append(frontLineDataLen) frontLineVbo = vbo.VBO(np.array(frontLineData, 'f')) self.frontLineVboList = [] self.frontLineVboList.append(frontLineVbo) frontLineTextureId = self.vboTextureDic[self.tailRotorMat][1] self.frontLineTextureIdList = [] self.frontLineTextureIdList.append(frontLineTextureId) maxRotor = [max([x[0] for x in self.tailRotorData]), max([x[1] for x in self.tailRotorData]), max([x[2] for x in self.tailRotorData])] minRotor = [min([x[0] for x in self.tailRotorData]), min([x[1] for x in self.tailRotorData]), min([x[2] for x in self.tailRotorData])] mittel = map(lambda x, y: x + (y - x) / 2, minRotor, maxRotor) self.tailRotor = Rotor(vbo.VBO(np.array(self.tailRotorData, 'f')), self.vboTextureDic[self.tailRotorMat][1], len(self.tailRotorData), self.objLoader.createData([tailRotorFaces]), self.matDic, self.program, self.tailRotorMat, "heck", mittel, 12) self.actOri = geo.identity() # Frontline zum vboTextureDic hinzufuegen del(self.vboTextureDic[self.tailRotorMat]) if not self.tailRotorMat in self.vboTextureDic.keys(): self.vboTextureDic[self.tailRotorMat] =\ self.vboTextureDic.get(self.tailRotorMat, self.frontLineVboList\ + self.frontLineTextureIdList\ + self.frontLineDataLenList) else: self.vboTextureDic[self.tailRotorMat].append(self.frontLineVboList\ + self.frontLineTextureIdList\ + self.frontLineDataLenList) def initHelicopterGeometry(self): ''' Rendere den Helicopter ''' for material, faces in self.facesDic.items(): if material: dataList, lenDataList, vboList, textureIdList = [], [], [], [] temp_vbo, temp_textureId = None, None # create data dataList = self.objLoader.createData(self.facesDic[material]) # create vbo temp_vbo = vbo.VBO(np.array(dataList, 'f')) # create textureId if "".join(self.matDic[material][5]) != 'Null': temp_textureId =\ self.objLoader.createTextureId(self.matDic[material][5]) else: temp_textureId = 0 vboList.append(temp_vbo) textureIdList.append(temp_textureId) lenDataList.append(len(dataList)) # make dict with vbo,textureId and len(data) if not material in self.vboTextureDic.keys(): self.vboTextureDic[material] =\ self.vboTextureDic.get(material, vboList + textureIdList\ + lenDataList) else: print "else" self.vboTextureDic[material].append(vboList + textureIdList + lenDataList) def drawHelicopter(self, pMatrix, mvMatrix): ''' Zeichne den Helicopter pro Step @param pMatrix: die Perspektivische Matrix der Camera @param mvMatrix: die Modelviewmatrix der Camera ''' self.mainRotor.drawRotor(pMatrix, mvMatrix, self.actOri, self.translationMatrix, self.speed) self.tailRotor.drawRotor(pMatrix, mvMatrix, self.actOri, self.translationMatrix, self.speed) glEnableClientState(GL_VERTEX_ARRAY) glEnableClientState(GL_NORMAL_ARRAY) glEnableClientState(GL_TEXTURE_COORD_ARRAY) glEnable(GL_TEXTURE_2D) mvMat = mvMatrix * self.translationMatrix * self.actOri mvpMatrix = pMatrix * mvMat normalMat = np.linalg.inv(mvMat[0:3, 0:3]).T glUseProgram(self.program) geo.sendMat4(self.program, "mvMatrix", mvMat) geo.sendMat4(self.program, "mvpMatrix", mvpMatrix) geo.sendMat3(self.program, "normalMatrix", normalMat) self.useHelicopterGeometry() glDisableClientState(GL_VERTEX_ARRAY) glDisableClientState(GL_NORMAL_ARRAY) glDisableClientState(GL_TEXTURE_COORD_ARRAY) def useHelicopterGeometry(self): ''' Zeichne fuer jedes VBO farben, Texturen und Daten ''' lightPos = [0, 1, 1] # vboTextureDic = {matName:[vbo],[textureId],[len(data)]} for material, value in self.vboTextureDic.items(): if material != self.mainRotorMat: act_vbo = value[0] act_textureId = value[1] lenData = value[2] # colors to shader geo.sendVec4(self.program, "diffuseColor", self.matDic[material][0]\ + self.matDic[material][4]) # if texture, use white as ambient color if act_textureId: geo.sendVec4(self.program, "ambientColor", [1.0, 1.0, 1.0] + self.matDic[material][4]) else: geo.sendVec4(self.program, "ambientColor", self.matDic[material][1]\ + self.matDic[material][4]) geo.sendVec4(self.program, "specularColor", [x ** self.matDic[material][3][0]\ for x in self.matDic[material][2]\ + self.matDic[material][4]]) geo.sendVec3(self.program, "lightPosition", lightPos) # use vbo act_vbo.bind() glVertexPointer(3, GL_FLOAT, 36, act_vbo) glNormalPointer(GL_FLOAT, 36, act_vbo + 24) glTexCoordPointer(3, GL_FLOAT, 36, act_vbo + 12) if act_textureId: glBindTexture(GL_TEXTURE_2D, act_textureId) elif material == self.tailRotorMat: glBindTexture(GL_TEXTURE_2D, 8) else: glBindTexture(GL_TEXTURE_2D, 1) glDrawArrays(GL_TRIANGLES, 0, lenData) act_vbo.unbind() def __repr__(self): """ String repreasentation des Helicopters """ return "Helicopter at %s " % str(self.position)