文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python 之 OpenGL程序环境

2023-01-31 05:50

关注

        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库差不多。

       在OpenGL织梦之旅【第二章】第2节.实现动画这篇博文中,我用c语言,用OpenGL实现了一个显示时钟的程序。和上面的脚本一样,那个程序也使用了glut库,那是不是意味着用Python也能够实现同样的东西呢?

       答案当然是!

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

       有图有真相:

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

       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() 


 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯