news 2026/9/18 13:16:25

Python+OpenGL绘制3D模型(六)材质文件载入和贴图映射

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python+OpenGL绘制3D模型(六)材质文件载入和贴图映射

系列文章

基础
Python+OpenGL绘制3D模型(一)Python 和 PyQt环境搭建
Python+OpenGL绘制3D模型(二)程序框架PyQt5
Python+OpenGL绘制3D模型(三)程序框架PyQt6
Python+OpenGL绘制3D模型(四)绘制线段
Python+OpenGL绘制3D模型(五)绘制三角型
Python+OpenGL绘制3D模型(六)材质文件载入和贴图映射
Python+OpenGL绘制3D模型(七)制作3dsmax导出插件
Python+OpenGL 杂谈(一)

高级
用 DeepDraw 几何引擎开发建筑设计软件(一):SketchUp 替代
用 DeepDraw 几何引擎开发建筑设计软件(二):下载DeepDraw
用 DeepDraw 几何引擎开发建筑设计软件(三):用代码绘制线段
用 DeepDraw 几何引擎开发建筑设计软件(四):用代码绘制面
用 DeepDraw 几何引擎开发建筑设计软件(五):创建选择工具
用 DeepDraw 几何引擎开发建筑设计软件(六):读取模型文件
用 DeepDraw 几何引擎开发建筑设计软件(七):InputPoint输入捕获器
用 DeepDraw 几何引擎开发建筑设计软件(八):画线工具
未完待续…

前言

Sketchup作为目前设计院最为流行的设计软件(非工程制图软件),深受设计师的喜爱,软件小巧,而功能强大,有不少为之开发的插件应运而生,不过呢,关于底层数据结构和工作原理相关的文章少之又少,本文意在填补一下这方面的空缺。


Python+OpenGL绘制3D模型(六)材质文件载入和贴图映射

运行效果:

文章目录

  • 系列文章
  • 前言
  • Python+OpenGL绘制3D模型(六)材质文件载入和贴图映射
    • 一、从文件读取贴图
    • 二、glBindTexture
    • 三、指定贴图坐标
    • 四、运行图效果
    • 五、2个问题和原因
    • 六、源代码
      • 1、Draw1.py
      • 2、tOpenGLqt5.py
  • 系列文章预告

一、从文件读取贴图

记得以前用c++写的时候,要编译链接图像库,用于对应图片格式的加载,每个用到的格式都要单独搞一遍,在网上找开源的图片库,下载,编译,测试,一套下来搞的人很累,现在,因为有Qt的加持,载入贴图变得非常简单,全部交给Qt来做,只需要几行代码

defload_texture_from_file(filepath):withopen(filepath,'rb')ashf:data=hf.read()image=QImage()valid=image.loadFromData(data)ifnotvalid:returnFalsegl_tex_obj=QOpenGLTexture(image.mirrored())returngl_tex_obj

图片载入到Qt后,还需要调用OpenGL的库加载贴图数据,另外Qt的图片坐标Y轴是向下增加的,符合显示屏幕坐标的习惯,而OpenGL中的Y轴坐标是正常向上的,所以Y轴需要mirror处理一下

is_built=Falsegl_tex=Nonedefdraw(gl):globalis_built,gl_texifnotis_built:gl_tex=load_texture_from_file("c:/temp/cg.jpg")is_built=True

为了代码保持简洁,简化接口,不要把简单的事情复杂化:
1、载入贴图后,对象保存到全局对象中,
2、载入模型的初始工作也内嵌到draw函数中执行,这种思维在项目越做越大也仍然实用
3、贴图路径使用了硬编码方式的绝对路径,在没有形成一个模型框架的时候,暂且用这种方式对测试减少不少工作量

演示用到的贴图文件下载:

二、glBindTexture

在绘制模型前,设置一下OpenGL的状态机,调用glBindTexture指定当前纹理单元的数据,然后调用glEnable(GL_TEXTURE)激活纹理单元,因为有贴图作为像素的输入颜色,所以颜色设为纯白

gl.glDisable(gl.GL_TEXTURE_2D)gl.glColor3f(0.9,0.83,0.6)# 绘制上下2个面draw_single_face(p1,p2,p3,p4,uv1,uv2,uv3,uv4,gl)draw_single_face(p5,p6,p7,p8,uv1,uv2,uv3,uv4,gl)gl_tex.bind()gl.glEnable(gl.GL_TEXTURE_2D)gl.glColor3f(1,1,1)# 绘制其他4个面,前,后,左,有draw_single_face(p1,p2,p6,p5,uv1,uv2,uv3,uv4,gl)draw_single_face(p3,p4,p8,p7,uv1,uv2,uv3,uv4,gl)draw_single_face(p2,p3,p7,p6,uv1,uv2,uv3,uv4,gl)draw_single_face(p4,p1,p5,p8,uv1,uv2,uv3,uv4,gl)

在本例中,前后左右的面映射了贴图,上下2个面仍然用了原来的模型颜色(淡黄色)

三、指定贴图坐标

在调用glVertex3f之前,需要先指定顶点的贴图坐标属性,调用glTexCoord2f

gl.glBegin(gl.GL_TRIANGLES)# 第一个顶点gl.glTexCoord2f(...)gl.glVertex3f(...)# 第二个顶点gl.glTexCoord2f(...)gl.glVertex3f(...)# 第三个顶点gl.glTexCoord2f(...)gl.glVertex3f(...)# 完成gl.glEnd()

四、运行图效果

五、2个问题和原因

第一、模型的位置有点高:

这是应为camera坐标系的中心为(0,0,0), 而模型高度是从 0.0 到 2.0,要调整一下中心坐标,可以通过设置概念上的world matrix沿Z轴往下移动1.0个单位,模型就居中了,目前程序框架里控制视角的平移,也可以通过这个方法来解决,不过我还是打算在之后引入Camera对象的计算,计算的逻辑思维更清晰,不容易出错

# Cameraself.gl.glMatrixMode(self.gl.GL_MODELVIEW)self.gl.glLoadIdentity()self.gl.glTranslatef(0.0,0.0,-self.zoom)self.gl.glRotatef(self.rotX-90,1.0,0.0,0.0)self.gl.glRotatef(self.rotZ,0.0,0.0,1.0)# Worldself.gl.glTranslatef(0.0,0.0,-1.0)# 在这里加上对world matrix的改变

这里的矩阵叠加,是按照相反的顺序乘积的,比较容易搞错,OpenGL中有个机制 PushMatrix PopMatrix,也就是说后面加入的矩阵,可以通过PopMatrix来恢复到之前的矩阵乘积的状态,越靠后面加进来的矩阵,代表子物体的矩阵,在运算中最先乘这个矩阵

第二、当模型放大的时候,近的地方会被切掉

调整下几行代码,

# Projectionself.gl.glMatrixMode(self.gl.GL_PROJECTION)pm=QMatrix4x4()aspectRatio=w/h fov=45/aspectRatioifw<helse45pm.perspective(fov,w/h,2,5000)self.gl.glLoadMatrixf(pm.data())

这里是设置透视投影矩阵的代码,pm.perspective(fov, w/h, 2, 5000),这个函数调用的最后2个参数,分别代表了近裁剪平面(z-buff=0.0),和远裁剪平面(z-buff=1.0),这2个值明显不太匹配当前场景的大小,每次应该根据当前场景大小来适当选择取值范围

pm
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 13:16:18

UltraISO光盘镜像制作与ISO文件系统深度解析

简介&#xff1a;本资源是一份面向初学者与系统维护人员的UltraISO光盘镜像制作实操指南&#xff0c;聚焦解决光盘备份、可启动系统盘创建及ISO文件管理等实际需求。文档以图文结合方式详解核心操作&#xff1a;从插入光盘后通过“工具→制作光盘映像文件”完成标准ISO生成&…

作者头像 李华
网站建设 2026/9/18 13:16:15

基本数据分析和统计描述

&#xff08;1&#xff09;首先安装、载入两个拓展包并导入数据#拓展包安装 install.packages(table1) install.packages(lubridate) library(table1) library(lubridate)#载入数据 load(diagnosis.Rdata)&#xff08;2&#xff09;进行一些分析前处理#新生成一个分类变量&…

作者头像 李华
网站建设 2026/9/18 13:14:37

130套中国风PPT模板:分类、配色、字体、版式与场景改造指南

这几年做汇报、做课件、帮朋友改路演材料&#xff0c;我电脑里攒下的PPT模板少说也有大几百套。但真正常用的&#xff0c;翻来覆去就那么一批中国风的。原因很简单&#xff1a;中国风模板的适用面比很多人想象的要宽得多&#xff0c;一场年终总结、一次传统文化主题的班会、一份…

作者头像 李华
网站建设 2026/9/18 13:13:09

电场线与等势面精解:带电粒子运动经典习题与易错点分析

简介&#xff1a;这是一份高中物理选修3-1静电学部分的经典习题集&#xff0c;适合正在学习电场、电势、电势能等概念的高中生以及需要备课的物理教师使用。题目围绕电场线、等势面、电势、电场强度、电势能与带电粒子在电场中的运动展开&#xff0c;既包含选择题也配有计算题&…

作者头像 李华
网站建设 2026/9/18 13:12:07

【Stable Diffusion】Plot参数组合XYZ图像对比

XYZ Plot 是 Stable Diffusion web UI 提供的一个强大工具,旨在帮助用户直观对比不同参数下生成的图像效果。通过 XYZ Plot,用户可以快速探索多种参数组合的效果,从而更高效地找到适合的参数设置。 本教程将详细介绍 XYZ Plot 的使用方法及其在参数选择中的应用案例,帮助用…

作者头像 李华
网站建设 2026/9/18 13:11:03

初中几何模型PDF的OCR识别与结构化知识库构建

简介&#xff1a;本资源是一份面向初中生及数学教师的几何专题复习资料&#xff0c;聚焦解决几何学习中“定理记不住、模型不会用、逻辑难梳理”的核心痛点。文件为单个4.76MB高清扫描PDF&#xff0c;内容由瑞德特刘教师系统整理&#xff0c;涵盖点线面基础、角与三角形、四边形…

作者头像 李华