在OPENGLES的几乎大部分教程里,如果你稍微仔细一点会发现一个一直隐藏的问题:他们的选择都是基于GlRotate()这个函数来实现的,当你控制鼠标或者触屏来旋转物体的时候,开始时是正确,可是如果你水平方向旋转90度以上,再次向上旋转时,物体会向下旋转,甚至不上不下,让你的对物体的旋转看起来不伦不类。OPENGL,Unity3D里面也有这个问题,这是使用GlRotate()必然缺陷,前端时间老师让做一个小项目的时候,才意识到这个问题,实时渲染详解里有解释失真的原因。解决方法有两个,一是用四元函数,unity3里使用的是Quaternionrotation=Quaternion.Euler(y,x,0);。二是使用摄像机,我这里是用OPENGLES触屏实现的重绘函数代码如下:

doublexAn=Math.toRadians(xAngl);
doubleyAn=Math.toRadians(yAngle);

floatx=(float)(30*Math.cos(xAn)*Math.sin(yAn));//求出旋转后的相机的X坐标
floaty=(float)(30*Math.sin(xAn));
floatz=(float)(30*Math.cos(xAn)*Math.cos(yAn));


if(xAngl>90&&xAngl<270)//当旋转一定角度后要改变向上的方向,
MatrixState.setCamera(x,y,z,0,0,0,0,-1,0);
else
MatrixState.setCamera(x,y,z,0,0,0,0,1,0);
MatrixState.pushMatrix();

代码很简单,当时没有意识到,一头插进GlRotate()函数里,妄图实现,浪费了不少时间。文件源代码在附近里,我写的是基于ANROID。