MatrixState:
public static void setInitStack()//获取不变换初始矩阵 { currMatrix=new float[16]; Matrix.setRotateM(currMatrix, 0, 0, 1, 0, 0); } public static void pushMatrix()//保护变换矩阵 { stackTop++; for(int i=0;i<16;i++) { mStack[stackTop][i]=currMatrix[i]; } } public static void popMatrix()//恢复变换矩阵 { for(int i=0;i<16;i++) { currMatrix[i]=mStack[stackTop][i]; } stackTop--; } public static void translate(float x,float y,float z)//设置沿xyz轴移动 { Matrix.translateM(currMatrix, 0, x, y, z); } public static void rotate(float angle,float x,float y,float z)//设置绕xyz轴移动 { Matrix.rotateM(currMatrix,0,angle,x,y,z); } public static void scale(float x,float y,float z) { Matrix.scaleM(currMatrix,0, x, y, z); } //插入自带矩阵 public static void matrix(float[] self) { float[] result=new float[16]; Matrix.multiplyMM(result,0,currMatrix,0,self,0); currMatrix=result; }
CP_Na_Cl:
public void drawSelf(){ MatrixState.rotate(roateX, 1, 0, 0); MatrixState.rotate(roateY, 0, 1, 0); MatrixState.rotate(roateZ, 0, 0, 1); drawLine(-offset, 1, 1, 1, 1); MatrixState.pushMatrix(); MatrixState.rotate(90, 0, 1, 0); drawLine(-offset, 1, 1, 1, 1); MatrixState.popMatrix(); MatrixState.pushMatrix(); MatrixState.rotate(90, 1, 0, 0); drawLine(-offset, 1, 1, 1, 1); MatrixState.popMatrix(); drawLine(0, 1, 1, 1, 1); MatrixState.pushMatrix(); MatrixState.rotate(90, 0, 1, 0); drawLine(0, 1, 1, 1, 1); MatrixState.popMatrix(); MatrixState.pushMatrix(); MatrixState.rotate(90, 1, 0, 0); drawLine(0, 1, 1, 1, 1); MatrixState.popMatrix(); drawLine(offset, 1, 1, 1, 1); MatrixState.pushMatrix(); MatrixState.rotate(90, 0, 1, 0); drawLine(offset, 1, 1, 1, 1); MatrixState.popMatrix(); MatrixState.pushMatrix(); MatrixState.rotate(90, 1, 0, 0); drawLine(offset, 1, 1, 1, 1); MatrixState.popMatrix(); draw5Big(-offset, 0, 1, 0, 1); draw4Small(-offset, 1, 1, 0, 1); draw4Big(0, 0, 1, 0, 1); draw5Small(0, 1, 1, 0, 1); draw5Big(offset, 0, 1, 0, 1); draw4Small(offset, 1, 1, 0, 1); }
总结:CP_Na_Cl中的rotatex是在MatrixState中rotate上进行的,rotatex用于计算比较,不过相当于rotate中的X!