glRoom.py

Posted on 2006年3月1日 7:21


# -*- coding: cp936 -*-
"""可视化Room。


cc.by twinsant
"""
import OpenGL.Tk
from OpenGL.GL import *
from Numeric import *
import Tkinter


def _xyzl(x,y,z,l):
return where(l==0, 1.0*x, where(l==1, 1.0*y, where(l==2, 1.0*z, 0)))


class OglRoom:
def __init__(self):
# 温度模型
self.room = zeros((4,3,5), Float)


# 可视化模型
h,w,l = self.room.shape
self.vroom = fromfunction(_xyzl, (h,w,l,3))
# 初始化窗口框架
self.OglFrame = OpenGL.Tk.Frame()
self.OglFrame.master.title('Visualized Room')
self.OglFrame.pack(expand=True, fill=OpenGL.Tk.BOTH, side=OpenGL.Tk.TOP)


# 初始化OpenGL窗口
self.ogl = OpenGL.Tk.Opengl(self.OglFrame)
self.ogl.pack(expand=True, fill=OpenGL.Tk.BOTH, side=OpenGL.Tk.TOP)


# 鼠标左键
self.ogl.bind('<Button-1>', self.ogl.StartRotate)
self.ogl.bind('<B1-Motion>', self.ogl.tkRotate)


# 鼠标中键
self.ogl.bind('<Button-2>', self.ogl.tkRecordMouse)
self.ogl.bind('<B2-Motion>', self.ogl.tkScale)

# 鼠标右键
self.ogl.bind('<Button-3>',self.ogl.tkRecordMouse)
self.ogl.bind('<B3-Motion>', self.ogl.tkTranslate)


# 设置背景色
self.ogl.set_background(255, 255, 255)
self.ogl.set_eyepoint(15)


glEnable(GL_LINE_SMOOTH)

# x,y,z轴
self.axispoints = identity((3))
# 设置渲染函数
self.ogl.redraw = self.redraw


# Demo buttons
self.Plus70 = Tkinter.Button(text='+70',
command = self.add)
self.Plus70.pack(side=OpenGL.Tk.BOTTOM)
self.SetFloor = Tkinter.Button(text='floor-70',
command = self.floor)
self.SetFloor.pack(side=OpenGL.Tk.BOTTOM)
self.SetFire = Tkinter.Button(text='fire',
command = self.fire)
self.SetFire.pack(side=OpenGL.Tk.BOTTOM)
self.DoEqu = Tkinter.Button(text='Equalize',
command = self.do_equ)
self.DoEqu.pack(side=OpenGL.Tk.BOTTOM)
def run(self):
self.OglFrame.mainloop()
def draw_axis(self):
glDisable(GL_LIGHTING)
glBegin(GL_LINES)


## +x axis points left
glColor3f(1,0,0)
glVertex3fv([0,0,0])
glVertex3fv(self.axispoints[0].tolist())


## +y axis points up
glColor3f(0,1,0)
glVertex3fv([0,0,0])
glVertex3fv(self.axispoints[1].tolist())


## +z-axis points away
glColor3f(0,0,1)
glVertex3fv([0,0,0])
glVertex3fv(self.axispoints[2].tolist())


glEnd()
def redraw(self, event=None):
self.draw_axis()
self.render()
def render(self):
h,w,l,foo = self.vroom.shape
glPointSize(5)
glBegin(GL_POINTS)
for x in range(h):
for y in range(w):
for z in range(l):
if (self.room[x,y,z]<50):
r,g,b = 0,0,(50-self.room[x,y,z])/30
if (50<=self.room[x,y,z]<=80):
r,g,b = 0,(self.room[x,y,z]-50)/30,0
if (self.room[x,y,z]>80):
r,g,b = (self.room[x,y,z]-80)/30,0,0
glColor3f(r,g,b)
glVertex3fv(self.vroom[x,y,z].tolist())
glEnd()
def add(self):
self.room += 70
self.ogl.tkRedraw()
def floor(self):
floor = self.room[3]
floor -= 70
self.ogl.tkRedraw()
def fire(self):
north = self.room[:,0]
north[3,2] = 90 # the fireplace cell itself
near_fireplace = north[2:4,1:4]
near_fireplace += 25
self.ogl.tkRedraw()
def equalize(self, oldrm):
room = oldrm.copy()
from random import randint

z,y,x = map(randint, (1,1,1), room.shape)

zmin,ymin,xmin = maximum([z-2,y-2,x-2],[0,0,0]).tolist()

zmax,ymax,xmax = [z+1,y+1,x+1]

region = room[zmin:zmax,ymin:ymax,xmin:xmax].copy()

room[z-1,y-1,x-1] = sum(region.flat)/len(region.flat)
return room
def do_equ(self):
self.room = self.equalize(self.room)
self.ogl.tkRedraw()


if __name__ == '__main__':
glr = OglRoom()
glr.run()

Technorati : , , ,

Feedback

请发表评论
发表评论
标题
 
姓名
 
网址
验证码
 
评论  
 

Copyright twinsant.