1. 下载所需文件
-
官方链接,所有类型的文件是齐全的:官网
-
OneDrive分享:OneDrive地址
2. 配置VS目录
2.1 步骤
-
新建C++的控制台项目
-
项目属性中配置依赖项
-
注意:不是要新增加目录,而是需要把对应文件放进对应的文件夹中
-
dll文件需要放进文件夹(
C:\Windows\SysWOW64
)(64位)中,或者文件夹(C:\Windows\System32
) -
.h头文件添加入项目中
-
.lib文件放进
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include
(根据自己的实际目录位置)
-
完成上述步骤,环境就已经配置好
-
注意
一定要把所有的.h头文件放进include目录中,所有.lib文件放进lib目录中,所有.dll文件放进系统文件夹中!!!!否则会出现include找不到头文件等错误
2.2 测试环境(Code)
- 用于测试的代码(引用于网络)
#include<glut.h>
#include<gl/glu.h>
#include<gl/gl.h>
void renderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glBegin(GL_TRIANGLES);
glVertex3f(-0.5, -0.5, 0.0);
glVertex3f(0.5, 0.0, 0.0);
glVertex3f(0.0, 0.5, 0.0);
glEnd();
glutSwapBuffers();
}
int main(int argc, char* argv[])
{
glutInit(&argc, (char**)argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(320, 320);
glutCreateWindow("Hello OpenGL");
glutDisplayFunc(renderScene);
glutMainLoop();//enters the GLUT event processing loop.
return 0;
}
3. 实例
3.1 问题描述
- 太阳系模型动画
建立太阳、地球和月亮的运动模型;增加光照系统,模拟太阳、地球和月亮的光照环境;并用动画方式显示模型。以加深学生对几何变换、投影变换以及观察变换的理解。
3.2 初步原型
- 待修改
/**********************************************************
* 太阳的直径为139万千米,为地球的109倍,是月球的400倍。
* 这样的比例太过于悬殊 不利于实现
* 故采取太阳:地球:月亮=60:4:1
*/
#include <windows.h>
#include <gl/glut.h>
static int year = 0, day = 0;
static int sun = 0;
void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(0x1D00);
}
void display()
{
//清除屏幕上的内容 否则会堆积
glClear(0x00004000);
glColor3f(1.0, 1.0, 1.0);
//旋转操作
glPushMatrix();
glRotatef((GLfloat)sun, 0.0, 1.0, 0.0);//绕Y旋转
//glutSolidSphere(1.0, 20, 16);//实心球体
glutWireSphere(1.0, 20, 16);//画网格球体
glRotatef((GLfloat)year, 0.0, 1.0, 0.0);
glTranslatef(2.0, 0.0, 0.0);
glRotatef((GLfloat)day, 0.0, 1.0, 0.0);
//glutSolidSphere(0.2, 10, 8);
glutWireSphere(0.2, 10, 8);
//生成带纹理球体
//GLUquadricObj *m_pObj;//保存绘图模式、法线模式、法线朝向、纹理等信息
//m_pObj = gluNewQuadric();
//gluSphere(m_pObj, 1.0, 20, 16);
//glPopMatrix();
glutSwapBuffers();//交换缓冲区
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);//显示窗口
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//定义一个视图矩阵,并与当前矩阵相乘
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 'd':
day = (day + 10) % 360;
sun = (sun + 1) % 360;
glutPostRedisplay();
break;
case 'D':
day = (day - 10) % 360;
sun = (sun + 1) % 360;
glutPostRedisplay();
break;
case 'y':
year = (year + 5) % 360;
sun = (sun + 1) % 360;
glutPostRedisplay();
break;
case 'Y':
year = (year - 5) % 360;
sun = (sun + 1) % 360;
glutPostRedisplay();
break;
default:
break;
}
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitWindowSize(1000, 1000);//改变视窗大小
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);//
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
```