• MatrixState的用法


    import java.nio.ByteBuffer;
    import java.nio.ByteOrder;
    import java.nio.FloatBuffer;
    import android.opengl.Matrix;
    
    //存储系统矩阵状态的类
    public class MatrixState 
    {  
    	private static float[] mProjMatrix = new float[16];//4x4矩阵 投影用
        private static float[] mVMatrix = new float[16];//摄像机位置朝向9参数矩阵   
        private static float[] currMatrix;//当前变换矩阵
        public static float[] lightLocation=new float[]{0,0,0};//定位光光源位置
        public static FloatBuffer cameraFB;    
        public static FloatBuffer lightPositionFB;
          
        //保护变换矩阵的栈
        static float[][] mStack=new float[10][16];
        static int stackTop=-1;
        
        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;
        }
        
        
        //设置摄像机
        static ByteBuffer llbb= ByteBuffer.allocateDirect(3*4);
        static float[] cameraLocation=new float[3];//摄像机位置
        public static void setCamera
        (
        		float cx,	//摄像机位置x
        		float cy,   //摄像机位置y
        		float cz,   //摄像机位置z
        		float tx,   //摄像机目标点x
        		float ty,   //摄像机目标点y
        		float tz,   //摄像机目标点z
        		float upx,  //摄像机UP向量X分量
        		float upy,  //摄像机UP向量Y分量
        		float upz   //摄像机UP向量Z分量		
        )
        {
            	Matrix.setLookAtM
                (
                		mVMatrix, 
                		0, 
                		cx,
                		cy,
                		cz,
                		tx,
                		ty,
                		tz,
                		upx,
                		upy,
                		upz
                );
            	
            	cameraLocation[0]=cx;
            	cameraLocation[1]=cy;
            	cameraLocation[2]=cz;
            	
            	llbb.clear();
                llbb.order(ByteOrder.nativeOrder());//设置字节顺序
                cameraFB=llbb.asFloatBuffer();
                cameraFB.put(cameraLocation);
                cameraFB.position(0);  
        }
        
        //设置透视投影参数
        public static void setProjectFrustum
        ( 
        	float left,		//near面的left
        	float right,    //near面的right
        	float bottom,   //near面的bottom
        	float top,      //near面的top
        	float near,		//near面距离
        	float far       //far面距离
        )
        {
        	Matrix.frustumM(mProjMatrix, 0, left, right, bottom, top, near, far);
        }
        
        //设置正交投影参数
        public static void setProjectOrtho
        (
        	float left,		//near面的left
        	float right,    //near面的right
        	float bottom,   //near面的bottom
        	float top,      //near面的top
        	float near,		//near面距离
        	float far       //far面距离
        )
        {    	
        	Matrix.orthoM(mProjMatrix, 0, left, right, bottom, top, near, far);
        }   
        //获取具体物体的总变换矩阵
        static float[] mMVPMatrix=new float[16];
        public static float[] getFinalMatrix()
        {	
        	Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, currMatrix, 0);
            Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);        
            return mMVPMatrix;
        }
        
        //获取具体物体的变换矩阵
        public static float[] getMMatrix()
        {       
            return currMatrix;
        }
        
        //获取投影矩阵
        public static float[] getProjMatrix()
        {
    		return mProjMatrix;
        }
        
        //获取摄像机朝向的矩阵
        public static float[] getCaMatrix()
        {
    		return mVMatrix;
        }
        
        
        
        //设置灯光位置的方法
        static ByteBuffer llbbL = ByteBuffer.allocateDirect(3*4);
        public static void setLightLocation(float x,float y,float z)
        {
        	llbbL.clear();
        	
        	lightLocation[0]=x;
        	lightLocation[1]=y;
        	lightLocation[2]=z;
        	
            llbbL.order(ByteOrder.nativeOrder());//设置字节顺序
            lightPositionFB=llbbL.asFloatBuffer();
            lightPositionFB.put(lightLocation);
            lightPositionFB.position(0);
        }
    }
    

  • 相关阅读:
    鼠标事件&键盘事件
    监听/移除事件 & 事件流 & 事件对象 & 事件委托
    javaScript操作cookie出现同名key
    Vue入门干货,以及遇到的坑
    WPF中Popup上的textbox无法切换到中文输入法
    RichTextBox FlowDocument类型操作
    Web微信协议
    计算机专业术语对照
    Ext.Net一般处理程序上传文件
    C# ObjectCache、OutputCache缓存
  • 原文地址:https://www.cnblogs.com/Anzhongliu/p/6092107.html
Copyright © 2020-2023  润新知