include "GLMatrixStack.h"
1:GLMatrixStack (矩阵)堆栈的使用
GLMatrixStack,初始化时已经在堆栈中包含了单位矩阵
1:载入单位矩阵:GLMatrixStack::LoadIdentity()
2:载入任何矩阵:GLMatrixStack::LoadMatrix(m)
任何矩阵乘以栈顶元素并压栈:GLMatrixStack::MultMatrix(m)
获取栈顶矩阵:
1.const M3DMatrix44f& GLMatrixStack::GetMatrix()
2.void GLMatrixStack::GetMatrix(m)
压栈:复制当前矩阵(或指定矩阵),压入栈顶
1、GLMatrixStack::PushMatrix()
2、GLMatrixStack::PushMatrix(m)
3、GLMatrixStack::PushMatrix(frame)
出栈:GLMatrixStack::PopMatrix()
栈顶变换:对当前栈顶矩阵进行变换
Rotate(angle,x,y,z)
Translate(x,y,z)
Scale(x,y,z)
*参考:http://www.voidcn.com/article/p-sleockbb-db.html(OpenGL超级宝典笔记二 - 基础变换)
#include "GLFrustum.h"
glFrustum是opengl类库中的函数,它是将当前矩阵与一个透视矩阵相乘,把当前矩阵转变成透视矩阵.
常用函数
gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);
//fovy是视角的大小,以度为单位; [asp](http://www.2cto.com/kf/web/asp/)ect = w/h 是视景体的宽高比
void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble zNear,GLdouble zFar);
/* left,right 表示近平面左右两边相对于垂直平面的位置
bottom,top 表示近平面顶和底相对于水平面的位置
zNear和zFar是表示视点到远近投影平面的距离*/
参考:https://blog.csdn.net/bladeandmaster88/article/details/58588969
(glFrustum()和gluPerspective()详解)
#include"GLGeometryTransform.h"
几何图形变换管道,用来管理矩阵堆栈。
完成地图的绘制
#include "GLShaderManager.h"
#include "GLTools.h"
#include <glut/glut.h>
#include "GLMatrixStack.h"//矩阵
#include "GLFrustum.h"//视景体
#include "GLGeometryTransform.h"
GLShaderManager shaderManager; //着色器管理
GLMatrixStack modelViewMatrix; //模型视图矩阵 (模型矩阵将局部坐标系下的顶点坐标转化到世界坐标系下)
GLMatrixStack projectionMatrix;//投影矩阵
GLFrustum viewFrustum; //视景体
GLGeometryTransform transformPipeline; //几何图形变换管道
GLTriangleBatch torusBatch; //大球
GLTriangleBatch sphereBatch; //中球
GLBatch floorBatch; //地板
GLFrame cameraFrame; //角色帧 照相机角色帧
//**4 添加随机球
#define NUM_SPHERES 50
GLFrame spheres [NUM_SPHERES];
//为程序作一次性的设置
void SetupRC()
{
//1:初始化
glClearColor(0.3, 0.3, 0.3, 0);//背景颜色
shaderManager.InitializeStockShaders();
//2:开启深度测试
glEnable(GL_DEPTH_TEST);
//3.e设置 地板顶点数据(这块不用纠结,真正做的时候会有3D模型师给顶点的)
floorBatch.Begin(GL_LINES, 324);
for(GLfloat x = -20.0; x <= 20.0f; x+= 0.5) {
floorBatch.Vertex3f(x, -0.55f, 20.0f);
floorBatch.Vertex3f(x, -0.55f, -20.0f);
floorBatch.Vertex3f(20.0f, -0.55f, x);
floorBatch.Vertex3f(-20.0f, -0.55f, x);
}
floorBatch.End();
}
//开始渲染
void RenderScene(void)
{
//地板颜色
static GLfloat vFloorCColor[] = {0.0f,0.2f,0.4f,0.6f};
//清除颜色缓冲区和深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//绘制地板 GLT_SHADER_FLAT 平面着色器
shaderManager.UseStockShader(GLT_SHADER_FLAT,transformPipeline.GetModelViewProjectionMatrix(),vFloorCColor);
floorBatch.Draw();
//执行缓存区交换
glutSwapBuffers();
}
//窗口大小改变时接受新的宽度和高度,其中0,0代表窗口中视口的左下角坐标,w,h代表像素
void ChangeSize(int w,int h)
{
//设置视口
glViewport(0, 0,w, h);
//创建投影矩阵
viewFrustum.SetPerspective(35.0f, float(w/h), 1.0f, 100.0f);
//将其加载到投影矩阵堆栈上
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
}
int main(int argc,char* argv[])
{
//设置当前工作目录,针对MAC OS X
gltSetWorkingDirectory(argv[0]);
//初始化GLUT库
glutInit(&argc, argv);
/*初始化双缓冲窗口,其中标志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、 GLUT_STENCIL分别指
双缓冲窗口、RGBA颜色模式、深度测试、模板缓冲区*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//GLUT窗口大小,标题窗口
glutInitWindowSize(800,600);
glutCreateWindow("公转自转");
//注册回调函数
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
//驱动程序的初始化中没有出现任何问题。
GLenum err = glewInit();
//调用SetupRC
SetupRC();![1558427005897.jpg](https://img.haomeiwen.com/i9278567/c9dcbadc01a9e7e4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
glutMainLoop();
return 0;
}
*相关代码链接: https://pan.baidu.com/s/1U5sTcapQhbV1vpKrW1tPyg 提取码: 6vse *
网友评论