PAOGD个人作业3-OpenGL初步

HW3 OpenGL初步

重要资源

现代OpenGL编程的基础知识都可以在教程跟范例代码中找到

开发环境要求

  • Ubuntu 16.04
  • OpenGL 3.3
  • GLFW
  • GLAD

安装教程

  1. apt-get install g++ cmake git
  2. apt-get install libsoil-dev libglm-dev libassimp-dev libglew-dev libglfw3-dev libxinerama-dev libxcursor-dev libxi-dev
  3. git clone https://github.com/JoeyDeVries/LearnOpenGL.git
  4. cd LearnOpenGL
  5. mkdir build
  6. cd build
  7. cmake ..
  8. make -j8

编译完成后,各章节Demo可执行文件会在build/bin 目录下

任务

  • 在model loading的Demo中, 示范了如何在OpenGL中导入一个.obj文件
    • 运行范例程序,我们会看到如下画面.同时,我们可以利用鼠标和键盘(WASD),控制镜头的移动
      在这里插入图片描述
  • 试编写一个程序,实现模型自身的旋转,平移,缩放
    • 功能需求:
      • 按下J键, 模型随着时间绕着自身Z轴旋转
      • 按下K键, 模型沿着水平方向往复移动
      • 按下L键, 模型在一定范围内不断放大缩小
  • 注意
    • 不允许提交所有的范例程序,请务必新建工程并重新编写CMakeList.txt
    • 确保在你的个人目录下,代码能够独立地编译和执行
    • 确保只保留必要的代码和资源等文件(可以复用范例代码中的文件)
    • 不要上传build目录下的内容
  • 报告要求
    • 你是如何利用CMake生成你的可执行程序的
    • .obj格式的文件是怎么保存模型信息的
    • OpenGL与Blender的联系?
    • OpenGL中的坐标系统是怎么样的
    • 你是如何实现功能需求的(简述思路)
    • 你的工程中包含了哪些文件,这些文件的作用是什么

实现内容

1. 如何利用CMake生成可执行程序。

首先下载安装cmake并下载learningOpenGl的项目,打开cmake的gui,选择目录与VS版本,首先执行Configue命令,然后是Generate,然后进入目标目录/build。

注意如果cmake报错找不到C编译器,需要在CMakeList.txt添加编译器的路径,例如我的在开头添加了以下两句:

SET(CMAKE_C_COMPILER C:/MinGW/bin/gcc.exe)
SET(CMAKE_CXX_COMPILER C:/MinGW/bin/g++.exe)

在这里插入图片描述

打开/build下的.sln进入项目,生成解决方案,右键把与这次任务相关的3.1项目作为启动项目,如果报告缺少dll文件就把/dlls目录下的文件复制到可执行文件exe所在的目录下,随后便可正常编译运行。

在这里插入图片描述

2. .obj格式的文件是怎么保存模型信息的

obj格式有4种数据,分别以以下字母开头:

  • v 顶点:每个顶点的坐标
  • vt 纹理坐标:绘制模型的三角面片时,每个顶点取像素点时对应的纹理图片上的坐标。
  • vn 顶点法向量:绘制模型三角面片时,需要确定三角面片的朝向,整个面的朝向,是由构成每个面的顶点对应的顶点法向量的做矢量和决定的
  • f 面:每个三角面片由三个f构成,由f可以确定顶点、顶点的对应的纹理坐标(提取纹理图片对应该坐标的像素点)、通过三个顶点对应的顶点法向量可以确定三角面的方向。
3. OpenGL与Blender的联系?

Blender的功能通过调用OpenGl的接口实现。

4. OpenGL中的坐标系统是怎么样的?

右手坐标系(Right-handed System)

按照惯例,OpenGL是一个右手坐标系。简单来说,就是正x轴在你的右手边,正y轴朝上,而正z轴是朝向后方的。想象你的屏幕处于三个轴的中心,则正z轴穿过你的屏幕朝向你。

在这里插入图片描述

5. 你是如何实现功能需求的(简述思路)

根据键盘输入改变当前模式。

void processInput(GLFWwindow *window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);

    if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) {
        model_mode = 0;
    }
    if (glfwGetKey(window, GLFW_KEY_J) == GLFW_PRESS) {
        model_mode = 1;
        time = (float)glfwGetTime();
    }
    if (glfwGetKey(window, GLFW_KEY_K) == GLFW_PRESS) {
        model_mode = 2;
        time = (float)glfwGetTime();
    }
    if (glfwGetKey(window, GLFW_KEY_L) == GLFW_PRESS) {
        model_mode = 3;
        time = (float)glfwGetTime();
    }

}

根据当前模式设定模型变换形式。

        // render the loaded model
        glm::mat4 model = glm::mat4(1.0f);

        float _time = glfwGetTime();
        float temp = _time - time, temp1 = fmod(temp, 8), temp2 = temp1 / 8;
        if (model_mode == 1) {
            model = glm::rotate(model, _time, glm::vec3(0.0f, 0.0f, 1.0f));
        }
        else if (model_mode == 2) {
            if (temp1 < 4) {
                model = glm::translate(model, glm::vec3(temp1 * 2 - 4, 0, 0));
            }
            else {
                model = glm::translate(model, glm::vec3(4 - (temp1 - 4) * 2, 0, 0));
            }
        }
        else if (model_mode == 3) {
            if (temp1 < 4) {
                temp2 = temp1 / 4 + 0.5;
                model = glm::scale(model, glm::vec3(temp2, temp2, temp2));
            }
            else {
                temp2 = 1.5 - (temp1 - 4) / 4;
                model = glm::scale(model, glm::vec3(temp2, temp2, temp2));
            }
        }

效果

在这里插入图片描述

6. 你的工程中包含了哪些文件,这些文件的作用是什么

包括了源代码、项目配置文件、库以及资源文件。

其中源代码定义程序的功能与逻辑,项目配置文件引用库文件及资源文件等使程序可顺利编译运行,库为程序提供各种强大的功能接口,而资源文件是程序会从中读取所需资源而用到的文件。

实验思考

这次实验与计算机图形学的内容有很大重合,基本上不用额外的学习,由于在计算机图形学的学习中,一些常见问题已经被解决了,也没有费太多精力,作业的主要难点是配置opengl的环境。

资源下载

cpp文件下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值