<五>初探opengl,变换我们的图形

  这节主要是对我们的纹理矩形进行一下变换,例如缩放,旋转,中间需要运用到一些线性代数的东西这里就不再阐述,因为我自己也不怎么会。。。我们直接介绍代码怎么写吧。

  矩阵的相乘是从右往左读取的,这点提醒一下自己。

  

GLM

  代码中大部分的矩阵处理信息都是通过glm库来处理的,全称OPENGL MATHEMATICS ,去这里下载,把glm文件夹放到工程的include下即可。代码i引入文件库

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

我们尝试一下把图案先逆时针旋转90度,然后缩放0.5倍,代码可以这么写:

glm::mat4 trans = glm:mat4(1.0f); //初始化为4*4都是1.0f的矩阵
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0)); //绕着z轴逆时针旋转90度
trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5)); //缩放为0.5

此刻trans就是包含这2个变换的矩阵了,我们把他乘以顶点就可以得到变换后的矩阵

顶点着色器修改为:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec2 TexCoord;

uniform mat4 transform; //这里设定一个变换矩阵

void main()
{
    gl_Position = transform * vec4(aPos, 1.0f); //实现变换
    TexCoord = vec2(aTexCoord.x, 1.0 - aTexCoord.y);
}

然后我们需要从代码里传入我们的变换矩阵供给着色器使用

unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans)); //第一个是参数位置,第二个是矩阵数量,第三个是是否开启矩阵置换,就是行和列换过来,这里不需要。第四个是矩阵指针

这个时候,应该变换成功了。

  我们玩点花样,让图案转动起来,我们在传入旋转角度的时候加上时间变量

glm::mat4 trans;
trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));
trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

这样,就能旋转起来了,这里是先旋转,再进行位移,和我提醒的一致。

原文地址:https://www.cnblogs.com/usp10/p/9290889.html

时间: 2024-07-31 23:45:49

<五>初探opengl,变换我们的图形的相关文章

&lt;五&gt;初探opengl,编写我们的镜头

现在我们尝试编写一个镜头类,有了这个类,我们能上下左右前后移动,感觉在玩fps游戏,很不错,下面开始看看怎么写. 初次接触镜头类是我在魔兽地图编辑中,当时创建一个镜头的步骤就是放到某个位置,调节角度,分别有3个角度可以调节,一个是类似高度一样的东西,一个是环绕着某个点的旋转角度,还有就是镜头的旋转.opengl镜头其实跟这个是差不多的. 1.首先我们需要定一个摄像机位置 ,也就是把摄像机放到什么位置去 2.然后我们要定一个目标位置,这个决定我们摄像机观察的方向 3.然后就是一个上向量,这个一般为

openGL实现二维图形和三维图形

openGL是一个强大的底层图形库,其命令最初的时候使用C语言实现的.openGL定义了一个图形程序接口,常用于制作处理三维图像,功能强大,调用方便,在图像处理十分受欢迎. 实现图形主要使用的是openGL的一个工具包:GLUT. GLUT (pronounced like the glut in gluttony) is the OpenGL Utility Toolkit, a window system independent toolkit for writing OpenGL prog

OpenGL变换

概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTION矩阵 概述 OpenGL管线中,在光栅化操作之前,包括顶点位置与法线向量的几何数据经顶点操作与图元装配操作进行变换. 模型坐标 它是模型对象的局部坐标系,同时也是任何变换之前模型对象的初始位置与朝向.为了变换模型对象,可以使用glRotatef().glTranslatef().glScalef(). 观察坐标 它由模型坐标乘以GL_MODELVIEW矩阵产生.在OpenGL中,可以使用GL_MODE

SDL2+OpenGL (2)绘制立体图形

绘制正四面体,即从四个面依次绘制三角形,其他立体图形方法类似 1 #include <GL/glew.h> 2 #include <SDL2/SDL.h> 3 #include <SDL2/SDL_opengl.h> 4 5 bool quit; 6 SDL_Window* window; 7 SDL_GLContext glContext; 8 SDL_Event sdlEvent; 9 GLfloat rtri=0; 10 bool Init() 11 { 12 S

关于c#winform用sharpGL(OpenGL)绘制不出图形,绘制窗口是个黑框的坑

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11790309.html 在c++的opengl中可能是因为是最基本的库,很多东西都把你做好了 转到c#下用大牛们对opengl的支持库,比如sharpGL,使用起来需要非常的严谨 就比如: gl.Color(0.0f, 0.0f, 1.0f);这个设置颜色的代码 在c++下不管是0.0f也好还是0也好都可以,而在c#下sharpGL没有写0.0f的这种格式 图像就完全绘制不出来.让你完全找不

从零开始openGL—— 二、 基本图形绘制

前言 这是从零开始openGL系列文章的第二篇,在上篇文章中介绍了基本的环境配置,这篇文章将介绍如何绘制基本图形(圆.三角形.立方体.圆柱.圆锥). 基本框架 下面这里我先给出opengl的3D绘图的基本框架 #include <windows.h> #include <string.h> #include <stdlib.h> #include <gl\glui.h> #include <math.h> #include "commo

简单一个opengl程序,2D图形移动

很早打算系统的学习一下opengl,但是由于课程以及学习算法占据了时间,一直没能开始,现在这段时间开始弄opengl了,这几天看正在看<Opengl 变成指南 第8版>,首先看了GLSL写shader.这里先使用固定管线写个简单的小例子试试,然后开始进行可编程管线. 这个小例子很简单,就是在2D平面画个正方形,然后左右移动. 思路很简单,主要是两个函数,draw 和 move,draw负责绘制,move负责移动的控制,然后设置两个回调函数,glutDisplayFunc和glutIdleFun

五十二 常用第三方模块 图形界面

Python支持多种图形界面的第三方库,包括: Tk wxWidgets Qt GTK 等等. 但是Python自带的库是支持Tk的Tkinter,使用Tkinter,无需安装任何包,就可以直接使用.本章简单介绍如何使用Tkinter进行GUI编程. Tkinter 我们来梳理一下概念: 我们编写的Python代码会调用内置的Tkinter,Tkinter封装了访问Tk的接口: Tk是一个图形库,支持多个操作系统,使用Tcl语言开发: Tk会调用操作系统提供的本地GUI接口,完成最终的GUI.

模式识别(Pattern Recognition)学习笔记(三十五)-- K-L变换与PCA

K-L变换的理论知识 K-L变换是除了PCA外的另一种常用的特征提取方法,它有很多种形式,最基本的形式跟PCA类似,它跟PCA的不同在于,PCA是一种无监督的特征变换,而K-L变换能够考虑到不同的分类信息,实现有监督的特征提取. 根据随机过程中的KL展开理论,将随机过程描述为无数个正交函数的线性组合,而在模式识别问题中,通常可以将一个样本看成是随机向量的某一次实现结果,所以假设有一d维随机向量x,可以写成一组正交基的线性组合,且它们的模为1: 对上式变形得到: