Xcode+Opengl學習(4)利用矩陣使一個矩形邊下降邊旋轉

利用矩陣函數完成平移、旋轉、縮放、綜合變換

  • 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;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章