OpenGL南邮计算机图形学实验报告四——用键盘控制物体

计算机图形学的新题目要求

OpenGL配置参考:
南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改)、SOIL2 环境配置、GLM 环境配置

light.vs/light.fs/Camera.h参考上一篇实验报告

学习网站:LearnOpenGL CN

思路:

  1. 上一节课已经做了用键盘控制镜头camera,这节课用键盘控制物体就可以参考镜头的控制。
    镜头camera的位置由向量frontright加减来控制。
    而物体我选择使用直接改变物体坐标,即x,y的值。

  2. 先初始化物体的坐标ObjectPos(0,0,0)。通过键盘来改变坐标。
    然后每次循环画图的时候就按照ObjectPos的坐标画物体即可,注意设置延迟deltaTime和速度velocity和灵敏度(我直接在函数里设置了)。
    为了不删减功能我使用WASD控制镜头camera,用UP\DOWN\LEFT\RIGHT来控制物体。

transform = glm::translate(transform, ObjectPos);
//*
*
*
*//
void ObjectMovement(GLfloat& xPos, GLfloat& yPos,GLfloat deltaTime)
{//物体移动GLfloat velocity =10.0f * deltaTime;//10.0f是灵敏度,也可以获取if ( keys[GLFW_KEY_UP]) {yPos += 1.0f * velocity;}if ( keys[GLFW_KEY_DOWN]) {yPos -= 1.0f * velocity;}if ( keys[GLFW_KEY_LEFT]) {xPos -= 1.0f * velocity;}if ( keys[GLFW_KEY_RIGHT]) {xPos += 1.0f * velocity;}
}

效果图如下:


话不多说上代码:

main.cpp

#include<iostream>//GLEW
#define GLEW_STATIC
#include<GL/glew.h>//GLFW
#include<GLFW/glfw3.h>
#include"shader.h"
#include"Camera.h"
#include"Light.h"#include "SOIL2/SOIL2.h"
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include<glm/gtx/rotate_vector.hpp>const GLint WIDTH = 800, HEIGTH = 600;void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mode);
void MouseCallback(GLFWwindow* window, double xPos, double yPos);
void ScrollCallback(GLFWwindow* window, double xOffset, double yOffest);
void DoMovement();
void ObjectMovement(GLfloat &xPos,GLfloat &yPos,GLfloat deltaTime);bool keys[1024];
Camera camera(glm::vec3(0.0f, 0.0f, 2.0f));
GLfloat deltaTime = 0.0f;
GLfloat lastTime = 0.0f;GLfloat lastX = WIDTH / 2.0;
GLfloat lastY=HEIGTH/2.0;bool firstMouse = true;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);GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGTH, "Learn OpenGL", nullptr, nullptr);if (nullptr == window){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}//next two lines are for mac retina displayint screenWidth, screenHeight;glfwGetFramebufferSize(window, &screenWidth, &screenHeight);glfwMakeContextCurrent(window);glfwSetKeyCallback(window, KeyCallback);glfwSetCursorPosCallback(window, MouseCallback);glfwSetScrollCallback(window, ScrollCallback);//未实现glewExperimental = GL_TRUE;if (GLEW_OK != glewInit()){std::cout << "Failed to initialise GLEW" << std::endl;return -1;}glViewport(0, 0, screenWidth, screenHeight);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);Shader ourShader = Shader("res/shaders/core.vs", "res/shaders/core.fs");Shader lightShader= Shader("res/shaders/light.vs", "res/shaders/light.fs");Light lightModel = Light();glm::vec3 lightPos = glm::vec3(1.0f, 1.0f, 0.0f);glm::vec3 ObjectPos = glm::vec3(0.0f, 0.0f, 0.0f);GLfloat vertices[] ={// position                 //color                 //normal-0.5f,-0.5f,0.5f,           0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,0.5f,-0.5f,0.5f,            0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,0.5f,0.5f,0.5f,         0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,0.5f,0.5f,0.5f,         0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,-0.5f,0.5f,0.5f,            0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,-0.5f,-0.5f,0.5f,           0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,-0.5f,-0.5f,-0.5f,      1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,0.5f,-0.5f,-0.5f,            1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,0.5f,0.5f,-0.5f,         1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,0.5f,0.5f,-0.5f,         1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,-0.5f,0.5f,-0.5f,            1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,-0.5f,-0.5f,-0.5f,       1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,-0.5f,0.5f,0.5f,         0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,-0.5f,0.5f,-0.5f,          0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,-0.5f,-0.5f,-0.5f,     0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,-0.5f,-0.5f,-0.5f,     0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,-0.5f,-0.5f,0.5f,          0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,-0.5f,0.5f,0.5f,           0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,0.5f,0.5f,0.5f,            1.0f,1.0f,0.0f,     -1.0f,0.0f,0.0f,0.5f,0.5f,-0.5f,            1.0f,1.0f,0.0f,     -1.0f,0.0f,0.0f,0.5f,-0.5f,-0.5f,           1.0f,1.0f,0.0f,     -1.0f,0.0f,0.0f,0.5f,-0.5f,-0.5f,           1.0f,1.0f,0.0f,     -1.0f,0.0f,0.0f,0.5f,-0.5f,0.5f,            1.0f,1.0f,0.0f,     -1.0f,0.0f,0.0f,0.5f,0.5f,0.5f,         1.0f,1.0f,0.0f,      -1.0f,0.0f,0.0f,-0.5f,-0.5f,-0.5f,     1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,0.5f,-0.5f,-0.5f,           1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,0.5f,-0.5f,0.5f,            1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,0.5f,-0.5f,0.5f,            1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,-0.5f,-0.5f,0.5f,           1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,-0.5f,-0.5f,-0.5f,      1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,-0.5f,0.5f,-0.5f,           0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,0.5f,0.5f,-0.5f,         0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,0.5f,0.5f,0.5f,          0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,0.5f,0.5f,0.5f,          0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,-0.5f,0.5f,0.5f,         0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,-0.5f,0.5f,-0.5f,            0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,};                                                                // the data should transfer to the memory on Graphic CardGLuint 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, 9 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glEnableVertexAttribArray(1);glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glEnableVertexAttribArray(2);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);while (!glfwWindowShouldClose(window)){GLfloat currentTime = glfwGetTime();deltaTime = currentTime - lastTime;lastTime = currentTime;glfwPollEvents();DoMovement();ObjectMovement(ObjectPos.x,ObjectPos.y, deltaTime);glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glm::mat4 transform = glm::mat4(1.0f);lightPos = glm::rotate(lightPos, glm::radians(0.1f), glm::vec3(0.0f, 0.0f, 1.0f));transform = glm::translate(transform, lightPos);transform = glm::scale(transform, glm::vec3(0.1f, 0.1f, 0.1f));glm::mat4 projection = glm::mat4(1.0f);projection = glm::perspective(glm::radians(camera.GetZoom()), float(screenWidth) / float(screenHeight), 0.1f, 100.0f);glm::mat4 view = camera.GetViewMatrix();lightShader.Use();GLuint transLoc = glGetUniformLocation(lightShader.Program, "transform");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(transform));transLoc = glGetUniformLocation(lightShader.Program, "projection");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(projection));transLoc = glGetUniformLocation(lightShader.Program, "view");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(view));lightModel.Draw(lightShader);transform = glm::mat4(1.0f);transform = glm::translate(transform, ObjectPos);//每次在ObjectPos位置画物体来达到移动transform = glm::rotate(transform, glm::radians(90.0f) * static_cast<GLfloat>(glfwGetTime()), glm::vec3(1.0f, 1.0f, 1.0f));transform = glm::scale(transform, glm::vec3(0.5f, 0.5f, 0.5f));//transform = glm::translate(transform, glm::vec3(0.1f, 0.0f,-0.8f));ourShader.Use();transLoc = glGetUniformLocation(ourShader.Program, "transform");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(transform));transLoc= glGetUniformLocation(ourShader.Program, "projection");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(projection));transLoc = glGetUniformLocation(ourShader.Program, "view");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(view));glUniform3f(glGetUniformLocation(ourShader.Program, "LightPos"), lightPos.x, lightPos.y, lightPos.z);glUniform3f(glGetUniformLocation(ourShader.Program, "ViewPos"),camera.GetPosition().x, camera.GetPosition().y, camera.GetPosition().z);glUniform1f(glGetUniformLocation(ourShader.Program, "material.diffuse"), 0.6f);glUniform1f(glGetUniformLocation(ourShader.Program, "material.specular"), 0.9f);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 36);glBindVertexArray(0);glfwSwapBuffers(window);}glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);ourShader.~Shader();glfwTerminate();return 0;
}void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mode)
{if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS){glfwSetWindowShouldClose(window, GL_TRUE);}if (key >= 0 && key < 1024){if (action == GLFW_PRESS)keys[key] = true;else if (action == GLFW_RELEASE)keys[key] = false;}
}void DoMovement()
{//镜头移动if (keys[GLFW_KEY_W] ) {camera.ProcessKeyboard(FORWARD, deltaTime);}if (keys[GLFW_KEY_S] ) {camera.ProcessKeyboard(BACKWARD, deltaTime);}if (keys[GLFW_KEY_A] ) {camera.ProcessKeyboard(LEFT, deltaTime);}if (keys[GLFW_KEY_D] ) {camera.ProcessKeyboard(RIGHT, deltaTime);}
}void MouseCallback(GLFWwindow* window, double xPos, double yPos)
{if (firstMouse){lastX = xPos;lastY = yPos;firstMouse = false;}GLfloat xOffset = xPos - lastX;GLfloat yOffset = lastY - yPos;lastX = xPos;lastY = yPos;//Process the camera directioncamera.ProcessMouseMovement(xOffset, yOffset);
}void ObjectMovement(GLfloat& xPos, GLfloat& yPos,GLfloat deltaTime)
{//物体移动GLfloat velocity =10.0f * deltaTime;if ( keys[GLFW_KEY_UP]) {yPos += 1.0f * velocity;}if ( keys[GLFW_KEY_DOWN]) {yPos -= 1.0f * velocity;}if ( keys[GLFW_KEY_LEFT]) {xPos -= 1.0f * velocity;}if ( keys[GLFW_KEY_RIGHT]) {xPos += 1.0f * velocity;}
}void ScrollCallback(GLFWwindow* window, double xOffset, double yOffest)
{}//滚轮操作暂时没写

滚轮操作可以参考wonz哥
需要在camera中添加一个函数即可

OpenGL南邮计算机图形学实验报告四——用键盘控制物体相关推荐

  1. OpenGL南邮计算机图形学实验报告二——两个纹理的渐变变换和移动

    OpenGL南邮计算机图形学实验报告二--两个纹理的渐变变换和移动 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SOIL2 ...

  2. OpenGL南邮计算机图形学实验报告三——实现类似地月系统的两物体环绕移动

    OpenGL南邮计算机图形学实验报告三--实现类似地月系统的两物体环绕移动 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SO ...

  3. 南邮计算机图形学水不水,南邮计算机图形学实验报告(修正版)….doc

    实 验 报 告 实验名称指导教师实验类型综合实验学时2实验时间一.实验目的和要求 能够灵活的运用OpenGL图形API函数,基于C++程序语言,. 设计增加键盘及鼠标输入的互动,实现三维物体交互式运动 ...

  4. 南邮计算机网络通信实验报告,南京邮电大学计算机网络..docx

    南京邮电大学计算机网络. 通信与信息工程学院2016/2017学年第一学期实 验 报 告实验课程名称 计算机网络实验 专 业 电子信息工程学 生 学 号 学 生 姓 名 实验一 Windows中常见网 ...

  5. 计算机绘图图框实验报告,南邮工图实验报告.pdf

    南邮工图实验报告 实验报告 课程名称: 制图基础及计算机绘图 学生姓名: 胡正飞 班级学号: 指导教师: 胡正飞 指导单位: 理 学 院 日期: 年 月 日至 年 月 日 <制图 基 础 与 计 ...

  6. 华北电力大学计算机图形学实验报告,华北电力大学计算机图形学实验报告分析.doc...

    华北电力大学计算机图形学实验报告分析 科 技 学 院 课程设计(综合实验)报告 ( 2013 -- 2014 年度第 2 学期) 实验名称 OpenGL基本图元绘制实验 课程名称 计算机图形学 | | ...

  7. 南邮java实验报告,南邮微机原理实验报告精选.doc

    南邮微机原理实验报告精选 <微型计算机原理与接口技术> 上机实验 学 院: 电子科学与工程 专 业: 电磁场与无线技术 姓 名: 陈秀慧 课 程 号: B0300062S 学 号: 任课老 ...

  8. 计算机图形学直线线型实验报告,计算机图形学实验报告-直线中点bresenham算法的实现资料.doc...

    计算机图形学实验报告-直线中点bresenham算法的实现资料.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.90 积分 计算机图形 ...

  9. 计算机图形学实验报告 裁剪,计算机图形学-实验报告三-图形裁剪算法

    <计算机图形学-实验报告三-图形裁剪算法>由会员分享,可在线阅读,更多相关<计算机图形学-实验报告三-图形裁剪算法(9页珍藏版)>请在人人文库网上搜索. 1.图形裁剪算法1. ...

最新文章

  1. Analysis and Design Overview
  2. 直接往res里面写字节
  3. 成都七中实验学校爆食品安全问题,互联网+后勤能做点什么吗?
  4. Program terminated with signal SIGSEGV, Segmentation fault.
  5. (十一)MyBatis的动态SQL:trim元素
  6. Spring Boot集成测试中@ContextConfiguration和@SpringApplicationConfiguration之间的区别
  7. php gridview,PHP编程:yii2-GridView在开发中常用的功能及技巧总结
  8. java 运算优先级_Java-运算符优先级
  9. matlab向万里电子版,万里学院matlab第一次试验报告格式
  10. mysql dump 锁表_运行MySQLDump而不锁定表
  11. 为什么mfc要注册WNDCLASS样式
  12. 使用react-cropper-pro实现图片裁切压缩上传
  13. 在线教会你Excel批量转PDF的小妙招
  14. c语言-蓝桥杯-门牌制作问题
  15. ps批量修改图片大小
  16. seate底层原理_Seate
  17. wiondows如何更新pip版本
  18. 读书 | 读《资治通鉴》
  19. LEA指令和OFFSET指令
  20. 月赚几千的闲鱼无货源卖货教程,新手可做。

热门文章

  1. 汽车编程都是用matlab,汽车理论和.matlab编程答案.doc
  2. 咸菜,粥,咸鸭蛋及其他
  3. php个人支付宝收款链接,Andriod监听支付宝收款实现个人支付宝支付接口!附安卓App...
  4. 【元胞自动机】元胞自动机森林大火【含Matlab源码 235期】
  5. SAPUI5入门到精通1---sapui5介绍
  6. Windows10基于chrome内核的浏览器不走代理解决方法
  7. C C++基础的Java教程
  8. VC 操作excel
  9. 计算机网络谢希仁第七版知识点总结
  10. Python定时任务框架APScheduler快速入门