这里着重介绍对WASD键的响应动作。
因为这个比较简单,呵呵。
对视图矩阵中的 m[3][0] 进行加加减减就可以完成对AD键对应的动作。
对视图矩阵中的 m[3][2] 进行加加减减就可以完成对WS键对应的动作。
简单的写两句代码:
// get the modelview matrix
float mat[4][4];
glGetFloatv(GL_MODELVIEW_MATRIX, (float*)mat);
if(KeyDown('W')){
mat[3][2] += speed;
}
...
glLoadMatrixf((float*)mat);
原理:
模型视图矩阵:由模型矩阵和视图矩阵的乘积得到的。
对于一个3D坐标的变换在数学上可以认为是先乘模型矩阵再乘视图矩阵:(Mmv = Mm * Mv)
然而对于视图矩阵又可以理解为先进行一次仿射变换再进行一次平移变换,
Mv11 Mv11 Mv11 0 1 0 0 0
Mv = Mv21 Mv11 Mv11 0 * 0 1 0 0
Mv31 Mv11 Mv11 0 0 0 1 0
0 0 0 1 x y z 1
在opengl中摄像机是被固定在世界坐标的原点上的,朝向z的负半轴。
在逻辑上对摄像机的移动其实是对世界的移动来完成的。
通过以上分析得出,对世界移动的最后一步是一次平移,
是不是很简单了。