利用矩阵函数完成平移、旋转、缩放、综合变换
- m3dTranslationMatrix44(M3DMatrix44f m, float x, float y, float z)
- m3dRotationMatrix44(M3DMatrix44f m, float angle, float x, float y, float z)
- m3dScaleMatrix44(M3DMatrix44f m, float xScale, float yScale, float zScale)
- m3dMatrixMultiply44(M3DMatrix44f,product,const M3DMatrix44f a, const M3DMatrix44f b)
- GLShaderManager::UseStockShader(GLUT_SHADER_FLAT,M3DMatirx44 m,GLfloat vColor[4])
#include<GLTools.h>
#include<GLShaderManager.h>
#include<math3d.h>
#include<math.h>
#include<GLUT/GLUT.h>
GLBatch squareBatch;
GLShaderManager shaderManager;
GLfloat blockSize=0.1f;
GLfloat vVerts[]= { -blockSize, -blockSize, 0.0f,
blockSize, -blockSize, 0.0f,
blockSize, blockSize, 0.0f,
-blockSize, blockSize, 0.0f};
GLfloat xPos=0.0f;
GLfloat yPos=0.0f;
void SetupRC()
{
glClearColor(0.0f,0.0f,1.0f,1.0f);
shaderManager.InitializeStockShaders();
squareBatch.Begin(GL_TRIANGLE_FAN,4);
squareBatch.CopyVertexData3f(vVerts);
squareBatch.End();
}
void SpecialKeys(int key, int x,int y)
{
GLfloat stepSize=0.025f;
if(key==GLUT_KEY_UP)
yPos+=stepSize;
if(key==GLUT_KEY_DOWN)
yPos-=stepSize;
if(key==GLUT_KEY_LEFT)
xPos-=stepSize;
if(key==GLUT_KEY_RIGHT)
xPos+=stepSize;
if(xPos < (-1.0f + blockSize)) xPos = -1.0f + blockSize;
if(xPos > (1.0f - blockSize)) xPos = 1.0f - blockSize;
if(yPos < (-1.0f + blockSize)) yPos = -1.0f + blockSize;
if(yPos > (1.0f - blockSize)) yPos = 1.0f - blockSize;
glutPostRedisplay();
}
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
GLfloat vRed[]={1.0f,0.0f,0.0f,1.0f};
M3DMatrix44f mFinalTransform,mTranslationMatrix,mRotationMatrix;
m3dTranslationMatrix44(mTranslationMatrix, xPos, yPos, 0.0f);
static float yRot=0.0f;
yRot+=5.0f;
m3dRotationMatrix44(mRotationMatrix,m3dDegToRad(yRot),0.0f,0.0f,1.0f);//绕任意向量旋转多少度
m3dMatrixMultiply44(mFinalTransform,mTranslationMatrix,mRotationMatrix);
//平面着色器,在进行渲染之前,用每个向量✖️矩阵mFinalTransForm
shaderManager.UseStockShader(GLT_SHADER_FLAT,mFinalTransform,vRed);
squareBatch.Draw();
glutSwapBuffers();
}
void ChangeSize(int w,int h)
{
glViewport(0,0,w,h);
}
int main(int argc,char*argv[])
{
gltSetWorkingDirectory(argv[0]);
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);
glutInitWindowSize(600,600);
glutCreateWindow("Move Block with Arrow Keys");
GLenum err=glewInit();
if(GLEW_OK!=err)
{
fprintf(stderr,"Error:%s\n",glewGetErrorString(err));
return 1;
}
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
glutSpecialFunc(SpecialKeys);
SetupRC();
glutMainLoop();
return 0;
}