美文网首页OpenGL
OpenGL学习 mvp矩阵

OpenGL学习 mvp矩阵

作者: FireStroy | 来源:发表于2020-07-09 00:14 被阅读0次

    在OpenGL中 对三围空间的物体进行平移、旋转、缩放需要借助于矩阵的操作。
    注意:矩阵的操作先后顺序对最后的结果可能会产生不同的结果。
    mvp矩阵
    mvp矩阵即模型矩阵,观察矩阵和投影矩阵。
    模型矩阵用来从模型坐标系变换到世界坐标系中。
    观察变换就是从世界坐标系下变换到观察坐标系下,就是在世界坐标系下设置个观察点(相机位置以及相机方向),然后把世界坐标系下的坐标变换到相机空间。
    透视矩阵负责在2D屏幕上显示3D图形效果。把眼睛看到的view平面化到屏幕上。
    先实际操作一下:
    这里使用的是GLUT

        //2.创建投影矩阵
        viewFrustum.SetPerspective(25.0f, float(w) / float(h), 1.0f, 500.0f);
        projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
        transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
    
    

    glutDisplayFunc(reshapeFunc);注册函数中

    void reshapeFunc(void){
        …
        modelViewMatrix.PushMatrix();
        //添加照相机矩阵
        M3DMatrix44f mCamera;
        cameraFrame.GetCameraMatrix(mCamera);
        modelViewMatrix.MultMatrix(mCamera);
    
        //创建mObjectFrame矩阵
        M3DMatrix44f mObjectFrame;
        objectFrame.GetMatrix(mObjectFrame);
        modelViewMatrix.MultMatrix(mObjectFrame);
        //... 绘制函数
        modelViewMatrix.PopMatrix();
        ...
    }
    

    移动上下左右键 旋转物体

    void SpecialKeys(int key, int x, int y)
    {
        if(key == GLUT_KEY_UP)
           objectFrame.RotateWorld(m3dDegToRad(-5.0f), 1.0f, 0.0f, 0.0f);
        if(key == GLUT_KEY_DOWN)
           objectFrame.RotateWorld(m3dDegToRad(5.0f), 1.0f, 0.0f, 0.0f);
        if(key == GLUT_KEY_LEFT)
            objectFrame.RotateWorld(m3dDegToRad(5.0f), 0.0f, 1.0f, 0.0f);
        if(key == GLUT_KEY_RIGHT)
           objectFrame.RotateWorld(m3dDegToRad(-5.0f), 0.0f, 1.0f, 0.0f);
          glutPostRedisplay();
    }
    
    让物体旋转

    移动上下左右键 让视角移动
    为了便于参考 增加地面网格 和一些小球

    void SpecialKeys(int key, int x, int y)
    {
        if(key == GLUT_KEY_UP)
            cameraFrame.RotateWorld(m3dDegToRad(-5.0f), 1.0f, 0.0f, 0.0f);
        if(key == GLUT_KEY_DOWN)
            cameraFrame.RotateWorld(m3dDegToRad(5.0f), 1.0f, 0.0f, 0.0f);
        if(key == GLUT_KEY_LEFT)
            cameraFrame.RotateWorld(m3dDegToRad(5.0f), 0.0f, 1.0f, 0.0f);
        if(key == GLUT_KEY_RIGHT)
            cameraFrame.RotateWorld(m3dDegToRad(-5.0f), 0.0f, 1.0f, 0.0f);
        glutPostRedisplay();
    }
    
    
    旋转视角

    相关文章

      网友评论

        本文标题:OpenGL学习 mvp矩阵

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