在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();
}

网友评论