核心业务
gltMakeSphere(torusBatch, 0.5f, 10, 20);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- 设置透视投影(void ChangeSize(int w, int h)):
viewFrustum.SetPerspective(35.0f, float(w)/float(h), 1.0f, 1000.0f);
static CStopWatch rotTimer;
float yRot = rotTimer.GetElapsedSeconds() * 60.0f;
- 投影矩阵和模型视图矩阵处理逻辑(重点):将投影矩阵乘以模型视图矩阵,将变化结果通过矩阵乘法应用到mModelViewProjection矩阵上,不能模型视图矩阵乘以投影矩阵;
M3DMatrix44f mTranslate, mRotate, mModelview, mModelViewProjection;
m3dTranslationMatrix44(mTranslate, 0.0f, 0.0f, -2.5f);
m3dRotationMatrix44(mRotate, m3dDegToRad(yRot), 0.0f, 1.0f, 0.0f);
m3dMatrixMultiply44(mModelview, mTranslate, mRotate);
m3dMatrixMultiply44(mModelViewProjection, viewFrustum.GetProjectionMatrix(),mModelview);
示例代码
#include "GLTools.h"
#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
GLFrustum viewFrustum;
GLShaderManager shaderManager;
GLTriangleBatch torusBatch;
GLGeometryTransform transformPipeline;
void ChangeSize(int w, int h) {
if(h == 0)
h = 1;
glViewport(0, 0, w, h);
viewFrustum.SetPerspective(35.0f, float(w)/float(h), 1.0f, 1000.0f);
}
void RenderScene(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
static CStopWatch rotTimer;
float yRot = rotTimer.GetElapsedSeconds() * 60.0f;
M3DMatrix44f mTranslate, mRotate, mModelview, mModelViewProjection;
m3dTranslationMatrix44(mTranslate, 0.0f, 0.0f, -2.5f);
m3dRotationMatrix44(mRotate, m3dDegToRad(yRot), 0.0f, 1.0f, 0.0f);
m3dMatrixMultiply44(mModelview, mTranslate, mRotate);
m3dMatrixMultiply44(mModelViewProjection, viewFrustum.GetProjectionMatrix(),mModelview);
GLfloat vBlack[] = {1.0f, 0.0f, 0.0f, 1.0f};
shaderManager.UseStockShader(GLT_SHADER_FLAT, mModelViewProjection, vBlack);
torusBatch.Draw();
glutSwapBuffers();
glutPostRedisplay();
}
void SetupRC() {
glClearColor(0.8f, 0.8f, 0.8f, 1.0f);
shaderManager.InitializeStockShaders();
glEnable(GL_DEPTH_TEST);
gltMakeSphere(torusBatch, 0.5f, 10, 20);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
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球体自动旋转");
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;
}
效果展示