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实现的防DDoS脚本
Feb 08 Python
Python中使用hashlib模块处理算法的教程
Apr 28 Python
windows系统下Python环境的搭建(Aptana Studio)
Mar 06 Python
python3 遍历删除特定后缀名文件的方法
Apr 23 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
python3.7.0的安装步骤
Aug 27 Python
python实现一组典型数据格式转换
Dec 15 Python
python ipset管理 增删白名单的方法
Jan 14 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
Python 操作 MySQL数据库
Sep 18 Python
python smtplib发送多个email联系人的实现
Oct 09 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 23 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
php 日期时间处理函数小结
2009/12/18 PHP
php mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
AngularJS入门教程之表格实例详解
2016/07/27 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
2019/12/29 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
Python编程之属性和方法实例详解
2015/05/19 Python
Python的Django框架中的数据库配置指南
2015/07/17 Python
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
佐卡伊官网:中国知名珠宝品牌
2017/02/05 全球购物
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
给排水工程师岗位职责
2013/11/21 职场文书
幼儿园家长寄语
2014/04/02 职场文书
计生个人工作总结
2015/02/28 职场文书
部门2015年度工作总结
2015/04/29 职场文书
污水处理保证书
2015/05/09 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android