画一个旋转的立方体

//画立方体#include <iostream>
#define GLEW_STATIC
#include"Shader.h"
#include"Camera.h"
#include<GL/glew.h>#include<GLFW/glfw3.h>#include<glm/glm.hpp>
#include<glm/gtc/matrix_transform.hpp>
#include<glm/gtc/type_ptr.hpp>int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);int WIDTH = 800, HEIGHT = 600;GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT,"Learn OpenGL ", nullptr, nullptr);int screenWidth, screenHeight;glfwGetFramebufferSize(window, &screenWidth, &screenHeight);if (window == nullptr) {std::cout << "Failed to creat GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glewExperimental = GL_TRUE;if (glewInit() != GLEW_OK) {std::cout << "Failed to initialize GLEW" << std::endl;glfwTerminate();return -1;}//允许深度测试glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);Shader shader = Shader("res/shaders/code.vs", "res/shaders/code.fs");//CubeGLfloat vertices[] = {//position              //color//back-0.5f,-0.5f,-0.5f,      1.0f,0.0f,0.0f,0.5f,-0.5f,-0.5f,       1.0f,0.0f,0.0f,0.5f,0.5f,-0.5f,        1.0f,0.0f,0.0f,0.5f,0.5f,-0.5f,        1.0f,0.0f,0.0f,-0.5f,0.5f,-0.5f,       1.0f,0.0f,0.0f,-0.5f,-0.5f,-0.5f,      1.0f,0.0f,0.0f,//front-0.5f,-0.5f,0.5f,      0.0f,1.0f,0.0f,0.5f,-0.5f,0.5f,       0.0f,1.0f,0.0f,0.5f,0.5f,0.5f,        0.0f,1.0f,0.0f,0.5f,0.5f,0.5f,        0.0f,1.0f,0.0f,-0.5f,0.5f,0.5f,       0.0f,1.0f,0.0f,-0.5f,-0.5f,0.5f,      0.0f,1.0f,0.0f,//left-0.5f,0.5f,0.5f,        0.0f,0.0f,1.0f,-0.5f,0.5f,-0.5f,       0.0f,0.0f,1.0f,-0.5f,-0.5f,-0.5f,      0.0f,0.0f,1.0f,-0.5f,-0.5f,-0.5f,      0.0f,0.0f,1.0f,-0.5f,-0.5f,0.5f,       0.0f,0.0f,1.0f,-0.5f,0.5f,0.5f,        0.0f,0.0f,1.0f,//right0.5f,0.5f,0.5f,         0.0f,1.0f,1.0f,0.5f,0.5f,-0.5f,        0.0f,1.0f,1.0f,0.5f,-0.5f,-0.5f,       0.0f,1.0f,1.0f,0.5f,-0.5f,-0.5f,       0.0f,1.0f,1.0f,0.5f,-0.5f,0.5f,        0.0f,1.0f,1.0f,0.5f,0.5f,0.5f,         0.0f,1.0f,1.0f,//bottom-0.5f,-0.5f,-0.5f,      1.0f,0.0f,1.0f,0.5f,-0.5f,-0.5f,       1.0f,0.0f,1.0f,0.5f,-0.5f,0.5f,        1.0f,0.0f,1.0f,0.5f,-0.5f,0.5f,        1.0f,0.0f,1.0f,-0.5f,-0.5f,0.5f,       1.0f,0.0f,1.0f,-0.5f,-0.5f,-0.5f,      1.0f,0.0f,1.0f,//up-0.5f,0.5f,-0.5f,       1.0f,1.0f,0.0f,0.5f,0.5f,-0.5f,        1.0f,1.0f,0.0f,0.5f,0.5f,0.5f,         1.0f,1.0f,0.0f,0.5f,0.5f,0.5f,         1.0f,1.0f,0.0f,-0.5f,0.5f,0.5f,        1.0f,1.0f,0.0f,-0.5f,0.5f,-0.5f,       1.0f,1.0f,0.0f,};GLuint VAO, VBO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glEnableVertexAttribArray(1);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);while (!glfwWindowShouldClose(window)) {glViewport(0, 0, screenWidth, screenHeight);glfwPollEvents();DoMovement();glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//初始化深度shader.Use();glm::mat4 transform = glm::mat4(1.0f);//生成一个4x4单位矩阵//旋转变化transform = glm::rotate(transform, glm::radians(20.0f)*static_cast<GLfloat>(glfwGetTime()), glm::vec3(1.0f, 1.0f, 1.0f));//平移transform = glm::translate(transform, glm::vec3(0.0f, 0.4f, 0.0f));//缩放transform = glm::scale(transform, glm::vec3(0.5f, 0.5f, 0.5f));GLuint transLoc = glGetUniformLocation(shader.Program, "transform");//找到transform的位置glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(transform));//只传一个矩阵,所以变量是1glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES,0,36);glBindVertexArray(0);glfwSwapBuffers(window);}glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glfwTerminate();return 0;
}

如果旋转、平移、变换操作调换了顺序,正方体的运动方式会发生改变,具体如何变化可自行尝试。
Shader.h

#pragma once
#include<string>
#include<fstream>
#include<sstream>
#include<iostream>
#include<GL/glew.h>class Shader {GLuint vertex, fragment;
public:GLuint Program;Shader(const GLchar* vertexPath, const GLchar* fragmentPath){std::string vertexCode;std::string fragmentCode;std::ifstream vShaderFile;std::ifstream fShaderFile;vShaderFile.exceptions(std::ifstream::badbit);fShaderFile.exceptions(std::ifstream::badbit);try {vShaderFile.open(vertexPath);fShaderFile.open(fragmentPath);std::stringstream vShaderStream, fShaderStream;vShaderStream << vShaderFile.rdbuf();fShaderStream << fShaderFile.rdbuf();//文件关闭顺序,先 v 再 fvShaderFile.close();fShaderFile.close();vertexCode = vShaderStream.str();fragmentCode = fShaderStream.str();}catch (std::ifstream::failure a) {std::cout <<"ERROR::SHADER::FILE_NOT_SUCCESSFULLY_READ"<< std::endl;}const GLchar* vShaderCode = vertexCode.c_str();const GLchar* fShaderCode = fragmentCode.c_str();vertex = glCreateShader(GL_VERTEX_SHADER);  glShaderSource(vertex, 1, &vShaderCode, NULL);glCompileShader(vertex);  GLint success;GLchar infoLog[512];glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);  if (!success) {glGetShaderInfoLog(vertex, 512, NULL, infoLog);std::cout <<"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n"<< infoLog << std::endl;}fragment = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragment, 1, &fShaderCode, NULL);glCompileShader(fragment);  glGetShaderiv(fragment, GL_COMPILE_STATUS, &success); if (!success) {glGetShaderInfoLog(fragment, 512, NULL, infoLog);std::cout <<"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n"<< infoLog << std::endl;}this->Program = glCreateProgram(); glAttachShader(this->Program, vertex);glAttachShader(this->Program, fragment);glLinkProgram(this->Program);  glValidateProgram(this->Program);  glGetProgramiv(this->Program, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(this->Program, 512, NULL, infoLog);  std::cout <<"ERROR::SHADER::PROGRAM::LINKING_FAILED\n" <<infoLog << std::endl;}}~Shader() {glDetachShader(this->Program, vertex);glDetachShader(this->Program, fragment);glDeleteShader(vertex);glDeleteShader(fragment);glDeleteProgram(this->Program);}void Use() {glUseProgram(this->Program);}
};

code.vs

#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 color;
out vec3 Color;
uniform mat4 transform;void main(){gl_Position = transform * vec4(position, 1.0f);Color = color;
}

code.fs

#version 330 core
in vec3 Color;
out vec4 color;void main(){color = vec4(Color, 1.0f);
}

计算机图形学(六)——画一个旋转的立方体相关推荐

  1. three.js 画一个旋转的立方体

    学习交流欢迎加群:789723098,博主会将一些demo整理共享 试想一下,如果我们的周围的事物都是静止的,那将是多么无聊的一个世界:同样的,我们创建出的场景如果是静止的,只能满足我们一时的视觉体验 ...

  2. 计算机图形学作业一:旋转与投影

    计算机图形学 作业一:旋转与投影 文章目录 计算机图形学 作业一:旋转与投影 1.题目概述: 2.知识储备: 2.1 MVP变换 2.2罗德里格斯旋转公式 3.解答过程: 4.总结思考: 1.题目概述 ...

  3. 计算机图形学 顶点定义_在计算机图形学中定义一个圆

    计算机图形学 顶点定义 After studying the implementation of lines in computer graphics, we will now be dealing ...

  4. 计算机图形学第二次上机——旋转的三角形

    计算机图形学第二次上机实验 课程实验报告 写在前面:这是我的图形学上机报告,代码都是自己写的,实测通过,查阅了许多资料,现以链接的形式给出 glut初始化 glutSpecialFunc响应键盘方向控 ...

  5. 杭电计算机图形学:制作一个长方体几何变换的动画

    实验内容: 自己编写包含平移.旋转.缩放这三种基本变换的程序(并非调用已有函数). 我的想法: 其实上,这三种变换本质上是点的变换. 拿旋转来讲,我们只需要把一个4x4的单位矩阵变换成下面这样的矩阵( ...

  6. 如何用css3制作一个旋转的立方体

    css3增加的动画效果使得前端制作某些动画更加方便,流畅,如何制作一个最简单的会旋转的立方体呢?话不多说,直接上代码! html代码如下,需要一个大的div包裹六个div作为立方体的六个表面 < ...

  7. python用turtle画一个旋转的风车

    上次用turtle做了一个爱心,这次我们来做一个旋转的风车,先放下图,看一下完成后的效果 现在我们开始代码的编写 设计叶子 一片叶子我们用一深一浅两个三角形就可以实现了,下面以0度方向的叶子为例,我们 ...

  8. 计算机图形学之画基本图形(1)

    第一次实验:理解语句 #include<GL/glut.h> #include<math.h> int i; const int n=1000; const GLfloat R ...

  9. 使用CSS画一个简单的立方体

    用CSS实现一个简单的立方体: 可以使用弹性盒子模型,先对父级div进行立体化(3D)操作,然后对多个子div进行操作(翻转,平移等),还可以给父级div加上CSS动画,使整体更加酷炫. 大体效果如图 ...

最新文章

  1. html溢出攻击,溢出(漏洞)攻击的实现及防御
  2. 【深度学习入门到精通系列】特别正经的合理调参介绍~❤️
  3. JauntVR中文版登陆小米商店,首波内容有《五十度黑》
  4. 基于HAproxy的web动静分离及输出状态检测页面
  5. 微信小程序 map 点击图标回到自己的位置(不使用controls控件)
  6. 轻量级 Kubernetes K3s - Github热点
  7. php echo 前后有字符串,php echo 输出字符串函数详解、多行输出方法
  8. 代码批量加引号_如何用Word批量制作员工工作证?1分钟搞定1000份!只需三步
  9. 为什么要进行软件著作权登记?
  10. ant 发布web应用脚本
  11. 华为交换机关闭网口_华为交换机如何关闭端口号
  12. 阿里云上实现DDNS公网解析
  13. 银行营销策略数据分析 - 智能定位
  14. 电机速度rpm转换成轮子的速度
  15. HDR视频色调映射算法(之四:Display adaptive TMO)
  16. 微信小程序之如何实现一寸照片换底色(附小程序成品)
  17. WPF中MaterialDesignThemes前端框架的使用(超详细图解步骤)
  18. Linux mint 换中文字体,Linux mint 全局字体不统一,楷体无法更换问题
  19. 项目管理之从战略层出发完善组织架构管理
  20. 【一月一本技术书】-【Go语言设计与实现】- 9月

热门文章

  1. Android通用遍历,Android 遍历当前活动当中的所有组件
  2. 各个字号对应的px大小
  3. Android Studio打不开虚拟机,两种情况详解
  4. CCBN 2023看点分析:国产8K摄像机国产化替代趋势增强
  5. 【Javaweb】HTML 基础
  6. 一文搞定有穷状态自动机(FA)——DFA、NFA区别、转换以及DFA化简
  7. 零成本 | 手把手教你搭建免费个人博客!
  8. MATLAB和origin用三列数据画三维图
  9. irobot擦地机器人故障_简单修理irobot 380T拖地机器人 后退转圈故障
  10. c语言格式字符使用举例,c语言char怎么用