正方体绕轴旋转

只要在旋转立方体的代码上做稍微的改动即可
旋转立方体
本文将立方体立起来旋转,关键在于初始偏转角度的计算

transform = glm::rotate(transform, glm::radians(45.0f) * static_cast<GLfloat>(glfwGetTime()), glm::vec3(0.0f, 1.0f, 0.0f));
transform = glm::rotate(transform, (glm::f32)acos(1 / sqrt(3)), glm::vec3(1.0f, 0.0f, 1.0f));

** main.cpp**

#include <iostream>
#define GLEW_STATIC
#include"Shader.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");GLfloat vertices[] = {-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,-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,-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,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,0.5f,0.5f,0.5f,         0.0f,1.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,-0.5f,-0.5f,-0.5f,      1.0f,0.0f,1.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,-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();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);transform = glm::rotate(transform, glm::radians(45.0f) * static_cast<GLfloat>(glfwGetTime()), glm::vec3(0.0f, 1.0f, 0.0f));transform = glm::rotate(transform, (glm::f32)acos(1 / sqrt(3)), glm::vec3(1.0f, 0.0f, 1.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;
}

运行结果

计算机图形学练习(二)——正方体绕轴旋转相关推荐

  1. 3D坐标绕轴旋转公式推导

    绕轴旋转实际上等价于平面点绕远点旋转,所以这里只用分析一下平面情况就可以. 问题转换为:平面上任意点(x,y)绕原点旋转R度后,新点坐标为多少? 一. 通常情况,我们容易想到一下的推导方式(我一开始想 ...

  2. 游戏程序设计中有趣的绕轴旋转

    前言 在游戏设计中,绕轴旋转综合了位移与旋转两种空间变化,即在通过位移变换得到宏观旋转的效果的同时,物体自身的旋转来保证正确的轴向对齐.在对这一过程执行推导演绎时会设计到一些基本的高中几何数学知识 如 ...

  3. 计算机图形学实验二 《绘制任意斜率的直线》

    计算机图形学实验二 <绘制任意斜率的直线> 视频讲解地址 一.Bresenham算法 用视频讲会好点我之前也录过相关视频可以先凑合看 二.设计CLine类 之前也说了C++一个类是由源文件 ...

  4. 【计算机图形学】小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解

    小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解 引言 如何画圆 基本思想 中点画圆法 中点画圆基本思路 中点画圆改进 Bresenham画圆算法 Bre ...

  5. Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转

    Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转 using System.Collections; using System.Collections.Generic; ...

  6. 计算机图形学实验——二维卡通人物交互

    计算机图形学实验1.2卡通人物交互 OpenGL卡通人物交互 基础"图元"绘制 OpenGL拾取物体 反走样 略提反走样问题 OpenGL实现二维反走样 放缩.旋转和拖动 小结 O ...

  7. 计算机图形学 实验二 三维模型读取与控制【OpenGL】

    文章目录 实验2.1 OpenGL的控制与交互方式 一. 实验目的 二. 理论背景 三. 实验内容 1. 创建基本工程项目 2. 在子窗口中绘制图形 3. 在子窗口中通过键盘事件更换椭圆形状颜色 4. ...

  8. 计算机图形学——实验二 几何图形变换实验

    实验二 几何图形变换实验 一.实验目的和要求 进一步掌握二维.三维变换的数学知识.变换原理.变换种类.变换方法: 利用OpenGL实现二维.三维图形变换,在屏幕上显示变换过程或变换结果: 掌握Open ...

  9. 计算机图形学(二维、三维几何变换)

    一.几何变换的概念 几何变换又称建模变换,指只改变组成形体的几何元素的几何信息(大小.形状.相对位置),而不改变图形拓扑信息的变换. 图形变换模式: (1)坐标系不动,图形变动(以下内容采用这种模式) ...

最新文章

  1. vb 使用Array.ConvertAll将object类型数组转为string类型数组
  2. ajax被token拦截,vue中封装ajax请求,并且拦截请求在请求头中添加token
  3. 简单C语言程序的执行过程
  4. 个人博客建站方案推荐
  5. java lambda循环_在Java 8 Lambda中创建自己的循环结构
  6. 前端学习(1951)vue之电商管理系统电商系统之获取父级数据列表
  7. HTML+CSS+JS实现 ❤️酷炫HUD科幻数据屏幕动画界面❤️
  8. Android笔记 fragment通信
  9. php中ini set,php ini_set函数的用法
  10. 考上MBA,为自己装一双翅膀
  11. Android Service完全解析,关于服务你所需知道的一切(下) (转载)
  12. 立创EDA元件封装导入AD软件教程
  13. 让HTML播放器使用指定ua,chimee-mobile-player
  14. 焦距相关的基本概念及焦距对摄影效果的影响
  15. 存储卡的使用方法大全
  16. Unity3D 鼠标选择物体高光显示信息
  17. 超级电容-一阶RC模型-RLS参数辨识-Simulink仿真
  18. 【CSS】绘制一个任意角度的扇形
  19. TIM新版支持微信扫码登录:自动生成新QQ
  20. centos服务器部署

热门文章

  1. 经典不灭:细数十大史上造型最经典的显卡
  2. 豆豆趣事[2012年10月]
  3. Arduino UNO测试MH-Z16二氧化碳CO2传感器
  4. (五)路由器破密码和重置
  5. unity 动态裁剪图片
  6. Officiis est labore laborum eum natus.Aliquam voluptatem necessitatibus quam.
  7. springboot 集成 swagger 和knife4j
  8. php获取微信小程序二维码(thinkphp框架)
  9. python动态库反初始化_【TensorFlow】:解决TensorFlow的ImportError: DLL load failed: 动态链接库(DLL)初始化例程失败...
  10. dedeCMS采集内容无需写规则方法