Farbige würfel zeichnen
Verfasst: Sonntag 18. Januar 2009, 19:26
Ich habe gerade angefangen mit pyopengl zu arbeiten und schaffe es einfach nicht mein 3d Modell farbig zu gestalten. Ich kann zwar die Farbe setzen, aber ich bekomme immer nur ein graues Modell. Welche Eigenschaft muss ich setzten um eine farbige Ausgabe zu erhalten?
danke im voraus
Feanor
danke im voraus
Feanor
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import wx
import sys
from wx import glcanvas
from OpenGL.GL import *
from OpenGL.GLUT import *
class MyCanvasBase(glcanvas.GLCanvas):
def __init__(self,parent):
glcanvas.GLCanvas.__init__(self,parent, -1,style=wx.WANTS_CHARS)
self.init = False
#initial mouse position
self.lastx = self.x = 0
self.lasty = self.y = 0
self.size = None
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
self.Bind(wx.EVT_SIZE,self.OnSize)
self.Bind(wx.EVT_PAINT,self.OnPaint)
self.Bind(wx.EVT_LEFT_DOWN,self.OnMouseDown)
self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp)
self.Bind(wx.EVT_MOTION, self.OnMouseMotion)
def OnEraseBackground(self, event):
pass
def OnSize(self, event):
size = self.size = self.GetClientSize()
if self.GetContext():
self.SetCurrent()
glViewport(0,0,size.width,size.height)
event.Skip()
def OnPaint(self, event):
dc=wx.PaintDC(self)
self.SetCurrent()
if not self.init:
self.InitGL()
self.init = True
self.OnDraw()
def OnMouseDown(self, evt):
self.CaptureMouse()
self.x, self.y = self.lasty, self.lasty = evt.GetPosition()
def OnMouseUp(self,evt):
self.ReleaseMouse()
def OnMouseMotion(self,evt):
if evt.Dragging() and evt.LeftIsDown():
self.lastx,self.lasty=self.x,self.y
self.x,self.y=evt.GetPosition()
self.Refresh(False)
class CubeCanvas(MyCanvasBase):
def InitGL(self):
glMatrixMode(GL_PROJECTION)
glFrustum(-1.25,1.25,-1.25,1.25,1.0,4.25)
glMatrixMode(GL_MODELVIEW)
glTranslatef(0.0,0.0,-3.6)
self.Bind(wx.EVT_KEY_UP,self.OnKeyUp)
glRotatef(self.y,1.0,0.0,0.0)
glRotatef(self.x,0.0,1.0,0.0)
self.cubea=[ [[None,None,None],[None,None,None],[None,None,None]],
[[None,None,None],[None,None,None],[None,None,None]],
[[None,None,None],[None,None,None],[None,None,None]]]
for i in range(0,3):
for j in range(0,3):
for l in range(0,3):
self.cubea[i-1][j-1][l-1]=( (1.0,1.0,1.0) if (j==2) else (0.3,0.3,0.3),
(1.0,0.0,0.0) if (j==0) else (0.3,0.3,0.3),
(0.0,1.0,0.0) if (i==0) else (0.3,0.3,0.3),
(0.0,0.0,1.0) if (i==2) else (0.3,0.3,0.3),
(1.0,1.0,0.0) if (l==2) else (0.3,0.3,0.3),
(0.0,1.0,1.0) if (l==0) else (0.3,0.3,0.3))
glDepthFunc(GL_LESS)
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
glEnable(GL_COLOR_MATERIAL)
glEnable(GL_LIGHT0)
def OnDraw(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glBegin(GL_QUADS)
self.drawCubes()
glEnd()
if self.size is None:
self.size = self.GetClientSize()
w,h=self.size
w=max(w,1.0)
h=max(h,1.0)
xScale=180.0/w
yScale=180.0/h
glRotatef((self.y - self.lasty)*yScale,1.0,0.0,0.0)
glRotatef((self.x - self.lastx)*xScale,0.0,1.0,0.0)
self.SwapBuffers()
def cube(self,x,y,z,s,colorTop,colorBottom,colorLeft,colorRight,colorFront,colorBack):
self.cubea[x][y][z]=(colorTop,colorBottom,colorLeft,colorRight,colorFront,colorBack)
#vorne
glNormal3f(0.0,0.0,1.0)
glColor3fv(colorFront)
glVertex3f(s/2+x,s/2+y,s/2+z)
glVertex3f(-s/2+x,s/2+y,s/2+z)
glVertex3f(-s/2+x,-s/2+y,s/2+z)
glVertex3f(s/2+x,-s/2+y,s/2+z)
#hinten
glNormal3f(0.0,0.0,-1.0)
glColor3fv(colorBack)
glVertex3f(s/2+x,s/2+y,-s/2+z)
glVertex3f(-s/2+x,s/2+y,-s/2+z)
glVertex3f(-s/2+x,-s/2+y,-s/2+z)
glVertex3f(s/2+x,-s/2+y,-s/2+z)
#rechts
glNormal3f(1.0,0.0,0.0)
glColor3fv(colorRight)
glVertex3f(s/2+x,s/2+y,s/2+z)
glVertex3f(s/2+x,s/2+y,-s/2+z)
glVertex3f(s/2+x,-s/2+y,-s/2+z)
glVertex3f(s/2+x,-s/2+y,s/2+z)
#links
glNormal3f(-1.0,0.0,0.0)
glColor3fv(colorLeft)
glVertex3f(-s/2+x,s/2+y,s/2+z)
glVertex3f(-s/2+x,s/2+y,-s/2+z)
glVertex3f(-s/2+x,-s/2+y,-s/2+z)
glVertex3f(-s/2+x,-s/2+y,s/2+z)
#oben
glNormal3f(0.0,1.0,0.0)
glColor3fv(colorTop)
glVertex3f(s/2+x,s/2+y,s/2+z)
glVertex3f(s/2+x,s/2+y,-s/2+z)
glVertex3f(-s/2+x,s/2+y,-s/2+z)
glVertex3f(-s/2+x,s/2+y,s/2+z)
#unten
glNormal3f(0.0,-1.0,0.0)
glColor3fv(colorBottom)
glVertex3f(s/2+x,-s/2+y,s/2+z)
glVertex3f(s/2+x,-s/2+y,-s/2+z)
glVertex3f(-s/2+x,-s/2+y,-s/2+z)
glVertex3f(-s/2+x,-s/2+y,s/2+z)
def drawCubes(self):
for i in range(0,3):
for j in range(0,3):
for l in range(0,3):
self.cube( i-1,
j-1,
l-1,
0.9,
self.cubea[i-1][j-1][l-1][0],
self.cubea[i-1][j-1][l-1][1],
self.cubea[i-1][j-1][l-1][2],
self.cubea[i-1][j-1][l-1][3],
self.cubea[i-1][j-1][l-1][4],
self.cubea[i-1][j-1][l-1][5]
)
def OnKeyUp(self, event):
print "key pressed"
class MainWindow(wx.Frame):
def __init__(self, parent = None, id = -1, title = "Rubik's Cube"):
# Init
wx.Frame.__init__(
self, parent, id, title, size = (400,400),
style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE | wx.WANTS_CHARS
)
# OpenGL
self.control = CubeCanvas(self)
# StatusBar
self.CreateStatusBar()
# Filemenu
filemenu = wx.Menu()
# Filemenu - About
menuitem = filemenu.Append(-1, "&About", "Information about this program")
self.Bind(wx.EVT_MENU, self.OnAbout, menuitem) # here comes the event-handler
# Filemenu - Separator
filemenu.AppendSeparator()
# Filemenu - Exit
menuitem = filemenu.Append(-1, "E&xit", "Terminate the program")
self.Bind(wx.EVT_MENU, self.OnExit, menuitem) # here comes the event-handler
# Menubar
menubar = wx.MenuBar()
menubar.Append(filemenu,"&File")
self.SetMenuBar(menubar)
# Show
self.Show(True)
def OnAbout(self,event):
message = "A sample editor\n in wxPython"
caption = "About Sample Editor"
wx.MessageBox(message, caption, wx.OK)
def OnExit(self,event):
self.Close(True) # Close the frame.
app = wx.PySimpleApp()
frame = MainWindow()
app.MainLoop()
# destroying the objects, so that this script works more than once in IDLEdieses Beispiel
del frame
del app