一、项目说明
这个opengl场景设计是我们的计算机图形学课程期末答辩大作业。此项目实现了一个简单的室内场景设计,此场景由沙发、茶几、桌子、水壶、地板、墙壁等元素构成,其中地板与墙壁采取了纹理贴图,并可使用键盘实现与场景的交互,可以实现视角漫游、物体旋转,控制光照等功能。另外,此场景设计简单,代码简洁,共使用430多行代码便实现了简单的场景设计与基本操作,并且每一句代码都有非常详细的注释,相信就算是一点opengl基础没有也可通过学习本项目轻松入门。
二、运行说明
1、电脑版本:win10
2、运行软件:Visual Studio 2019
3、运行说明:
在vs 2019的安装目录中放入opengl函数库(可根据网上教程),然后打开vs2019,创建工程,新建.cpp文件,把源代码粘贴过去,编译运行即可。
也可下载如下图的计算机图形学场景设计压缩包,解压后直接点击.sln文件,进入vs2019后,即可运行。
三、部分源代码:
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment( lib, "glaux.lib") // GLaux连接库
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "glut.h"
#include <windows.h>
#include "GLAUX.H"
#include <iostream>
using namespace std;
GLuint texture[4]; //定义纹理
static float ttrans[3] = {
2.64 ,2.64 ,2.64 };//ttrans[3]初始值为观察点的位置
float a = 0;//场景绕y旋转角度
void makeImage(void);
int myinit(void);
void display(void);
void myReshape(GLsizei w, GLsizei h);
GLuint g_bitmap[3];//纹理对应的编号 定义纹理的映射个数
//定义纹理、控制滤波、创建纹理
bool LoadGLTextures(char *filename, GLuint &texture) //加载位图文件 方法0
{
AUX_RGBImageRec *pImage = NULL;
pImage = auxDIBImageLoadA(filename); //装入位图
if (pImage == NULL)
return false;
glGenTextures(1, &texture); //生成贴图
glBindTexture(GL_TEXTURE_2D, texture); //贴图生效,绑定此纹理,让之后的任何纹理指令都可以配置当前绑定的纹理
//为当前绑定的纹理对象设置环绕、过滤方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //缩小时线性滤波
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_REPEAT); //扩大时线性滤波
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //纹理可以在s(X)方向上重复映射
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);//纹理可以再t(Y)方向上重复映射
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, pImage->sizeX, pImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pImage->data); //生成纹理,将载入的位图文件(*.bmp)转换成纹理贴图。
/*
GL_TEXTURE_2D 此纹理是一个2D纹理
4代表颜色成分是R(红色分量)、G(绿色分量)、B(蓝色分量)、Alpha
pImage->sizeX 纹理的宽度
pImage->sizeY 纹理的高度
GL_RGB, 告诉OpenGL图像数据由红、绿、蓝三色数据组成
GL_UNSIGNED_BYTE 组成图像的数据是无符号字节类型
pImage->data 告知opengl纹理数据的来源
*/
free(pImage->data);//释放位图内存
free(pImage);
return true;
}
void LoadTextMap(void) //加载图
{
LoadGLTextures("floor.bmp", g_bitmap[0]);