2025年4月15日 星期二 乙巳(蛇)年 正月十六 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

Python+OpenGL进行立方体多纹理映射

时间:12-25来源:作者:点击数:23

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()

运行截图:

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门