初试PyOpenGL一 (Python+OpenGL)
2014-01-20 02:17
405 查看
很早就一直想学Python,看到一些书都有介绍,不管是做为游戏的脚本语言,还是做为开发项目的主要语言都有提及(最主要的CUDA都开始支持Python,CUDA后面一定要学),做为先熟悉一下Python,本文用PyOpenGL实现一些基本的显示效果,一个网格,一个球体,加一个能切换第一与第三人称的摄像机。
PyOpenGL是一个用Python实现的多平台的OpenGL的API,为了学习Python与PyOpengl,本文也是用的Python,而不是.net版本的IronPython.
先看一下,相关环境的搭建:
首先我们需要下载Python: http://www.python.org/getit/
然后是PyOpenGL库:https://pypi.python.org/pypi/PyOpenGL
和PyOpenGL库常连在一起用的二个库,一个库numpy,提供常用的科学计算包含矩阵运算,数组转换与序列化,还有一个是3D常用的图片处理库:Python Imaging Library (PIL)。
numpy下载:http://sourceforge.net/projects/numpy/files/ 简介:http://sebug.net/paper/books/scipydoc/numpy_intro.html
Python Imaging Library (PIL)下载:http://www.pythonware.com/products/pil/
当上面环境安装完成后,我们先来实现一个基本的球体VBO实现,代码请参考前面的WebGL 利用FBO完成立方体贴图中的球的代码:
显示效果
代码很简单,把球,网络,漫游摄像机应用进去。注意glutMouseFunc( mouseButton )与glutMotionFunc(camera.mouse)组合用才能达到原来OpenTK提供的鼠标检测功能,因为glutmousefunc只检测鼠标的按下等动作,意思你一直按下移动他是不会引用的,在这引用的是glutmotionfunc,这个大家可以自己去试验。
下面放出效果图:
效果很简单,主要是为了下文先做一个基本的效果,同时也是用pyOpengl对前面的一点总结。
代码下载:代码 和上面说的一样,其中EDSF前后左右移动,WR分别向上与向下,鼠标右键加移动鼠标控制方向,V切换第一人称与第三人称。UP与DOWN切换前面操作的移动幅度。
PyOpenGL是一个用Python实现的多平台的OpenGL的API,为了学习Python与PyOpengl,本文也是用的Python,而不是.net版本的IronPython.
先看一下,相关环境的搭建:
首先我们需要下载Python: http://www.python.org/getit/
然后是PyOpenGL库:https://pypi.python.org/pypi/PyOpenGL
和PyOpenGL库常连在一起用的二个库,一个库numpy,提供常用的科学计算包含矩阵运算,数组转换与序列化,还有一个是3D常用的图片处理库:Python Imaging Library (PIL)。
numpy下载:http://sourceforge.net/projects/numpy/files/ 简介:http://sebug.net/paper/books/scipydoc/numpy_intro.html
Python Imaging Library (PIL)下载:http://www.pythonware.com/products/pil/
当上面环境安装完成后,我们先来实现一个基本的球体VBO实现,代码请参考前面的WebGL 利用FBO完成立方体贴图中的球的代码:
from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * import common import sys window = 0 sph = common.sphere(16,16,1) camera = common.camera() plane = common.plane(12,12,1.,1.) def InitGL(width,height): glClearColor(0.1,0.1,0.5,0.1) glClearDepth(1.0) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45.0,float(width)/float(height),0.1,100.0) camera.move(0.0,3.0,-5) def DrawGLScene(): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glMatrixMode(GL_MODELVIEW) camera.setLookat() plane.draw() glTranslatef(-1.5,0.0,0.0) glBegin(GL_QUADS) glVertex3f(-1.0, 1.0, 0.0) glVertex3f(1.0, 1.0, 0.0) glVertex3f(1.0, -1.0, 0.0) glVertex3f(-1.0, -1.0, 0.0) glEnd() glTranslatef(3.0, 0.0, 0.0) sph.draw() glutSwapBuffers() def mouseButton( button, mode, x, y ): if button == GLUT_RIGHT_BUTTON: camera.mouselocation = [x,y] def ReSizeGLScene(Width, Height): glViewport(0, 0, Width, Height) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0) glMatrixMode(GL_MODELVIEW) def main(): global window glutInit(sys.argv) glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(640,400) glutInitWindowPosition(800,400) window = glutCreateWindow("opengl") glutDisplayFunc(DrawGLScene) glutIdleFunc(DrawGLScene) glutReshapeFunc(ReSizeGLScene) glutMouseFunc( mouseButton ) glutMotionFunc(camera.mouse) glutKeyboardFunc(camera.keypress) glutSpecialFunc(camera.keypress) InitGL(640, 480) glutMainLoop() main()
显示效果
代码很简单,把球,网络,漫游摄像机应用进去。注意glutMouseFunc( mouseButton )与glutMotionFunc(camera.mouse)组合用才能达到原来OpenTK提供的鼠标检测功能,因为glutmousefunc只检测鼠标的按下等动作,意思你一直按下移动他是不会引用的,在这引用的是glutmotionfunc,这个大家可以自己去试验。
下面放出效果图:
效果很简单,主要是为了下文先做一个基本的效果,同时也是用pyOpengl对前面的一点总结。
代码下载:代码 和上面说的一样,其中EDSF前后左右移动,WR分别向上与向下,鼠标右键加移动鼠标控制方向,V切换第一人称与第三人称。UP与DOWN切换前面操作的移动幅度。
相关文章推荐
- 初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞
- 初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞
- 初试PyOpenGL二 (Python+OpenGL)基本地形生成与高度检测
- 初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞
- OpenGL with PyOpenGL Python and PyGame p.3 - Movement and Navigation
- 配置编译Python3.4 + OpenCV3.0 + OpenGL
- 初试主题模型LDA-基于python的gensim包
- windows下Python2.7 的 pyOpenGL模块安装
- 初试python网络通信
- C++调用Python初试
- 初试Gevent – 高性能的Python并发框架
- python 初试 2
- Linux下的OpenGL初试
- python 爬虫初试
- python2 paramiko模块初试 连接 ssh_connect 上传 下载FTP_post
- ubuntu 下python opengl编程(2)
- Python 学习(二) -- 初试抓取动车事件表
- python 爬虫初试
- 在Python中调用glutInit遇到OpenGL.error.NullFunctionError的解决方法
- python 多线程初试 与logger模块