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进行立方体多纹理映射相关推荐

  1. python 3d绘图立方体_python绘制3D立方体

    我想绘制一个平行六面体.其实我从python脚本开始画立方体为:python绘制3D立方体 import numpy as np from mpl_toolkits.mplot3d import Ax ...

  2. Python+OpenGL实现虚拟场景中不同物体的拾取与选择

    开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...

  3. Python+OpenGL使用Cohen-Sutherland算法实现直线裁剪

    推荐教材: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年12月第11次印刷,山东省一流 ...

  4. OpenGL学习-立方体+圆柱体

    OpenGL学习-立方体+圆柱体 开发环境搭建参考:https://lexiaoyuan.blog.csdn.net/article/details/120059213 通用配置步骤 Visual S ...

  5. Python+Opengl 圆柱的实现

    Python+Opengl 圆柱的实现 可以先从画一个圆开始 画第二个圆 画侧面 不知道有多少人像我一样,在刚接触OpenGL时,要画一个圆柱却不知从何下手. 本人Python和OpenGL纯新手,因 ...

  6. python 粒子动画_初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞

    我认为比较完善的GPU粒子系统应该如下,粒子初始化可以放在CPU里,但是相关数据运算首先要放在GPU里,并且运算后的数据也应该放在显存里,而不是内存里.故用第三篇实现GPU粒子系统不满足,因为他数据是 ...

  7. python opengl加速_OpenGL with python 渲染加速

    在python的OpenGL环境下搭了一个简易的加载gltf动画的框架.测试的时候发现渲染很耗时,做了一些零碎的优化,现在的速度还算令人满意.印象比较深的一个优化是针对joint matrix的数据传 ...

  8. 【转】OpenGL超级宝典笔记——纹理映射Mipmap

    原文地址 http://my.oschina.net/sweetdark/blog/177812 , 感谢作者,若非法转载请联系本人. 目录[-] Mipmapping Mipmap过滤 构建Mip层 ...

  9. Python+OpenGL切分图形窗口在多视区中显示不同动画

    开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...

最新文章

  1. ubuntu自定义命令
  2. MyBatis知多少(14)分散的数据库系统
  3. php不能加载oci8,无法加载动态库'oci8.so'(PHP 7.2)
  4. pythondict增加-python字典键值对的添加和遍历方法
  5. P4782-[模板]2-SAT问题【tarjan】
  6. static代码块什么时候运行_健康的代码:什么时候该注释?
  7. C#开发笔记之17-如何用C#深克隆一个对象(传统方案)?
  8. Entity Framework Core导航属性加载问题
  9. 苹果也开始打价格战了
  10. Shell 脚本实例
  11. 两年前,梦开始的地方.
  12. 大学计算机vb基础知识6,计算机基础课-VB6选择题汇编(2011-2016)
  13. 电脑桌面图标变成长方形咋办_电脑桌面图标间距自动变宽为什么
  14. 16进制发送 mqtt客户端调试工具_MQTT调试工具
  15. android 万能视频播放器源码,Android万能视频播放器05-音视频同步
  16. iOS 新浪微博客户端Demo实践之(六) 微博评论列表页面和发评论
  17. 为什么学习嵌入式会搞单片机以及如何学习C51单片机
  18. Java和Spring:发送邮件(以QQ邮箱为例)
  19. 页面布局(1):淘宝首页
  20. IDEA系列:最新IntelliJ IDEA下载地址(社区版和专业版)

热门文章

  1. 为什么C语言输出结果总是1,c语言编程问题这个题我哪里错了输出结果总是0
  2. java sql 写入万条数据_如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快
  3. 2019安装软件安装管家_【软件安装管家】Br 2019软件安装包+安装教程
  4. Java并行计算线程池_干货!线程池+CountDownLatch,实现 多线程并发计算、汇总
  5. mysql索引缓存的内容_mysql服务器变量、缓存及索引
  6. html剧场座位设计图,如何设计剧院座位,21个细部案例
  7. e2 android,魅蓝E2做工怎么样?魅蓝手机E2拆机全过程图解
  8. AIX 6.1 连接DS4700,多路径mpio,mpio_get_config -Av 需要打补丁。
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的在线书城购物网站
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的旅游景点酒店预订网站设计