python之OpenGL应用(五)变换

变换是指平移、旋转、缩放等操作,在Python代码中完成这些操作,需要安装相应的库。

1 安装PyGLM

OpenGL Mathematics(GLM )是一个基于GLSL的数学运算库,其GitHub站点为:g-truc/glm: OpenGL Mathematics (GLM) (github.com)

PyGLM是GLM的Python绑定,其GitHub站点为:Zuzu-Typ/PyGLM: Fast OpenGL Mathematics (GLM) for Python (github.com)

PyGLM的PyPi地址为:PyGLM · PyPI

使用之前,需要通过下面的pip命令安装:

bash 复制代码
pip install PyGLM

2 设置变换矩阵

OpenGL的变换操作主要通过变换矩阵实现,对应的代码如下:

python 复制代码
import numpy as np
import glfw
import glm

#创建变换矩阵
trans = glm.mat4(1.0)
#平移,范围在-0.5到0.5之间
trans = glm.translate(trans, glm.vec3(0.5, -0.5, 0.0) * np.sin(glfw.get_time()))
#绕z轴旋转
trans = glm.rotate(trans, glfw.get_time(), glm.vec3(0.0, 0.0, 1.0))
#缩放,范围在0.5-1.0之间
trans = glm.scale(trans, glm.vec3(1.0, 1.0, 0.0) * (np.sin(glfw.get_time()) * 0.5 + 0.5))

接着,新建一个顶点着色器文件transform.vs.glsl,将变换矩阵与坐标结合:

cpp 复制代码
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
 
out vec3 ourColor;
out vec2 TexCoord;
 
uniform mat4 transform;
 
void main()
{
    gl_Position = transform * vec4(aPos, 1.0);
    ourColor = aColor;
    TexCoord = aTexCoord;
}

对应的片段着色器文件transform.fs.glsl:

cpp 复制代码
#version 330 core
out vec4 FragColor;
 
in vec3 ourColor;
in vec2 TexCoord;
 
uniform sampler2D texture1;
uniform sampler2D texture2;
 
void main()
{
    FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.2);
}

3 完整的代码

python 复制代码
import glfw as glfw
from OpenGL.GL import *
import numpy as np
from PIL.Image import open
import glm as glm
 
import shader as shader
 
glfw.init()
window = glfw.create_window(800, 600, "shader", None, None)
glfw.make_context_current(window)
 
VAO = glGenVertexArrays(1)
glBindVertexArray(VAO)

vertices = np.array([   # 位置               颜色
                     0.5, -0.5, 0.0,  1.0, 0.0, 0.0, 1.0, 0.0,  # 右下
                    -0.5, -0.5, 0.0,  0.0, 1.0, 0.0, 0.0, 0.0,  # 左下
                     0.0,  0.5, 0.0,  0.0, 0.0, 1.0, 0.5, 1.0,  # 顶部
                    ])

VBO = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, VBO)
glBufferData(GL_ARRAY_BUFFER, 8 * vertices.size, vertices, GL_STATIC_DRAW)
glVertexAttribPointer(0, 3, GL_DOUBLE, GL_FALSE, int(8 * 8), None)
glEnableVertexArrayAttrib(VAO, 0)
glVertexAttribPointer(1, 3, GL_DOUBLE, GL_FALSE, int(8 * 8), ctypes.c_void_p(8 * 3))
glEnableVertexArrayAttrib(VAO, 1)

#纹理设置
glVertexAttribPointer(2, 2, GL_DOUBLE, GL_FALSE, int(8 * 8), ctypes.c_void_p(8 * 6))
glEnableVertexArrayAttrib(VAO, 2)
 
image = open('images\container.jpg')
texture = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, texture)
# 为当前绑定的纹理对象设置环绕、过滤方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.size[0], image.size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, image.tobytes())
glGenerateMipmap(GL_TEXTURE_2D)
 
shader = shader.Shader("./glsl/transform.vs.glsl", "./glsl/transform.fs.glsl")
 
while not glfw.window_should_close(window):
    glClearColor(0.2, 0.3, 0.3, 1.0)
    glClear(GL_COLOR_BUFFER_BIT)
 
    trans = glm.mat4(1.0)
    trans = glm.translate(trans, glm.vec3(0.5, -0.5, 0.0)*np.sin(glfw.get_time()))
    trans = glm.rotate(trans, glfw.get_time(), glm.vec3(0.0, 0.0, 1.0))
    trans = glm.scale(trans, glm.vec3(1.0, 1.0, 0.0)*(np.sin(glfw.get_time())*0.5+0.5))
 
    shader.use()
    glUniformMatrix4fv(glGetUniformLocation(shader.shaderProgram, 'transform'), 1, GL_FALSE, glm.value_ptr(trans))
 
    glBindVertexArray(VAO)
    glActiveTexture(GL_TEXTURE0)  # 在绑定纹理之前先激活纹理单元
    glBindTexture(GL_TEXTURE_2D, texture)
    glDrawArrays(GL_TRIANGLES, 0, 3)
    glfw.swap_buffers(window)
    glfw.poll_events()
 
shader.delete()

运行结果:

20260315_194424

参考资料:

基于Python的OpenGL 04 之变换 - 当时明月在曾照彩云归 - 博客园

变换 - LearnOpenGL CN

相关推荐
LiAo_1996_Y1 分钟前
CSS实现多列等高布局_浮动布局的高级处理技巧
jvm·数据库·python
Jenlybein2 分钟前
用 uv 替代 conda,速度飙升(从 0 到 1 开始使用 uv)
后端·python·算法
格林威13 分钟前
面阵相机 vs 线阵相机:堡盟与海康相机选型差异全解析 附Python实战演示
开发语言·人工智能·python·数码相机·计算机视觉·视觉检测·工业相机
Vect__15 分钟前
快速掌握Python之基础语法和数据结构
开发语言·python
HHHHH1010HHHHH15 分钟前
HTML函数在笔记本上卡顿怎么办_笔记本运行HTML函数优化操作【操作】
jvm·数据库·python
djjdjdjdjjdj23 分钟前
CSS如何实现元素淡入淡出显示_结合animation与opacity属性
jvm·数据库·python
m0_6845019824 分钟前
Go 中实现方法级执行时间监控的生产就绪方案
jvm·数据库·python
LiAo_1996_Y27 分钟前
Python机器学习怎么防止数据泄漏_确保Scaler在Pipeline内拟合
jvm·数据库·python
夏恪27 分钟前
php怎么实现数据库备份加密_php如何压缩并AES加密导出SQL文件
jvm·数据库·python
tjc1990100531 分钟前
SQL如何实现跨行数据比较分析_LEAD函数处理数据同步问题
jvm·数据库·python