Farbige würfel zeichnen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Feanor
User
Beiträge: 7
Registriert: Montag 18. August 2008, 18:16

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

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


Zuletzt geändert von Feanor am Sonntag 25. Januar 2009, 18:13, insgesamt 1-mal geändert.
Feanor
User
Beiträge: 7
Registriert: Montag 18. August 2008, 18:16

Hab mein Problem selbst gelöst. Für jeden der ein ähnliches Problem hat:
http://www.sjbaker.org/steve/omniv/opengl_lighting.html
hier ist erklärt wie opengl Farben behandelt[/url]
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

WENN du was in 3D machen wilst empfewhle ich dringend dir mal BLENDER reinzutziehen(Anzusehen) damit macht 3D blender richtig laune

das hier waren 10min programmieraufwand und animation
Bild
Feanor
User
Beiträge: 7
Registriert: Montag 18. August 2008, 18:16

Blender 3d hab ich mir kurz angeschaut. sieht ganz nett aus. Ich will aber eigentlich ein Spiel schreiben im dem man einen Rubik's Cube lösen muss. Da brauch ich nicht so viel zu zeichnen.

Mein momentanes Problem: Ich bekomm das EVT_KEY_DOWN nicht auf mein Frame gebunden. Es entstehen keine Fehler, aber die Funktion wird auch nicht aufgerufen. Kanns sein dass es ein Bug im python oder so ist

>python --version
Python 2.5.2
>wx-config --release
2.8

So sieht es atm aus
Bild
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

klasse für den anfang

eine 2D lösung birgt natürlich gefahren wewgen dem drehen des würfels dazu

gibt es PYgame das hat das bessere funktionen

und in blender mit der BGE BlenderGameEngine haste dann via physik gleich fertige exe und volle 3D gewalt.
hier das video des blenderfiles
http://de.youtube.com/watch?v=FSzROCzaFCw
und hier das pygame file
http://www.pygame.org/project/463/
2D
Antworten