精华内容
下载资源
问答
  • OpenGL】二十、OpenGL 矩阵变换 ( 矩阵缩放变换 | 矩阵旋转变换 | 矩阵平移变换 ) https://hanshuliang.blog.csdn.net/article/details/112859256 博客源码 ( 该源码是 Windows 桌面程序 , 使用 Visual Studio ...
  • OpenGL缩放转换

    2021-03-20 10:52:48
    OpenGL缩放转换OpenGL缩放转换简介源代码剖析主要源代码 OpenGL缩放转换简介 此转换的目的是增大或减小对象的大小。如果要使用单个模型(例如,使用相同模型的大大小小的树)添加多样性,或者要将模型大小映射到现实...

    OpenGL缩放转换简介

    此转换的目的是增大或减小对象的大小。如果要使用单个模型(例如,使用相同模型的大大小小的树)添加多样性,或者要将模型大小映射到现实世界中的模型大小,这非常有用。在这些情况下,可能需要在所有方向上进行相同的缩放。但是,有时您只想调整一个轴的大小,例如,模型会变"更厚"或"更薄"。

    让我们计算一个转换矩阵。我们将从单个矩阵开始,并记住,将其乘以向量将返回原始向量不变,因为向量的每个分量将乘以"1"。请注意,没有组件影响其他组件。换句话说,通过将值从"1"更改为任何其他值,如果数字大于 1,我们将使对象增加,如果小于 1,则增加对象。

    源代码剖析

    World.m[0][0
    展开全文
  • //GLM并不是把它们的矩阵储存为OpenGL所希望接受的那种,因此我们要先用GLM的自带的函数value_ptr来变换这些数据。 glDrawElements ( GL_TRIANGLES , 6 , GL_UNSIGNED_INT , 0 ) ; glfwSwapBuffers...
    #include <glad/glad.h>
    #include <GLFW/glfw3.h>
    #include "shader.h"
    #include <iostream>
    #include <glm/glm.hpp>
    #include <glm/gtc/matrix_transform.hpp>
    #include <glm/gtc/type_ptr.hpp>
    #define STB_IMAGE_IMPLEMENTATION
    #include "stb_image.h"
    void framebuffer_size_callback(GLFWwindow* window, int width, int height);
    void processInput(GLFWwindow *window);
    const unsigned int SCR_WIDTH = 800;
    const unsigned int SCR_HEIGHT = 600;
    
    int main(void)
    {
    	//初始化glfw并创建窗口
    	//-------------------
    	glfwInit();
    	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    	GLFWwindow * window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "window", NULL, NULL);
    	if (window == NULL)
    	{
    		std::cout << "Failed to create GLFW window" << std::endl;
    		glfwTerminate();
    		return -1;
    	}
    	glfwMakeContextCurrent(window);
    	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    
    	//初始化GLAD
    	//--------
    	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) 
    	{
    		std::cout << "Failed to initialize GLAD" << std::endl;
    		return -1;
    	}
    
    	//创建着色器
    	//---------
    	Shader ourShader("D:\\OpenGL\\Project1\\4.1.texture.vs", "D:\\OpenGL\\Project1\\4.1.texture.fs");
    
    	//设置顶点坐标,颜色,纹理坐标
    	//--------
    	float vertices[] = {
    		//     ---- 位置 ---- - 纹理坐标 -
    		 0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 
    		 0.5f, -0.5f, 0.0f,   1.0f, 0.0f, 
    		-0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 
    		-0.5f,  0.5f, 0.0f,   0.0f, 1.0f 
    	};
    
    	//设置EBO索引
    	unsigned int indices[] = {
    		0, 1, 3, // 第一个三角形
    		1, 2, 3  // 第二个三角形
    	};
    
    	unsigned int VBO, VAO, EBO;
    	glGenVertexArrays(1, &VAO);
    	glGenBuffers(1, &VBO);
    	glGenBuffers(1, &EBO);
    
    
    	glBindVertexArray(VAO);
    	glBindBuffer(GL_ARRAY_BUFFER, VBO);
    	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    
    	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
    
    	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
    	glEnableVertexAttribArray(0);
    
    	glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
    	glEnableVertexAttribArray(1);
    
    	unsigned int texture1, texture2;
    	glGenTextures(1, &texture1);
    	glBindTexture(GL_TEXTURE_2D, texture1);
    
    	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);
    
    	//生成
    	int width, height, nrChannels;
    	stbi_set_flip_vertically_on_load(true);
    	unsigned char * data = stbi_load("D:\\OpenGL\\Project1\\container.jpg", &width, &height, &nrChannels, 0);
    	if (data)
    	{
    		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    		glGenerateMipmap(GL_TEXTURE_2D);
    	}
    	else
    	{
    		std::cout << "Failed to load texture" << std::endl;
    	}
    	stbi_image_free(data);
    
    	glGenTextures(1, &texture2);
    	glBindTexture(GL_TEXTURE_2D, texture2);
    
    	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);
    	data = stbi_load("D:\\OpenGL\\Project1\\awesomeface.png", &width, &height, &nrChannels, 0);
    	if (data)
    	{
    		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    		glGenerateMipmap(GL_TEXTURE_2D);
    	}
    	else
    	{
    		std::cout << "Failed to load texture" << std::endl;
    	}
    	stbi_image_free(data);
    	ourShader.use();
    	ourShader.setInt("texture1", 0);
    	ourShader.setInt("texture2", 1);
    
    	while (!glfwWindowShouldClose(window))
    	{
    		processInput(window);
    		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    		glClear(GL_COLOR_BUFFER_BIT);
    		
    		glActiveTexture(GL_TEXTURE0);
    		glBindTexture(GL_TEXTURE_2D, texture1);
    		glActiveTexture(GL_TEXTURE1);
    		glBindTexture(GL_TEXTURE_2D, texture2);
    
    		glm::mat4 transform = glm::mat4(1.0f); // make sure to initialize matrix to identity matrix first
    		transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));
    		transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
    
    		unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
    		glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));
    		glBindVertexArray(VAO);
    		glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    		transform = glm::mat4(1.0f); // reset it to identity matrix
    		transform = glm::translate(transform, glm::vec3(-0.5f, 0.5f, 0.0f));
    		float scaleAmount = sin(glfwGetTime());
    		transform = glm::scale(transform, glm::vec3(scaleAmount, scaleAmount, scaleAmount));
    		glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));
    
    
    		//第一个参数是uniform的位置值,第二个参数是矩阵的数量,第三个参数是否进行置换,这里不需要,最后一个参数是矩阵数据
    		//GLM并不是把它们的矩阵储存为OpenGL所希望接受的那种,因此我们要先用GLM的自带的函数value_ptr来变换这些数据。
    		glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    		
    
    		glfwSwapBuffers(window);
    		glfwPollEvents();
    	}
    	glDeleteVertexArrays(1, &VAO);
    	glDeleteBuffers(1, &VBO);
    	glDeleteBuffers(1, &EBO);
    
    	glfwTerminate();
    	return 0;
    
    
    }
    void processInput(GLFWwindow *window)
    {
    	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
    		glfwSetWindowShouldClose(window, true);
    }
    void framebuffer_size_callback(GLFWwindow* window, int width, int height)
    {
    
    	glViewport(0, 0, width, height);
    }
    

    顶点着色器

    #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.0);
    	TexCoord = vec2(aTexCoord.x, aTexCoord.y);
    }
    

    片元着色器

    #version 330 core
    out vec4 FragColor;
    
    in vec2 TexCoord;
    
    // texture samplers
    uniform sampler2D texture1;
    uniform sampler2D texture2;
    
    void main()
    {
    	// linearly interpolate between both textures (80% container, 20% awesomeface)
    	FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.2);
    }
    
    展开全文
  • 缩放矩阵相当简单。它的目的要么放大,要么缩小物体的尺寸。你可以这么使用它,例如当你想用相同的模型创造稍有出不同的物件(大的小的树实践上是一样的),或者当你想在世界空间中把一个物件的到小匹配到它的角色中...

    背景知识:

    缩放矩阵相当简单。它的目的要么放大,要么缩小物体的尺寸。你可以这么使用它,例如当你想用相同的模型创造稍有出不同的物件(大的小的树实践上是一样的),或者当你想在世界空间中把一个物件的到小匹配到它的角色中时。例如上面的例子中你可能想在三个轴上都缩放顶点位置相同大小的顶点位置。然而,有些时候你可能只是想缩放1~2个轴,使模型变得“更胖”或“更瘦”。

    编写变换矩阵是有点繁琐的。我们以一个单位矩阵开始,还记得单位矩阵乘向量使向量保持不变的原因,是逐一用每个分量乘对角线上的每一个1。没有一个分量能影响其他分量。因此,用其他值替换其中某个1,会导致物体在这条轴上增加或减少,在某条轴上,如果值大于1则变大,如果值小于1则变小。

    源码实践:
    World.m[0][0]=sinf(Scale); World.m[0][1]=0.0f; World.m[0][2]=0.0f; World.m[0][3]=0.0f;
    World.m[1][0]=0.0f; World.m[1][1]=sinf(Scale); World.m[1][2]=0.0f; World.m[1][3]=0.0f;
    World.m[2][0]=0.0f; World.m[2][1]=0.0f; World.m[2][2]=sinf(Scale); World.m[2][3]=0.0f;
    World.m[3][0]=0.0f; World.m[3][1]=0.0f; World.m[3][2]=0.0f; World.m[3][3]=1.0f;

    跟之前的教程相比唯一的改变就是,根据上面的描述替换了世界变换矩阵。正如你看到的,三条轴我们都通过一个-1~1之间的值缩放。在(0, 1]范围,三角形在很瘦和它原始大小之间波动,当对角线是0时它完全消失。在范围[-1, 0)范围,看起来也是一样的仅仅反转了而已,因为在对角线上缩放值实际上改变了位置标记。

    转载于:https://www.cnblogs.com/alphaGo/p/9208561.html

    展开全文
  • 一、绘制三角形、 二、选中矩阵设置、 三、矩阵缩放变换、 四、矩阵旋转变换、 五、矩阵平移变换、 六、相关资源





    一、绘制三角形



    先绘制一个三角形 , 矩阵变换的主题就是该三角形 ;

    OpenGL 三角形绘制相关参考 【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 | 三角形绘制顺序 | 绘制多个三角形 ) 博客 ;


    代码示例 :

    		// 渲染场景
    
    		// 清除缓冲区 , 
    		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
    		// 红色背景
    		glClear(GL_COLOR_BUFFER_BIT);
    
            // 设置当前的绘制颜色 , 4 个 unsigned byte 
            // 每个颜色的分量占一个字节
            // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
            // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
            glColor4ub(255, 255, 255, 255);
    
    		// 设置当前点的大小
    		glPointSize(5.0f);
    
    		// 设置线的宽度 
    		glLineWidth(5.0f);
    
            //glBegin(GL_POINTS);	// 绘制点
            //glBegin(GL_LINES);	// 绘制线
    		//glBegin(GL_LINE_STRIP);// 绘制前后连接的点组成的线
            //glBegin(GL_LINE_LOOP); // 绘制前后连接的点组成的线 , 并且收尾相连
            //glBegin(GL_TRIANGLES); // 绘制多个三角形
            //glBegin(GL_TRIANGLE_STRIP); // 绘制 GL_TRIANGLE_STRIP 三角形
    		//glBegin(GL_TRIANGLE_FAN);	// 绘制三角形扇
    
    		// 绘制三角形
            glBegin(GL_TRIANGLES);
    
    		// 1. 设置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)
    		glColor4ub(255, 255, 255, 255);
            glVertex3f(0.0f, 1.0f, -5.0f);
    
    		// 2. 设置绿色 
    		glColor4ub(0, 255, 0, 255);
    		glVertex3f(-1.0f, 0.0f, -5.0f);
    
    		// 3. 设置蓝色
    		glColor4ub(0, 0, 255, 255);
    		glVertex3f(1.0f, 0.0f, -5.0f);
    
            // 绘制三角形结束
            glEnd();
    
    		// 将后缓冲区绘制到前台
    		SwapBuffers(dc);
    

    运行效果 :

    在这里插入图片描述





    二、选中矩阵设置



    【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 )
    博客中简单介绍了 投影矩阵 和 模型视图矩阵 ;

    进行 平移 , 缩放 , 旋转 等矩阵操作 , 主要针对 模型视图矩阵 进行操作 ;

    在进行 OpenGL 环境渲染时 , 选中了 GL_MODELVIEW 模型视图矩阵后 , 就开始了渲染 , 后面操作的矩阵都是针对该 GL_MODELVIEW 矩阵的 ;

    下面的代码是设置矩阵的代码 , 之后就开始了 OpenGL 模型渲染 , 也就是说模型渲染过程中 , 全程都选中了模型矩阵 , 在渲染时进行的矩阵操作 , 都是操作的该选中的 模型视图矩阵 ;

       // 矩阵环境初始化 , 主要是投影矩阵和模型矩阵 
    
       // ( 选中投影矩阵 ) 设置矩阵模式 , 告知 GPU 当前要操作的矩阵是投影矩阵
       glMatrixMode(GL_PROJECTION);
       // ( 给投影矩阵设置值 ) 向投影矩阵设置参数
       // 参数一 : 50.0f 是摄像机的视口角度
       // 参数二 : 800.0f / 600.0f 是窗口的宽高比
       // 参数三 : 0.1f , 可视的最近的距离
       // 参数四 : 1000.0f , 可视的最远距离
       gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);
    
       // 上述设置好了摄像机的参数 , 具体的摄像机能看什么东西 , 就需要模型视图矩阵设置
    
       // ( 选中模型矩阵 )
       glMatrixMode(GL_MODELVIEW);
       // ( 设置模型矩阵值 ) , 这里设置的是单位矩阵
       glLoadIdentity();
    

    下面讲的 旋转 , 平移 , 变换 , 都是针对模型视图矩阵进行的操作 ;





    三、矩阵缩放变换



    渲染时先设置单位矩阵 ,

    		// 设置单位矩阵
    		glLoadIdentity();
    

    然后调用 glScalef 方法设置缩放矩阵 , 第 1 1 1 个参数代表 x 分量的缩放 , 第 2 2 2 个参数代表 y 分量的缩放 , 第 3 3 3 个参数代表 z 分量的缩放 ;

    		// 矩阵缩放
    		// 缩放的是下面设置的点的坐标
    		// 每个参数都影响 x , y , z 分量
    		glScalef(2.0f, 2.0f, 1.0f);
    

    代码示例 : 这里将 x , y 两个分量增加 2 倍 , 相应的点的 x, y 分量都乘以 2 ;

        // 主消息循环:
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    
    		// 渲染场景
    
    		// 设置单位矩阵
    		glLoadIdentity();
    
    		// 矩阵缩放
    		// 缩放的是下面设置的点的坐标
    		// 每个参数都影响 x , y , z 分量
    		glScalef(2.0f, 2.0f, 1.0f);
    
    
    		// 清除缓冲区 , 
    		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
    		// 红色背景
    		glClear(GL_COLOR_BUFFER_BIT);
    
            // 设置当前的绘制颜色 , 4 个 unsigned byte 
            // 每个颜色的分量占一个字节
            // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
            // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
            glColor4ub(255, 255, 255, 255);
    
    		// 设置当前点的大小
    		glPointSize(5.0f);
    
    		// 设置线的宽度 
    		glLineWidth(5.0f);
    
            //glBegin(GL_POINTS);	// 绘制点
            //glBegin(GL_LINES);	// 绘制线
    		//glBegin(GL_LINE_STRIP);// 绘制前后连接的点组成的线
            //glBegin(GL_LINE_LOOP); // 绘制前后连接的点组成的线 , 并且收尾相连
            //glBegin(GL_TRIANGLES); // 绘制多个三角形
            //glBegin(GL_TRIANGLE_STRIP); // 绘制 GL_TRIANGLE_STRIP 三角形
    		//glBegin(GL_TRIANGLE_FAN);	// 绘制三角形扇
    
    		// 绘制三角形
            glBegin(GL_TRIANGLES);
    
    		// 1. 设置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)
    		glColor4ub(255, 255, 255, 255);
            glVertex3f(0.0f, 1.0f, -5.0f);
    
    		// 2. 设置绿色 
    		glColor4ub(0, 255, 0, 255);
    		glVertex3f(-1.0f, 0.0f, -5.0f);
    
    		// 3. 设置蓝色
    		glColor4ub(0, 0, 255, 255);
    		glVertex3f(1.0f, 0.0f, -5.0f);
    
            // 绘制三角形结束
            glEnd();
    
    		// 将后缓冲区绘制到前台
    		SwapBuffers(dc);
    
        }
    

    执行效果 : 对比 ( 一 ) 中的三角形 , 增加了 2 倍 ;

    在这里插入图片描述





    四、矩阵旋转变换



    渲染时先设置单位矩阵 ,

    		// 设置单位矩阵
    		glLoadIdentity();
    

    然后调用 glRotatef 方法设置旋转矩阵 , 第 1 个参数是旋转角度 , 后面三个参数的值代表是否绕该轴旋转 , 如果对应值设置为 1 , 则绕该轴旋转 , 这里设置的是绕 z 轴旋转 30 度 ;

    		// 矩阵旋转
    		// glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
    		// 第 1 个参数是旋转角度 , 后面三个参数的值代表是否绕该轴旋转 , 
    		// 如果对应值设置为 1 , 则绕该轴旋转 
    		// 这里设置的是绕 z 轴旋转 30 度
    		glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    

    旋转的方向确定 : 大拇指指向旋转轴的方向 , 食指指向的方向就是旋转方向 ;


    代码示例 :

        // 主消息循环:
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    
    		// 渲染场景
    
    		// 设置单位矩阵
    		glLoadIdentity();
    
    		// 矩阵缩放
    		// 缩放的是下面设置的点的坐标
    		// 每个参数都影响 x , y , z 分量
    		//glScalef(2.0f, 2.0f, 1.0f);
    
    		// 矩阵旋转
    		// glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
    		// 第 1 个参数是旋转角度 , 后面三个参数的值代表是否绕该轴旋转 , 
    		// 如果对应值设置为 1 , 则绕该轴旋转 
    		// 这里设置的是绕 z 轴旋转 30 度
    		glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    
    
    		// 清除缓冲区 , 
    		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
    		// 红色背景
    		glClear(GL_COLOR_BUFFER_BIT);
    
            // 设置当前的绘制颜色 , 4 个 unsigned byte 
            // 每个颜色的分量占一个字节
            // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
            // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
            glColor4ub(255, 255, 255, 255);
    
    		// 设置当前点的大小
    		glPointSize(5.0f);
    
    		// 设置线的宽度 
    		glLineWidth(5.0f);
    
            //glBegin(GL_POINTS);	// 绘制点
            //glBegin(GL_LINES);	// 绘制线
    		//glBegin(GL_LINE_STRIP);// 绘制前后连接的点组成的线
            //glBegin(GL_LINE_LOOP); // 绘制前后连接的点组成的线 , 并且收尾相连
            //glBegin(GL_TRIANGLES); // 绘制多个三角形
            //glBegin(GL_TRIANGLE_STRIP); // 绘制 GL_TRIANGLE_STRIP 三角形
    		//glBegin(GL_TRIANGLE_FAN);	// 绘制三角形扇
    
    		// 绘制三角形
            glBegin(GL_TRIANGLES);
    
    		// 1. 设置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)
    		glColor4ub(255, 255, 255, 255);
            glVertex3f(0.0f, 1.0f, -5.0f);
    
    		// 2. 设置绿色 
    		glColor4ub(0, 255, 0, 255);
    		glVertex3f(-1.0f, 0.0f, -5.0f);
    
    		// 3. 设置蓝色
    		glColor4ub(0, 0, 255, 255);
    		glVertex3f(1.0f, 0.0f, -5.0f);
    
            // 绘制三角形结束
            glEnd();
    
    		// 将后缓冲区绘制到前台
    		SwapBuffers(dc);
    
        }
    

    执行结果 : 三角形绕 z 轴旋转了 30 度 ;

    在这里插入图片描述





    五、矩阵平移变换



    渲染时先设置单位矩阵 ,

    		// 设置单位矩阵
    		glLoadIdentity();
    

    然后调用 glTranslatef 方法设置平移矩阵 , 三个参数对应 xyz 三个方向平移的值 ;

    		// 平移变换 
    		// 设置 xyz 三个方向平移的值
    		glTranslatef(0.0f, -2.0f, 0.0f);
    

    代码示例 :

        // 主消息循环:
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    
    		// 渲染场景
    
    		// 设置单位矩阵
    		glLoadIdentity();
    
    		// 矩阵缩放
    		// 缩放的是下面设置的点的坐标
    		// 每个参数都影响 x , y , z 分量
    		//glScalef(2.0f, 2.0f, 1.0f);
    
    		// 矩阵旋转
    		// glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
    		// 第 1 个参数是旋转角度 , 后面三个参数的值代表是否绕该轴旋转 , 
    		// 如果对应值设置为 1 , 则绕该轴旋转 
    		// 这里设置的是绕 z 轴旋转 30 度
    		//glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    
    		// 平移变换 
    		// 设置 xyz 三个方向平移的值
    		glTranslatef(0.0f, -2.0f, 0.0f);
    
    		// 清除缓冲区 , 
    		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
    		// 红色背景
    		glClear(GL_COLOR_BUFFER_BIT);
    
            // 设置当前的绘制颜色 , 4 个 unsigned byte 
            // 每个颜色的分量占一个字节
            // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
            // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
            glColor4ub(255, 255, 255, 255);
    
    		// 设置当前点的大小
    		glPointSize(5.0f);
    
    		// 设置线的宽度 
    		glLineWidth(5.0f);
    
            //glBegin(GL_POINTS);	// 绘制点
            //glBegin(GL_LINES);	// 绘制线
    		//glBegin(GL_LINE_STRIP);// 绘制前后连接的点组成的线
            //glBegin(GL_LINE_LOOP); // 绘制前后连接的点组成的线 , 并且收尾相连
            //glBegin(GL_TRIANGLES); // 绘制多个三角形
            //glBegin(GL_TRIANGLE_STRIP); // 绘制 GL_TRIANGLE_STRIP 三角形
    		//glBegin(GL_TRIANGLE_FAN);	// 绘制三角形扇
    
    		// 绘制三角形
            glBegin(GL_TRIANGLES);
    
    		// 1. 设置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)
    		glColor4ub(255, 255, 255, 255);
            glVertex3f(0.0f, 1.0f, -5.0f);
    
    		// 2. 设置绿色 
    		glColor4ub(0, 255, 0, 255);
    		glVertex3f(-1.0f, 0.0f, -5.0f);
    
    		// 3. 设置蓝色
    		glColor4ub(0, 0, 255, 255);
    		glVertex3f(1.0f, 0.0f, -5.0f);
    
            // 绘制三角形结束
            glEnd();
    
    		// 将后缓冲区绘制到前台
    		SwapBuffers(dc);
    
        }
    

    执行结果 :

    在这里插入图片描述





    六、相关资源



    GitHub 地址 : https://github.com/han1202012/OpenGL
    ( GitHub 源码始终都会随着后续博客的进度更新覆盖 , 可能没有本博客的相关源码 , 推荐下载博客源码快照 ) ;

    博客源码快照 : https://download.csdn.net/download/han1202012/14895562
    ( 该源码是 Windows 桌面程序 , 使用 Visual Studio 2019 打开 )

    展开全文
  • class wcPt3D { public: GLfloat x, y, z; }; ...typedef GLfloat Matrix4x4[4][4];...// 打印矩阵 void printMatrix4x4(Matrix4x4 mat) { printf("["); for (int row = 0; row < 4; ++row) { for ...
  • opengl 投影矩阵

    千次阅读 2014-05-21 11:29:09
    投影矩阵的推导 (OpenGL D3D)   (2012-12-17 13:16:14) 标签:  杂谈 分类: OpenGL OpenGL矩阵推导——模型视图变化 在三维编程中,模型视图变换是从三维世界到二...
  • [译]OpenGL投影矩阵

    2019-04-09 16:07:36
    这是关于OpenGL投影矩阵的一篇译文,原文在这里. 概览(Overview) 电脑显示屏是一个2D平面,为了能够在这个2D平面上显示OpenGL渲染的3D场景,我们必须将3D场景当作2D图像投影到这个2D平面(计算机屏幕)上.GL_PROJECTION ...
  • OpenGL MV矩阵

    2016-04-04 21:51:05
    1. 影响Model矩阵的函数  glTranslate* 平移  glRotate* 旋转  glScalef* 缩放 看几个例子 1.1 glTranslatef(-1, 3, 5); 平移向量为(-1, 3, 5) 所以变换矩阵为  1 0 0 -1  0 1 0 3
  • OpenGL 矩阵的旋转-平移-缩放

    千次阅读 2015-03-25 20:32:09
    1. openGL矩阵 openGL矩阵是列优先排序的。就是说,矩阵的数据是存贮在一维数组中,数据上传到openGL处理的时候,会把一维数据的每一行当做列来处理。比如说,一个4*4的矩阵在数组中的排列如下: matrix44 = {...
  • OpenGL中,图元的几何变换均为线性变换,通过矩阵变换实现。OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. 通常h取1. 比如空间中的点(2,3,4),在OpenGL中将表示成(2,3...
  • OpenGL矩阵变换Matrix

    千次阅读 2017-04-19 14:18:16
    OpenGL通过矩阵变换来把三维物体转变为二维图象,进而在屏幕上显示出来。为了指定当前操作的是何种矩阵,使用了函数 glMatrixMode 。 可以移动、旋转观察点或者移动、旋转物体,使用的函数是 glTranslate* 和 ...
  • opengl es矩阵变换

    2017-05-11 20:33:06
    opengl es 三大变换:模型变换、视图变换、投影变换模型变换: mMMatrix[16], [4*4]矩阵, 包括平移、比例缩放、旋转 平移: Matrix.translateM( mMMatrix, 0,//偏移量 x, y, z//平移量 )比例缩放: Matrix....
  • OpenGL投影矩阵

    2019-05-19 20:27:39
    OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上。GL_PROJECTION矩阵用于该投影变换。首先,它将所有定点数据从观察坐标转换到裁减坐标。接着,这些裁减坐标通过除以w分量的方式转换到归一化设备坐标(NDC)...
  • OpenGL矩阵

    2016-04-01 02:09:02
    OpenGL在进行坐标变换时有三个矩阵 在变换开始时,观察者坐标为世界坐标的原点(0,0,0),他看向 -z 方向 模型矩阵 描述模型在世界坐标系下的变换,矩阵为A 视图矩阵 描述观察者在世界坐标系下的变换,矩阵为...
  • 浅谈OpenGL变换矩阵

    2016-09-11 22:39:00
    浅谈OpenGL变换矩阵 OpenGL中使用的矩阵全为列向量为主的矩阵。 参考OpenGL变换网站为 http://www.songho.ca/opengl/gl_transform.html 1.什么是GL_MODELVIEW矩阵? GL_MODELVIEW矩阵是Model矩阵...
  • 缩放矩阵

    千次阅读 2017-11-25 18:58:20
    缩放变换 原文: http://ogldev.atspace.co.uk/www/tutorial08/tutorial08.html CSDN完整版专栏: http://blog.csdn.net/column/details/13062.html 背景 缩放变换非常简单,它的目的是增大或者缩小...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,759
精华内容 3,503
关键字:

opengl缩放矩阵