您的位置:首页 > 运维架构

OpenGL 入门教程(五) -- 模型视图投影矩阵

2017-12-07 11:38 387 查看
// ModelviewProjection.cpp
// OpenGL SuperBible
// Demonstrates OpenGL the ModelviewProjection matrix
// Program by Richard S. Wright Jr.
#include <GLTools.h>	// OpenGL toolkit
#include <GLMatrixStack.h>
#include <GLFrame.h>
#include <GLFrustum.h>
#include <GLGeometryTransform.h>
#include <GLBatch.h>
#include <StopWatch.h>

#include <math.h>
#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif

// Global view frustum class  平截头体
GLFrustum           viewFrustum;

// The shader manager
GLShaderManager     shaderManager;

// The torus
GLTriangleBatch     torusBatch;

// Set up the viewport and the projection matrix
void ChangeSize(int w, int h)
{
// Prevent a divide by zero
if (h == 0)
h = 1;

// Set Viewport to window dimensions
glViewport(0, 0, w, h);
//设置透视投影            视角   方向                   近   远
viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 10.0f);
}

// Called to draw scene
void RenderScene(void)
{
// Set up time based animation
static CStopWatch rotTimer;
float yRot = rotTimer.GetElapsedSeconds() * 60.0f;

// Clear the window and the depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Matrix Variables
M3DMatrix44f mTranslate, mRotate, mModelview, mModelViewProjection;

// Create a translation matrix to move the torus back and into sight
m3dTranslationMatrix44(mTranslate, 0.0f, 0.0f, -2.5f);

// Create a rotation matrix based on the current value of yRot
m3dRotationMatrix44(mRotate, m3dDegToRad(yRot), 0.0f, 1.0f, 0.0f);

// Add the rotation to the translation, store the result in mModelView
m3dMatrixMultiply44(mModelview, mTranslate, mRotate);

//将坐标系缩减到正方体中(3D,模型视图是2D的,通过深度测试绘制出类似3D效果)
//通过将投影矩阵mModelviewviewFrustu得到m.GetProjectionMatrix()矩阵模型视图投影矩阵mModelViewProjection
// Add the modelview matrix to the projection matrix,
// the final matrix is the ModelViewProjection matrix.
//mModelview --copy to--> viewFrustum.GetProjectionMatrix() -- copy to -> mModelViewProjection
//mModelview  -> viewFrustum投影矩阵 -> mModelViewProjection最终矩阵<模型视图投影矩阵>(透视投影的最终矩阵)
m3dMatrixMultiply44(mModelViewProjection, viewFrustum.GetProjectionMatrix(), mModelview);

// Pass this completed matrix to the shader, and render the torus
GLfloat vBlack[] = { 0.0f, 0.0f, 0.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_FLAT, mModelViewProjection, vBlack);
torusBatch.Draw();

// Swap buffers, and immediately refresh
glutSwapBuffers();
glutPostRedisplay();
}

// This function does any needed initialization on the rendering
// context.
void SetupRC()
{
// Black background
glClearColor(0.8f, 0.8f, 0.8f, 1.0f);

glEnable(GL_DEPTH_TEST);

shaderManager.InitializeStockShaders();

// This makes a torus
gltMakeTorus(torusBatch, 0.4f, 0.15f, 30, 30);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}

///////////////////////////////////////////////////////////////////////////////
// Main entry point for GLUT based programs
int main(int argc, char* argv[])
{
gltSetWorkingDirectory(argv[0]);

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
glutInitWindowSize(800, 600);
glutCreateWindow("ModelViewProjection Example");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);

GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}

SetupRC();

glutMainLoop();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: