Python+OpenGL进行立方体多纹理映射
Python扩展库pyopengl完美地封装了OpenGL,从而使得可以使用Python编写计算机图形学程序。如果使用pip在线安装不成功的话,可以下载whl文件然后本地安装。
本文代码使用Python+OpenGL对立方体进行贴图,并且每个面的纹理不相同。之前发过一个类似的,不过那个是6个面的纹理一样,见Python实现立方体纹理映射
import sys
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from PIL import Image
class MyPyOpenGLTest:
def __init__(self,
width=640,
height=480,
title='MyPyOpenGLTest'.encode()):
glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(width, height)
self.window = glutCreateWindow(title)
glutDisplayFunc(self.Draw)
glutIdleFunc(self.Draw)
self.InitGL(width, height)
#绕各坐标轴旋转的角度
self.x = 0.0
self.y = 0.0
self.z = 0.0
#绘制图形
def Draw(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
#沿z轴平移
glTranslate(0.0, 0.0, -5.0)
#分别绕x,y,z轴旋转
glRotatef(self.x, 1.0, 0.0, 0.0)
glRotatef(self.y, 0.0, 1.0, 0.0)
glRotatef(self.z, 0.0, 0.0, 1.0)
#开始绘制立方体的每个面,同时设置纹理映射
glBindTexture(GL_TEXTURE_2D, 0)
#绘制四边形
glBegin(GL_QUADS)
#设置纹理坐标
glTexCoord2f(0.0, 0.0)
#绘制顶点
glVertex3f(-1.0, -1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(-1.0, 1.0, 1.0)
glEnd()
#切换纹理
glBindTexture(GL_TEXTURE_2D, 1)
glBegin(GL_QUADS)
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, -1.0)
glEnd()
#切换纹理
glBindTexture(GL_TEXTURE_2D, 2)
glBegin(GL_QUADS)
glTexCoord2f(0.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, 1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glEnd()
#切换纹理
glBindTexture(GL_TEXTURE_2D, 3)
glBegin(GL_QUADS)
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, -1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glEnd()
#切换纹理
glBindTexture(GL_TEXTURE_2D, 4)
glBegin(GL_QUADS)
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, -1.0, -1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glEnd()
#切换纹理
glBindTexture(GL_TEXTURE_2D, 5)
glBegin(GL_QUADS)
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, 1.0, 1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
#结束绘制
glEnd()
#刷新屏幕,产生动画效果
glutSwapBuffers()
#修改各坐标轴的旋转角度
self.x += 0.02
self.y += 0.03
self.z += 0.01
#加载纹理
def LoadTexture(self):
# 提前准备好的6个图片
imgFiles = [str(i)+'.jpg' for i in range(1,7)]
for i in range(6):
img = Image.open(imgFiles[i])
width, height = img.size
img = img.tobytes('raw', 'RGBX', 0, -1)
glGenTextures(2)
glBindTexture(GL_TEXTURE_2D, i)
glTexImage2D(GL_TEXTURE_2D, 0, 4,
width, height, 0, GL_RGBA,
GL_UNSIGNED_BYTE,img)
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_T, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexEnvf(GL_TEXTURE_ENV,
GL_TEXTURE_ENV_MODE, GL_DECAL)
def InitGL(self, width, height):
self.LoadTexture()
glEnable(GL_TEXTURE_2D)
glClearColor(1.0, 1.0, 1.0, 0.0)
glClearDepth(1.0)
glDepthFunc(GL_LESS)
glShadeModel(GL_SMOOTH)
#背面剔除,消隐
glEnable(GL_CULL_FACE)
glCullFace(GL_BACK)
glEnable(GL_POINT_SMOOTH)
glEnable(GL_LINE_SMOOTH)
glEnable(GL_POLYGON_SMOOTH)
glMatrixMode(GL_PROJECTION)
glHint(GL_POINT_SMOOTH_HINT,GL_NICEST)
glHint(GL_LINE_SMOOTH_HINT,GL_NICEST)
glHint(GL_POLYGON_SMOOTH_HINT,GL_FASTEST)
glLoadIdentity()
gluPerspective(45.0, float(width)/float(height), 0.1, 100.0)
glMatrixMode(GL_MODELVIEW)
def MainLoop(self):
glutMainLoop()
if __name__ == '__main__':
w = MyPyOpenGLTest()
w.MainLoop()
运行截图:
Python+OpenGL进行立方体多纹理映射相关推荐
- python 3d绘图立方体_python绘制3D立方体
我想绘制一个平行六面体.其实我从python脚本开始画立方体为:python绘制3D立方体 import numpy as np from mpl_toolkits.mplot3d import Ax ...
- Python+OpenGL实现虚拟场景中不同物体的拾取与选择
开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...
- Python+OpenGL使用Cohen-Sutherland算法实现直线裁剪
推荐教材: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年12月第11次印刷,山东省一流 ...
- OpenGL学习-立方体+圆柱体
OpenGL学习-立方体+圆柱体 开发环境搭建参考:https://lexiaoyuan.blog.csdn.net/article/details/120059213 通用配置步骤 Visual S ...
- Python+Opengl 圆柱的实现
Python+Opengl 圆柱的实现 可以先从画一个圆开始 画第二个圆 画侧面 不知道有多少人像我一样,在刚接触OpenGL时,要画一个圆柱却不知从何下手. 本人Python和OpenGL纯新手,因 ...
- python 粒子动画_初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞
我认为比较完善的GPU粒子系统应该如下,粒子初始化可以放在CPU里,但是相关数据运算首先要放在GPU里,并且运算后的数据也应该放在显存里,而不是内存里.故用第三篇实现GPU粒子系统不满足,因为他数据是 ...
- python opengl加速_OpenGL with python 渲染加速
在python的OpenGL环境下搭了一个简易的加载gltf动画的框架.测试的时候发现渲染很耗时,做了一些零碎的优化,现在的速度还算令人满意.印象比较深的一个优化是针对joint matrix的数据传 ...
- 【转】OpenGL超级宝典笔记——纹理映射Mipmap
原文地址 http://my.oschina.net/sweetdark/blog/177812 , 感谢作者,若非法转载请联系本人. 目录[-] Mipmapping Mipmap过滤 构建Mip层 ...
- Python+OpenGL切分图形窗口在多视区中显示不同动画
开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...
最新文章
- ubuntu自定义命令
- MyBatis知多少(14)分散的数据库系统
- php不能加载oci8,无法加载动态库'oci8.so'(PHP 7.2)
- pythondict增加-python字典键值对的添加和遍历方法
- P4782-[模板]2-SAT问题【tarjan】
- static代码块什么时候运行_健康的代码:什么时候该注释?
- C#开发笔记之17-如何用C#深克隆一个对象(传统方案)?
- Entity Framework Core导航属性加载问题
- 苹果也开始打价格战了
- Shell 脚本实例
- 两年前,梦开始的地方.
- 大学计算机vb基础知识6,计算机基础课-VB6选择题汇编(2011-2016)
- 电脑桌面图标变成长方形咋办_电脑桌面图标间距自动变宽为什么
- 16进制发送 mqtt客户端调试工具_MQTT调试工具
- android 万能视频播放器源码,Android万能视频播放器05-音视频同步
- iOS 新浪微博客户端Demo实践之(六) 微博评论列表页面和发评论
- 为什么学习嵌入式会搞单片机以及如何学习C51单片机
- Java和Spring:发送邮件(以QQ邮箱为例)
- 页面布局(1):淘宝首页
- IDEA系列:最新IntelliJ IDEA下载地址(社区版和专业版)
热门文章
- 为什么C语言输出结果总是1,c语言编程问题这个题我哪里错了输出结果总是0
- java sql 写入万条数据_如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快
- 2019安装软件安装管家_【软件安装管家】Br 2019软件安装包+安装教程
- Java并行计算线程池_干货!线程池+CountDownLatch,实现 多线程并发计算、汇总
- mysql索引缓存的内容_mysql服务器变量、缓存及索引
- html剧场座位设计图,如何设计剧院座位,21个细部案例
- e2 android,魅蓝E2做工怎么样?魅蓝手机E2拆机全过程图解
- AIX 6.1 连接DS4700,多路径mpio,mpio_get_config -Av 需要打补丁。
- 基于JAVA+SpringMVC+Mybatis+MYSQL的在线书城购物网站
- 基于JAVA+SpringMVC+Mybatis+MYSQL的旅游景点酒店预订网站设计