设为首页 加入收藏

TOP

Python之OpenGL程序环境
2014-11-24 08:27:20 来源: 作者: 【 】 浏览:1
Tags:Python OpenGL 程序 环境

Python+OpenGL,想想都觉得很刺激~~


首先还是下载PyOpenGL包:http://pypi.python.org/pypi/PyOpenGL/3.0.2


在Windows下,安装还是很简单的,安装程序会主动找到你的python目录,所以可以直接下一步。


安装好了后,就来写一个脚本测试一下~


test.py


from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

def Draw():
glClear(GL_COLOR_BUFFER_BIT)
glRotatef(0.5, 0, 1, 0)
glutWireTeapot(0.5)
glFlush()

glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutInitWindowSize(400, 400)
glutCreateWindow("test")
glutDisplayFunc(Draw)
glutIdleFunc(Draw)
glutMainLoop()


可以看到,在python中同样可以使用glut来创建窗口,语法遵从Python,但是大体上的结构还是和c语言的glut库差不多。


答案当然是!


于是,我抱着好奇的心态去尝试了一下。最后居然成功了。。


有图有真相:



在转换的时候,有很多注意事项:


1.全局变量的处理。在Update函数和Draw函数中会用到h,m,s三个表示时间的全局变量。在Update函数中给他们更新值的时候需要用global关键字来声明一下。


2.三角函数。记得import math,调用的时候也要用math.cos和math.sin。


3.变量的数据类型。因为Python中不需要事先声明变量类型,所以有些值在赋值时需要注意,如果是浮点实数,但值需要暂时赋为一个整数时,需要在后面加上.0。如count=60.0


4.缩进的问题。在Python中代码段是用缩进来标示的。在c语言的OpenGL中,我习惯性地把glBegin(XXX)后定点的语句缩进一下,但是这个在Python中是会出现问题的。


最后附上代码:


from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import math
import time
h=0
m=0
s=0
def Draw():
PI=3.1415926
R=0.5
TR=R-0.05
glClear(GL_COLOR_BUFFER_BIT)
glLineWidth(5)
glBegin(GL_LINE_LOOP)
for i in range(100):
glVertex2f(R*math.cos(2*PI/100*i),R*math.sin(2*PI/100*i))
glEnd()
glLineWidth(2)
for i in range(100):
glBegin(GL_LINES)
glVertex2f(TR*math.sin(2*PI/12*i),TR*math.cos(2*PI/12*i))
glVertex2f(R*math.sin(2*PI/12*i),R*math.cos(2*PI/12*i))
glEnd()
glLineWidth(1)


h_Length=0.2
m_Length=0.3
s_Length=0.4
count=60.0
s_Angle=s/count
count*=60
m_Angle=(m*60+s)/count
count*=12
h_Angle=(h*60*60+m*60+s)/count
glLineWidth(1)
glBegin(GL_LINES)
glVertex2f(0.0,0.0)
glVertex2f(s_Length*math.sin(2*PI*s_Angle),s_Length*math.cos(2*PI*s_Angle))
glEnd()
glLineWidth(5)
glBegin(GL_LINES)
glVertex2f(0.0,0.0)
glVertex2f(h_Length*math.sin(2*PI*h_Angle),h_Length*math.cos(2*PI*h_Angle))
glEnd()
glLineWidth(3)
glBegin(GL_LINES)
glVertex2f(0.0,0.0)
glVertex2f(m_Length*math.sin(2*PI*m_Angle),m_Length*math.cos(2*PI*m_Angle))
glEnd()
glLineWidth(1)
glBegin(GL_POLYGON)
for i in range(100):
glVertex2f(0.03*math.cos(2*PI/100*i),0.03*math.sin(2*PI/100*i));
glEnd()
glFlush()
def Update():
global h,m,s
t=time.localtime(time.time())
h=int(time.strftime('%H',t))
m=int(time.strftime('%M',t))
s=int(time.strftime('%S',t))
glutPostRedisplay()
glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutInitWindowSize(400, 400)
glutCreateWindow("My clock")
glutDisplayFunc(Draw)
glutIdleFunc(Update)
glutMainLoop()


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenGL编程学习实战教程 下一篇Objective-C类变量的声明

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何理解c语言指针和 (2025-12-27 01:19:11)
·为什么C标准库没有链 (2025-12-27 01:19:08)
·玩转C语言和数据结构 (2025-12-27 01:19:05)
·MySQL 基础入门视频 (2025-12-26 23:20:22)
·小白入门:MySQL超详 (2025-12-26 23:20:19)