Python OpenGL基本配置方式


Posted in Python onMay 20, 2022

OpenGL基本配置方式

参考:http://pyopengl.sourceforge.net

pip 安装 PyOpenGL

pip install PyOpenGL PyOpenGL_accelerate

测试代码

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
 
def init():
    glClearColor(1,1,1,1)
    gluOrtho2D(-1,1,-1,1)
 
def triangle():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(1,0,0)
    glBegin(GL_TRIANGLES)
 
    glColor3f(1,0,0)
    glVertex2f(-1, -1)
    
    glColor3f(0,1,0)
    glVertex2f(1, -1)
    
    glColor3f(0,0,1)
    glVertex2f(0, 1)
    
    glEnd()
    glFlush()
 
def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(800,600)
    glutInitWindowPosition(50,50)
    glutCreateWindow("Triangle")
    glutDisplayFunc(triangle)
    init()
    glutMainLoop()
 
if __name__ == '__main__':
    main()

运行结果,绘制出一个彩色三角形:

Python OpenGL基本配置方式

Python+OpenGL库理解及代码应用

1.读取off文件

使用工具库(GLUT)创建 OpenGL 应用程序只需要四步:

(1)初始化glut库:glutInit()

(2)创建glut窗口:glutCreateWindow('Quidam Of OpenGL')

(3)注册绘图的回调函数: glutDisplayFunc(draw)

(4)进入glut主循环: glutMainLoop()

除了基本组成以外还可以:

(5)设置窗口初始显示模式:初始化 glut 库的时候,一般要用 glutInitDisplayMode() 来设置初始的显示模式。例如:

glutInitDisplayMode( GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)

 (6)初始化画布

glClearColor(0.0, 0.0, 0.0, 1.0) # 设置画布背景色。注意:这里必须是4个参数	
glEnable(GL_DEPTH_TEST)          # 开启深度测试,实现遮挡关系	
glDepthFunc(GL_LEQUAL)           # 设置深度测试函数

关于draw()函数的基本组成:

(1)清除屏幕及深度缓存

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

(2)设置投影

投影设置也是每次重绘都需要的步骤之一。glOrtho() 用来设置平行投影,glFrustum() 用来设置透视投影。这两个函数的参数相同,都是视景体的 left / right / bottom / top / near / far 六个面。视景体的 left / right / bottom / top 四个面围成的矩形,就是视口。near 就是投影面,其值是投影面距离视点的距离,far 是视景体的后截面,其值是后截面距离视点的距离。far 和 near 的差值,就是视景体的深度。视点和视景体的相对位置关系是固定的,视点移动时,视景体也随之移动。假设 view 是视景体,width 和 height 是窗口的宽度和高度,在投影变换之前,需要先声明是对投影矩阵的操作,并将投影矩阵单位化:

glMatrixMode(GL_PROJECTION)   ,含义为选定矩阵为模型-观察变换 矩阵

OpenGL中的变换命令都是对当前矩阵(当前矩阵为以后图形变换所要使用的矩阵)进行操作,因此在选定可修#改矩阵后,应首先用glLoadIdentity()命令设置当前操作矩阵为单位矩阵

glMatrixMode(GL_PROJECTION)	
glLoadIdentity()	
if width > height:	
  k = width / height	
  glFrustum(view [0]*k, view [1]*k, view [2], view [3], view [4], view [5])	
else:	
  k = height / width	
  glFrustum(view [0], view [1], view [2]*k, view [3]*k, view [4], view [5])

 (3)设置视点

视点是和视景体关联的概念。设置视点需要考虑眼睛在哪儿、看哪儿、头顶朝哪儿,分别对应着eye, lookat 和 eye_up 三个向量.

gluLookAt(	
       #设置相机在世界坐标系中的位置
       eye[0], eye[1], eye[2], 	
       #相机镜头对准的物体在世界坐标系中的位置
       look_at[0], look_at[1], look_at[2],
	   #相机向上的方向在世界坐标系中的方向
       eye_up[0], eye_up[1], eye_up[2]	
   )

(4)设置视口 

视口的大小和尺寸是在窗口坐标系中进行度量的, 默认状 态下其坐标原点位于窗口的左下角,其尺寸与窗口的大小 相同

#glViewport(GLint x, Glint y, Glsizei width, Glsizei height)
glViewport(0, 0, width, height)

(5)设置模型变换

模型平移、旋转、缩放等几何变换,需要切换到模型矩阵:

glMatrixMode(GL_MODELVIEW)	
glLoadIdentity()
#平移操作函数
glTanslate(x,y,z)
#平移,(x,y,z,1)乘以 N(4x4矩阵)进行矩阵变换
glMultMatrixf(N)
#旋转函数,绕矢量v=(x,y,z)T逆时针方向旋转angle指定的角度。  
glRotate(angle,x,y,z)
#缩放函数	
glScale(1.0, 1.0, 1.0)

同时使用视图变换和模型变换,需要先调用视图变换函数,后调用模型变换函数,以保证模型变换首先对物体起作用。

多种变换组合调用顺序 ,写函数的时候要注意顺序,否则可能不起作用

Python OpenGL基本配置方式

具体代码分析

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import numpy as np
 
def readOFF():
    file_path = '../off/m1.off'
    f = open(file_path, 'r', encoding='utf-8')
    lines = f.readlines()
    m = []
    n = []
    #把off文件中数据按行读取出来,存储到列表中,由于边数事先看了为0,所以没遍历边,如果边不为0,记得遍历,并在后文加上边的绘制
    for line in lines:
        m.append(line.split())
    for i in range(len(m)):
        #跳过第一行的OFF
        if m[i][0] == 'OFF':
            continue
        #记录定点数,面片数和边数
        elif i == 1:
            v_cout = int(m[i][0])
            f_count = int(m[i][1])
            e_count = int(m[i][2])
            continue
        #把字符型数据转化为数值型数据
        else:
            for j in range(len(m[i])):
                m[i][j] = float(m[i][j])
            n.append(m[i])
    return v_cout, f_count, e_count, n
 
 
#绘画模型
def draw():
    global angle
    #读取OFF文件包含的顶点,面片,边和off文件存储数据信息
    v_cout, f_count, e_count, n = readOFF()
    # 设置渲染背景
    glClearColor(0.0, 0.0, 0.0, 0.0)
    #清除缓存
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    # 设置投影(透视投影)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    # 投影变换
    gluPerspective(100, 1, 0.5, 100)
 
    angle += 0.05
    while angle > 360:
        angle -= 360
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    # 视口变换
    glViewport(100, 100, 500, 500)
    #设置观察变换
    #设置视点
    gluLookAt(
        -5, 5, 0,
        0, 0, 0,
        0, 1, 0,
    )
    #设置模型变换
    #平移
    glTranslate(1, 1, 0)
    #旋转
    glRotatef(angle, -5, 5, 0)
    # 缩放
    glScalef(5, 5, 5)
 
    for i in range(f_count):
        #获取顶点个数,和顶点信息
        cout , a, b, c = n[v_cout + i]
        cout, a, b, c=int(cout) ,int(a) ,int(b) ,int(c)
        #得到顶点位置
        a1, a2, a3 = n[a]
        b1, b2, b3 = n[b]
        c1, c2, c3 = n[c]
        #绘制多面体
        glBegin(GL_POLYGON)
        glVertex3f(a1, a2, a3)
        glVertex3f(b1, b2, b3)
        glVertex3f(c1, c2, c3)
        glEnd();
    # 刷新缓存
    glFlush()
 
#关闭窗口
def close(key,x,y):
    if key==b'\x1b':
        glutDestroyWindow(win_id)
 
if __name__ == "__main__":
    angle = 0
    # 初始化glut窗口
    glutInit()
    # 设置窗口显示模式:RGBA四通道|单缓存|深度
    glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH)
    # 初始化窗口大小
    glutInitWindowSize(1000, 800)
    # 创建窗口
    win_id = glutCreateWindow("CUBE")
    # 设置渲染函数
    glutDisplayFunc(draw)
    # 设置窗口空闲时函数
    glutIdleFunc(draw)
    # 开启深度测试
    glEnable(GL_DEPTH_TEST)
    # 开启窗口主循环
    glutMainLoop()

Tags in this post...

Python 相关文章推荐
python django集成cas验证系统
Jul 14 Python
Python编程中对文件和存储器的读写示例
Jan 25 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 Python
使用Python爬取最好大学网大学排名
Feb 24 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
Oct 11 Python
Numpy中np.max的用法及np.maximum区别
Nov 27 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 Python
Python面试不修改数组找出重复的数字
May 20 #Python
Python 中面向接口编程
May 20 #Python
人工智能深度学习OpenAI baselines的使用方法
May 20 #Python
baselines示例程序train_cartpole.py的ImportError
May 20 #Python
python通过新建环境安装tfx的问题
May 20 #Python
Python使用BeautifulSoup4修改网页内容
May 20 #Python
python标准库ElementTree处理xml
May 20 #Python
You might like
PHP 实例化类的一点摘记
2008/03/23 PHP
php 购物车的例子
2009/05/04 PHP
PHP 开源AJAX框架14种
2009/08/24 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
深入分析JSON编码格式提交表单数据
2015/06/25 Javascript
jquery图片滚动放大代码分享(1)
2015/08/25 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
2020/09/24 Javascript
js实现简易ATM功能
2020/10/27 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
python打造爬虫代理池过程解析
2019/08/15 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
Python matplotlib实时画图案例
2020/04/23 Python
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
枚举与#define宏的区别
2014/04/30 面试题
AJAX都有哪些有点和缺点
2012/11/03 面试题
外贸会计专业自荐信
2014/06/22 职场文书
公司搬迁通知
2015/04/20 职场文书
小学生表扬稿范文
2015/05/05 职场文书