一、运行效果展示
可以通过方向键转动方向
二、代码实现
1、代码设计实现流程
2、代码
0)相关类定义
//演示了OpenGL背面剔除,深度测试,和多边形模式
#include "GLTools.h"
#include "GLMatrixStack.h"
#include "GLFrame.h"
#include "GLFrustum.h"
#include "GLGeometryTransform.h"
#include <math.h>
#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif
设置角色帧,作为相机,设置观察者视图坐标
GLFrame viewFrame;
//使用GLFrustum类来设置透视投影
GLFrustum viewFrustum;
GLTriangleBatch torusBatch; //容器类
GLMatrixStack modelViewMatix; //模型视图矩阵
GLMatrixStack projectionMatrix;//物理投影矩阵
GLGeometryTransform transformPipeline;//变换管道,存储模型视图/投影/模型视图投影矩阵
GLShaderManager shaderManager; //存储着色器管理工具类
1)创建窗口代码实现
//窗口改变
void ChangeSize(int w, int h)
{
//1、防止h变为 0
if(h == 0)
h = 1;
//2.设置视口窗口尺寸
glViewport(0, 0, w, h);
//3.setPrespective 函数的参数是一个从顶点方向看去的视场角度(用角度值表示)
//设置透视模式,初始化其透视矩阵
viewFrustum.SetPerspective(35.f, float(w)/float(h), 1.f, 100.f);
//4.把透视矩阵加载到透视矩阵对阵中
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
//5.初始化渲染管线
transformPipeline.SetMatrixStacks(modelViewMatix, projectionMatrix);
}
2)方向事件响应代码实现
//键位设置,通过不同的键位对其进行设置
//控制Camera的移动,从而改变视口
void SpecialKeys(int key, int x, int y)
{
//判断方向
if (key == GLUT_KEY_UP) {
//2.根据方向调整观察者位置
viewFrame.RotateWorld(m3dDegToRad(-5.0), 1.0f, 0.0f, 0.0f);
}
if (key == GLUT_KEY_DOWN) {
viewFrame.RotateWorld(m3dDegToRad(5.0), 1.0f, 0.0f, 0.0f);
}
if (key == GLUT_KEY_LEFT) {
viewFrame.RotateWorld(m3dDegToRad(-5.0), 0.0f,