美文网首页
OpenGL绘制地板

OpenGL绘制地板

作者: 忆痕无殇 | 来源:发表于2019-05-21 15:34 被阅读0次
地板绘制.jpg
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 *

相关文章

网友评论

      本文标题:OpenGL绘制地板

      本文链接:https://www.haomeiwen.com/subject/lzhjzqtx.html