@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
//计算宽高比
float ratio=(float)width/height;
//设置透视投影
Matrix.frustumM(mProjectMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
//设置相机位置
//eyex,eyey,eyez 代表相机在坐标轴的位置,centerX,centerY,centerZ代表物体的中心坐标,upX,upY,upZ代表相机往哪边看
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, 7.0f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
//计算变换矩阵
Matrix.multiplyMM(mMVPMatrix,0,mProjectMatrix,0,mViewMatrix,0);
}
我们首先查看下setLookAtM方法的参数
坐标系图
第一类 相机的坐标 eyex,eyey,eyez
就是照相机在上图坐标系的位置
第二类 目标的位置 centerX,centerY,centerZ
就是图标在上图的位置(注意:9个数据是存在同一个空间坐标之中的)
第三类 相机的视觉向量 upx,upy,upz
也就是相机的方向。。。。。。这个需要大家理解一个知识。。叫做向量
向量。。就是有方向的量。。。。它有三个属性。。第一个就是起始点。。第二个方向。。 第三个就是量
就这里而言,起始点就是照相机,方向,,是由upx,upy,upz三个数据分别指向3个方向,,然后 合成所形成的方向
理解起来比较复杂。。那我们看图
总的来说,由三部分决定相机的视觉
相机的向量很容易理解。。。。例如。。。
1.相机就在Z轴上也就是,坐标0,0,3
2.目标就是远点,坐标0,0,0
3,现在向量upy=1.其他为0,,其实就表示着,相机对着XY所形成平面,正对着Y轴(注意。。这时候。。其实是没有X轴的。。。其实所存在的。。。只有YZ坐标系,看的时候,注意排除X轴,不然容易混乱)
同样的,如果UPX=1,UPY=0,upz=0,那么。。就排除Y轴,在Z轴上看X轴,,
二者所看到的图像方向是不一样的。
好吧。。。我们再用图说话
第一种情况、、、向量为0,1,0
你看到的应该是N
第二种情况、、、向量为1,0,0
你看到的应该是Z
说了这么多。。其实还是应该拿事物自己比划一下,这样才能加深理解