Python实现立方体纹理映射
本文要点在于扩展库pyopengl的使用,接口与标准的OpenGL基本一致。
import sys
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from PIL import Image
class MyPyOpenGLTest:
#初始化OpenGL环境
def __init__(self, width = 640, height = 480, title = b'MyPyOpenGLTest'):
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)
#开始绘制立方体的每个面,同时设置纹理映射
#绘制四边形
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)
#绘制立方体的第二个面
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)
#绘制立方体的第三个面
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)
#绘制立方体的第四个面
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)
#绘制立方体的第五个面
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)
#绘制立方体的第六个面
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.2
self.y += 0.3
self.z += 0.1
#加载纹理
def LoadTexture(self):
#sample.bmp是纹理图像文件
img = Image.open('sample.bmp')
width, height = img.size
img = img.tobytes('raw', 'RGBX', 0, -1)
glBindTexture(GL_TEXTURE_2D, glGenTextures(1))
glPixelStorei(GL_UNPACK_ALIGNMENT,1)
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实现立方体纹理映射相关推荐
- Python+OpenGL进行立方体多纹理映射
Python扩展库pyopengl完美地封装了OpenGL,从而使得可以使用Python编写计算机图形学程序.如果使用pip在线安装不成功的话,可以下载whl文件然后本地安装. 本文代码使用Pytho ...
- python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...
原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...
- “Python小屋”免费资源汇总(截至2018年11月28日)
为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29个月以来推送过的700多篇文章清单,如果需要本清单的电子版,可以在公众号后台发送消息&quo ...
- python画正方体_python绘制立方体的方法
本文实例为大家分享了python绘制立方体的具体代码,供大家参考,具体内容如下 #!/usr/bin/env python # This is (almost) a direct C++ to Pyt ...
- (九)unity自带的着色器源码剖析之——————UnityShadowLibrary.cginc文件分析(实时阴影和烘焙阴影、阴影淡化、阴影渗漏处理、PCF阴影过滤解决实时阴影锯齿)
一.阴影与全局照明系统的关系 Unity3D引擎可以根据宏SHADOWS_SCREEN和LIGHTMAP_ON是否启用决定是否在全局照明系统下对阴影进行混合处理.如果这两个宏同时启用,则HANDLE_ ...
- Unity_Shader中级篇_10_Unity Shader入门精要
高级纹理 第七章学习了关于基础纹理的内容,这些纹理包括法线纹理.渐变纹理和遮罩纹理等.这些纹理尽管用处不同,但他们都属于低维(一维或二维)纹理.此时我们将学习一些更复杂的纹理.在10.1中我们会学习如 ...
- 【Unity Shader】用Cubemap实现天空盒和环境映射
1 关于Cubemap Cubemap在实时渲染中有很多应用,最常见的就是实现天空盒(Skybox)和环境映射(Environment Mapping). 2 实现天空盒 2.1 实现原理 天空盒不陌 ...
- Unity 高级纹理
立方体纹理 在图形学中,立方体纹理是环境映射的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了一层金属一样反射出周围的环境. 和之前的纹理不同,立方体纹理一共包含6 ...
- Unity-shader学习笔记(七)
文章目录 Unity-shader学习笔记(七) 15 更复杂的光照 15.1 Unity的渲染路径 15.1.1 前向渲染路径 15.1.1.1 前向渲染路径的原理 15.1.1.2 Unity中的 ...
最新文章
- linux系统中指定端口连接数限制
- session的存储方式和配置
- 清华大学计算机组成原理视频百度云,计算机组成原理第48讲:
- 如何为SAP OData消费维护不同的ABAP后端系统
- 网络研讨室_网络研讨会:Java 9的第一印象–构建可伸缩企业应用程序的新方法...
- 云OS:Linux在桌面打翻身仗的机会?
- 【C++ STL学习之一】容器的共通能力和共通操作总结
- python的类与继承
- shell 字符串包含关系
- 10个微型计算机应用的例子,微型计算机原理与接技术版简答题.doc
- java json 根据 key排序
- 使用Excel2016对数据进行线性回归分析
- 五、应用程序与驱动程序交互(缓冲模式)
- 电力软件系统测试报告,电力巡检系统测试报告-软件工程
- .NET性能相关书籍
- 多线程——分线程通过Handler操作界面
- Esxi 5下ROS5.18+Panabit
- 创业手记 Mr.Hua
- flex 4 dropdownlist skin自定义 1
- 【多媒体编解码】Openmax IL (一)官方文档概述
热门文章
- tcp重复的确认_TCP如何实现可靠性传输
- cbv继承view是哪个包_包你一眼就心动!两款帅爆国产轿车来袭,选谁都不错
- HTML中轮播图里的圆点不充满,老师好,轮播图中的小点不显示
- java select 不是date,iPhonedateselect器,而不是键盘?
- 如何跨服务器访问html 页面,html页面如何跨域访问另一页面内容,并将部分内容呈现出来?...
- 系统集成的系统架构图的相关的vsd素材_信息系统集成专业技术知识:软件架构...
- 常见30种数学建模模型_11.12|认识数学模型与数学建模许可
- 基于JAVA+Swing+MYSQL的电影院购票管理系统
- 决策树留一法python代码_ScikitLearn决策树算法类库使用小结
- hisicv200 exfat支持(转)