HW3 OpenGL初步
PAOGD_HW3
重要资源
现代OpenGL编程的基础知识都可以在教程跟范例代码中找到
开发环境要求
- Ubuntu 16.04
- OpenGL 3.3
- GLFW
- GLAD
安装教程
apt-get install g++ cmake git
apt-get install libsoil-dev libglm-dev libassimp-dev libglew-dev libglfw3-dev libxinerama-dev libxcursor-dev libxi-dev
git clone https://github.com/JoeyDeVries/LearnOpenGL.git
cd LearnOpenGL
mkdir build
cd build
cmake ..
make -j8
编译完成后,各章节Demo可执行文件会在build/bin 目录下
任务
- 在model loading的Demo中, 示范了如何在OpenGL中导入一个.obj文件
- 运行范例程序,我们会看到如下画面.同时,我们可以利用鼠标和键盘(WASD),控制镜头的移动
- 运行范例程序,我们会看到如下画面.同时,我们可以利用鼠标和键盘(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的环境。