zoukankan      html  css  js  c++  java
  • 最新广商小助手 项目进展 OpenGL ES 3D在我项目中引用 代码太多只好选重要部分出来

    package com.example.home;
    
    import java.io.IOException;
    import java.io.InputStream;
    import javax.microedition.khronos.egl.EGLConfig;
    import javax.microedition.khronos.opengles.GL10;
    import javax.microedition.khronos.opengles.GL11;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.opengl.GLSurfaceView;
    import android.opengl.GLU;
    import android.opengl.GLUtils;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    
    
    
    public class MyGLView extends GLSurfaceView{
        private final float TOUCH_SCALE_FACTOR = 180.0f/1000;//角度缩放比例
        private SceneRenderer renderer;//场景渲染器
        private float previousX;//上次的触控位置
        private float previousY; 
        private float cameraX=0;//摄像机的位置
        private float cameraY=0;
        private float cameraZ=0;
        private float targetX=0;//看点
        private float targetY=0;
        private float targetZ=-4;
        private float sightDis=40;//摄像机和目标的距离
        private float angdegElevation=45;//仰角
        private float angdegAzimuth=90;//方位角
        //关于灯光旋转的量
        float angdegLight=0;//灯光旋转的角度
        float angdegZ=45;//灯在xz面上的投影与z轴的夹角
        float rLight=10;
        LightRatateThread lightRatateThread;//旋转灯的线程
        public MyGLView(Context context) {
            super(context);
            renderer=new SceneRenderer();//创建渲染器
            this.setRenderer(renderer);//设置渲染器
            this.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式为主动渲染   
        }
        //触摸事件回调方法
        @Override 
        public boolean onTouchEvent(MotionEvent e) {
            float y = e.getY();
            float x = e.getX();
            switch (e.getAction()) {
            case MotionEvent.ACTION_MOVE:
                float dy = y - previousY;//计算触控笔Y位移
                float dx = x - previousX;//计算触控笔Y位移
                angdegAzimuth += dx * TOUCH_SCALE_FACTOR;//设置沿y轴旋转角度
                angdegElevation+= dy * TOUCH_SCALE_FACTOR;//设置沿x轴旋转角度
                requestRender();//重绘画面
            }
            previousY = y;//记录触控笔位置
            previousX = x;//记录触控笔位置
            return true;
        }
        private class SceneRenderer implements GLSurfaceView.Renderer {
    
    
    
            Dadi dimian;//地面
            longCube longcube;//左教学楼
            longCube longcube2;//右教学楼
            longCube northcube;//北教学楼
            longCube southcube;//南教学楼
            longCube westcube;//西教学楼
            longCube eastcube;//东教学楼
            
            longCube zoulang1;//左前走廊下
            longCube zoulang2;//左后走廊下
            longCube zoulang3;//右前走廊下
            longCube zoulang4;//右后走廊下
            
            longCube zoulang1_1;//左前走廊中
            longCube zoulang2_1;//左后走廊中
            longCube zoulang3_1;//右前走廊中
            longCube zoulang4_1;//右后走廊中
            
            Cylinder cylinder1;//1右圆柱
            Cylinder cylinder1_1;//1左圆柱
            
            Cylinder cylinder2;//2右圆柱
            Cylinder cylinder2_1;//2左圆柱
            
            Cylinder cylinder3;//3右圆柱
            Cylinder cylinder3_1;//3左圆柱
            
            Cylinder cylinder4;//4右圆柱
            Cylinder cylinder4_1;//4左圆柱
            
            sanlingzui louti;//梯台
            
            Cylinder cylinderAA;//1号楼梯
            Cylinder cylinderBB;//2号楼梯
            Cylinder cylinderCC;//3号楼梯
            Cylinder cylinderDD;//4号楼梯
            
            longCube caocong1;//左草丛
            longCube caocong2;//右草丛
            
            longCube paifang;//牌坊
            
            Cylinder p1;//牌坊1柱
            Cylinder p2;//牌坊2柱
            
            Cylinder p3;//牌坊3柱
            Cylinder p4;//牌坊4柱
            
            Ball tree1;//
            Ball tree2;//
            
            Cylinder gan1;//树干1
            Cylinder gan2;//树干2
            private int[] textureIds;
            
            private int topTexIdPlat;
            private int sideTexIdPlat;
            private int bottomTexIdPlat;
            private int AAding;
            private int ok;
            private int kk;
            private int[] huacong;
            private int cylinderSideTexId;
            private int loucheng;
            private int[] face;
            private int greenye;
            private int shugan;
            public SceneRenderer(){}
            @Override
            public void onDrawFrame(GL10 gl) {
                gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);//清除颜色与深度缓存
                gl.glMatrixMode(GL10.GL_MODELVIEW);//设置当前矩阵为模式矩阵
                gl.glLoadIdentity();//设置当前矩阵为单位矩阵  
                double angradElevation=Math.toRadians(angdegElevation);//仰角(弧度)
                double angradAzimuth=Math.toRadians(angdegAzimuth);//方位角
                cameraX=(float) (targetX+sightDis*Math.cos(angradElevation)*Math.cos(angradAzimuth));
                cameraY=(float) (targetY+sightDis*Math.sin(angradElevation));
                cameraZ=(float) (targetZ+sightDis*Math.cos(angradElevation)*Math.sin(angradAzimuth));
                GLU.gluLookAt(//设置camera位置
                        gl, 
                        cameraX, //人眼位置的X
                        cameraY, //人眼位置的Y
                        cameraZ, //人眼位置的Z
                        targetX, //人眼球看的点X
                        targetY, //人眼球看的点Y
                        targetZ, //人眼球看的点Z
                        0,  //头的朝向
                        1, 
                        0
                );
                //设置定位光
                double angradLight=Math.toRadians(angdegLight);
                double angradZ=Math.toRadians(angdegZ);
                float[] positionParams={
                        (float) (-rLight*Math.cos(angradLight)*Math.sin(angradZ)),
                        (float) (rLight*Math.sin(angradLight)),
                        (float) (rLight*Math.cos(angradLight)*Math.cos(angradZ)),
                        1};//设置定位光
                gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, positionParams,0);
                gl.glTranslatef(0, 0f, -6f);
      
     
     
               
                //调整与原点的位置 左右 ,上下,前后
                //地面
                gl.glPushMatrix();
                gl.glTranslatef(0,-dimian.h-2,0);
                dimian.drawSelf(gl);
                gl.glPopMatrix();
                //左教学楼
                gl.glPushMatrix();
                gl.glTranslatef(-3f, longcube.b/2-2, -1.0f);
                longcube.drawSelf(gl);
                gl.glPopMatrix();
                //右教学楼
                gl.glPushMatrix();
                gl.glTranslatef(3f, longcube2.b/2-2, -1.0f);
                longcube2.drawSelf(gl);
                gl.glPopMatrix();       
                //北教学楼
                gl.glPushMatrix();
                gl.glTranslatef(0f, northcube.b/2-2, -2.0f);
                northcube.drawSelf(gl);
                gl.glPopMatrix();
                //南教学楼
                gl.glPushMatrix();
                gl.glTranslatef(0f, southcube.b/2-2, 0.0f);
                southcube.drawSelf(gl);
                gl.glPopMatrix();
                //西教学楼
                gl.glPushMatrix();
                gl.glTranslatef(-1f, westcube.b/2-2, -1.0f);
                westcube.drawSelf(gl);
                gl.glPopMatrix();
                //东教学楼
                gl.glPushMatrix();
                gl.glTranslatef(1f, eastcube.b/2-2, -1.0f);
                eastcube.drawSelf(gl);
                gl.glPopMatrix();
                //调整与原点的位置 左右 ,上下,前后
                //左前走廊下
                gl.glPushMatrix();
                gl.glTranslatef(-2f, zoulang1.b/2-2+0.2f, 0.0f);
                zoulang1.drawSelf(gl);
                gl.glPopMatrix();
                //左后走廊下
                gl.glPushMatrix();
                gl.glTranslatef(-2f, zoulang2.b/2-2+0.2f, -2.0f);
                zoulang2.drawSelf(gl);
                gl.glPopMatrix();
                //右前走廊下
                gl.glPushMatrix();
                gl.glTranslatef(2f, zoulang3.b/2-2+0.2f, 0.0f);
                zoulang3.drawSelf(gl);
                gl.glPopMatrix();
                //右后走廊下
                gl.glPushMatrix();
                gl.glTranslatef(2f, zoulang4.b/2-2+0.2f, -2.0f);
                zoulang4.drawSelf(gl);
                gl.glPopMatrix();
                //调整与原点的位置 左右 ,上下,前后
                //左前走廊中
                gl.glPushMatrix();
                gl.glTranslatef(-2f, zoulang1.b/2-2+0.8f, 0.0f);
                zoulang1_1.drawSelf(gl);
                gl.glPopMatrix();
                //左后走廊中
                gl.glPushMatrix();
                gl.glTranslatef(-2f, zoulang2.b/2-2+0.8f, -2.0f);
                zoulang2_1.drawSelf(gl);
                gl.glPopMatrix();
                //右前走廊中
                gl.glPushMatrix();
                gl.glTranslatef(2f, zoulang3.b/2-2+0.8f, 0.0f);
                zoulang3_1.drawSelf(gl);
                gl.glPopMatrix();
                //右后走廊中
                gl.glPushMatrix();
                gl.glTranslatef(2f, zoulang4.b/2-2+0.8f, -2.0f);
                zoulang4_1.drawSelf(gl);
                gl.glPopMatrix();
              //调整与原点的位置 左右 ,上下,前后
                //1右圆柱
                gl.glPushMatrix();
                gl.glTranslatef(-1.7f,zoulang1.b/2-2+0.2f, 0.2f);
                cylinder1.drawSelf(gl);
                gl.glPopMatrix();
                
                //1左圆柱
                gl.glPushMatrix();
                gl.glTranslatef(-2.2f,zoulang1.b/2-2+0.2f, 0.2f);
                cylinder1_1.drawSelf(gl);
                gl.glPopMatrix();
             
                //2右圆柱
                gl.glPushMatrix();
                gl.glTranslatef(-1.7f,zoulang2.b/2-2+0.2f, -2.0f);
                cylinder2.drawSelf(gl);
                gl.glPopMatrix();
                
              //2左圆柱
                gl.glPushMatrix();
                gl.glTranslatef(-2.2f,zoulang2.b/2-2+0.2f,-2.0f);
                cylinder2_1.drawSelf(gl);
                gl.glPopMatrix();
                
              //3右圆柱
                gl.glPushMatrix();
                gl.glTranslatef(1.7f,zoulang1.b/2-2+0.2f, 0.2f);
                cylinder3.drawSelf(gl);
                gl.glPopMatrix();
                
              //3左圆柱
                gl.glPushMatrix();
                gl.glTranslatef(2.2f,zoulang1.b/2-2+0.2f, 0.2f);
                cylinder3_1.drawSelf(gl);
                gl.glPopMatrix();
                
              //4右圆柱
                gl.glPushMatrix();
                gl.glTranslatef(1.7f,zoulang1.b/2-2+0.2f, -2.0f);
                cylinder4.drawSelf(gl);
                gl.glPopMatrix();
                
              //4左圆柱
                gl.glPushMatrix();
                gl.glTranslatef(2.2f,zoulang1.b/2-2+0.2f, -2.0f);
                cylinder4_1.drawSelf(gl);
                gl.glPopMatrix();
                
              //调整与原点的位置 左右 ,上下,前后 
              //楼梯
                gl.glPushMatrix();
                gl.glTranslatef(0,-dimian.h-2+0.5f,1.3f);
                louti.drawSelf(gl);
                gl.glPopMatrix();
                
                
              //教学楼内部楼梯
              //cylinderAA号圆柱
                gl.glPushMatrix();
                gl.glTranslatef(-3.6f,zoulang1.b/2-2, -2.0f);
                cylinderAA.drawSelf(gl);
                gl.glPopMatrix();
                
                
                //cylinderBB号圆柱
                gl.glPushMatrix();
                gl.glTranslatef(-3.6f,zoulang1.b/2-2, 0f);
                cylinderBB.drawSelf(gl);
                gl.glPopMatrix();
                
                //cylinderCC号圆柱
                gl.glPushMatrix();
                gl.glTranslatef(3.6f,zoulang1.b/2-2, -2.0f);
                cylinderCC.drawSelf(gl);
                gl.glPopMatrix();
                
                //cylinderDD号圆柱
                gl.glPushMatrix();
                gl.glTranslatef(3.6f,zoulang1.b/2-2, 0f);
                cylinderDD.drawSelf(gl);
                gl.glPopMatrix();
              //调整与原点的位置 左右 ,上下,前后
                //左花丛
                gl.glPushMatrix();
                gl.glTranslatef(-1.2f, -dimian.h-2+0.8f, 1.2f);
                caocong1.drawSelf(gl);
                gl.glPopMatrix();
                //右花丛
                gl.glPushMatrix();
                gl.glTranslatef(1.2f, -dimian.h-2+0.8f, 1.2f);
                caocong2.drawSelf(gl);
                gl.glPopMatrix();
              //调整与原点的位置 左右 ,上下,前后
                //牌坊
                gl.glPushMatrix();
                gl.glTranslatef(0f, 0.7f, 1.2f);
                paifang.drawSelf(gl);
                gl.glPopMatrix();
                
              //p1柱
                gl.glPushMatrix();
                gl.glTranslatef(-2.7f,zoulang1.b/2-2f,1.2f );
                p1.drawSelf(gl);
                gl.glPopMatrix();
                
              //p2柱
                gl.glPushMatrix();
                gl.glTranslatef(-2f,zoulang1.b/2-2f,1.2f );
                p2.drawSelf(gl);
                gl.glPopMatrix();
                
              //p3柱
                gl.glPushMatrix();
                gl.glTranslatef(2f,zoulang1.b/2-2f,1.2f );
                p3.drawSelf(gl);
                gl.glPopMatrix();
                
              //p4柱
                gl.glPushMatrix();
                gl.glTranslatef(2.7f,zoulang1.b/2-2f,1.2f );
                p4.drawSelf(gl);
                gl.glPopMatrix();
              //调整与原点的位置 左右 ,上下,前后
              //
                gl.glPushMatrix();
                gl.glTranslatef(-1.5f,-0.6f, 2.5f);
                tree1.drawSelf(gl);
                gl.glPopMatrix();
                
              //
                gl.glPushMatrix();
                gl.glTranslatef(1.5f,-0.6f, 2.5f);
                tree2.drawSelf(gl);
                gl.glPopMatrix();
                
              //树干1
                gl.glPushMatrix();
                gl.glTranslatef(-1.5f,zoulang1.b/2-2f,2.5f );
                gan1.drawSelf(gl);
                gl.glPopMatrix();
                
              //树干2
                gl.glPushMatrix();
                gl.glTranslatef(1.5f,zoulang1.b/2-2f,2.5f );
                gan2.drawSelf(gl);
                gl.glPopMatrix();
            }
            @Override
            public void onSurfaceChanged(GL10 gl, int width, int height) {           
                gl.glViewport(0, 0, width, height); //设置视窗大小及位置             
                gl.glMatrixMode(GL10.GL_PROJECTION);//设置当前矩阵为投影矩阵            
                gl.glLoadIdentity();//设置当前矩阵为单位矩阵            
                float ratio = (float) width / height;//计算透视投影的比例            
                gl.glFrustumf(-ratio, ratio, -1, 1, 6f, 100);//调用此方法计算产生透视投影矩阵
                
                lightRatateThread=new LightRatateThread(MyGLView.this);//创建并开启线程
                lightRatateThread.start();
            }
            @Override
            public void onSurfaceCreated(GL10 gl, EGLConfig config) {            
                gl.glDisable(GL10.GL_DITHER);//关闭抗抖动             
                gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);//设置特定Hint项目的模式          
                gl.glClearColor(0,0,0,0); //设置屏幕背景色黑色RGBA    
                gl.glEnable(GL10.GL_CULL_FACE);//设置为打开背面剪裁
                gl.glEnable(GL10.GL_DEPTH_TEST); //启用深度测试       
                
                gl.glEnable(GL10.GL_LIGHTING); //允许光照
                initGreenLight(gl);//初始化灯
                initMaterial(gl);//初始化材质
                //初始化纹理
                textureIds=new int[]{
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang)
                    };
                huacong=new int[]{
                        initTexture(gl,R.drawable.huacong),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.huacong)
                    };
                face=new int[]{
                        initTexture(gl,R.drawable.men),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang),
                        initTexture(gl,R.drawable.qiang)
                    };
                //纹理id初始化  
                AAding=initTexture(gl,R.drawable.qiang);
                sideTexIdPlat=initTexture(gl,R.drawable.side);    
                bottomTexIdPlat=initTexture(gl,R.drawable.side);
                topTexIdPlat=initTexture(gl,R.drawable.top);
                loucheng=initTexture(gl,R.drawable.loucheng);
                ok=initTexture(gl,R.drawable.fff);
                kk=initTexture(gl,R.drawable.loutiche);
                cylinderSideTexId=initTexture(gl,R.drawable.cylinder);
                greenye=initTexture(gl,R.drawable.shuye);
                shugan=initTexture(gl,R.drawable.shugan);
                //创建各个几何体
              
                dimian=new Dadi(//梯台
                        2f,
                        4,4,
                        4,4,
                        0.2f,
                        topTexIdPlat,bottomTexIdPlat,sideTexIdPlat,
                        2,2
                        );
                                                    //左右距  上下距  前后距
                longcube=new longCube(0.8f,new float[]{0.8f,4.0f,3.0f},textureIds);//左教学楼
                longcube2=new longCube(0.8f,new float[]{0.8f,4.0f,3.0f},textureIds);//右教学楼
                northcube=new longCube(0.8f,new float[]{2.5f,3.0f,0.6f},textureIds);//北教学楼
                southcube=new longCube(0.8f,new float[]{2.5f,3.0f,0.6f},face);//南教学楼
                westcube=new longCube(0.8f,new float[]{0.6f,3.0f,1.6f},textureIds);//西教学楼
                eastcube=new longCube(0.8f,new float[]{0.6f,3.0f,1.6f},textureIds);//东教学楼
                                                
                zoulang1=new longCube(0.8f,new float[]{1.5f,0.1f,0.7f},textureIds);//左前走廊下
                zoulang2=new longCube(0.8f,new float[]{1.5f,0.1f,0.7f},textureIds);//左后走廊下
                zoulang3=new longCube(0.8f,new float[]{1.5f,0.1f,0.7f},textureIds);//右前走廊下
                zoulang4=new longCube(0.8f,new float[]{1.5f,0.1f,0.7f},textureIds);//右后走廊下
                
                zoulang1_1=new longCube(0.8f,new float[]{1.5f,0.1f,0.7f},textureIds);//左前走廊下
                zoulang2_1=new longCube(0.8f,new float[]{1.5f,0.1f,0.7f},textureIds);//左后走廊下
                zoulang3_1=new longCube(0.8f,new float[]{1.5f,0.1f,0.7f},textureIds);//右前走廊下
                zoulang4_1=new longCube(0.8f,new float[]{1.5f,0.1f,0.7f},textureIds);//右后走廊下
                                        //尺寸  半径  高
                cylinder1=new Cylinder(0.8f,0.1f,0.5f,40,//1右圆柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                cylinder1_1=new Cylinder(0.8f,0.1f,0.5f,40,//1左圆柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                
                cylinder2=new Cylinder(0.8f,0.1f,0.5f,40,//2右圆柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                cylinder2_1=new Cylinder(0.8f,0.1f,0.5f,40,//2左圆柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                
                cylinder3=new Cylinder(0.8f,0.1f,0.5f,40,//3右圆柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                cylinder3_1=new Cylinder(0.8f,0.1f,0.5f,40,//3左圆柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                
                cylinder4=new Cylinder(0.8f,0.1f,0.5f,40,//3右圆柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                cylinder4_1=new Cylinder(0.8f,0.1f,0.5f,40,//3左圆柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                //尺寸 底面  宽 长     顶面  宽 长   高度
                louti=new sanlingzui(//梯台
                        0.8f,
                        2,2,
                        2,2,
                        0.5f,
                        kk,
                        ok,
                        2,2
                        );
                                    //尺寸  半径  高
                cylinderAA=new Cylinder(0.8f,0.3f,4f,40,//AA圆柱
                        AAding,AAding,loucheng);
                cylinderBB=new Cylinder(0.8f,0.3f,4f,40,//AA圆柱
                        AAding,AAding,loucheng);
                cylinderCC=new Cylinder(0.8f,0.3f,4f,40,//AA圆柱
                        AAding,AAding,loucheng);
                cylinderDD=new Cylinder(0.8f,0.3f,4f,40,//AA圆柱
                        AAding,AAding,loucheng);
                                                        //左右距  上下距  前后距
                caocong1=new longCube(0.8f,new float[]{0.4f,0.4f,1.6f},huacong);//左草丛
                caocong2=new longCube(0.8f,new float[]{0.4f,0.4f,1.6f},huacong);//右花丛
                
                paifang=new longCube(0.8f,new float[]{6f,0.4f,0.2f},textureIds);//牌坊
                                //尺寸  半径  高
                p1=new Cylinder(0.8f,0.1f,2.3f,40,//p1柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                p2=new Cylinder(0.8f,0.1f,2.3f,40,//p1柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                p3=new Cylinder(0.8f,0.1f,2.3f,40,//p1柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                p4=new Cylinder(0.8f,0.1f,2.3f,40,//p1柱
                        cylinderSideTexId,cylinderSideTexId,cylinderSideTexId);
                                //大小,半径
                tree1=new Ball(0.8f,0.4f,30,30,greenye);//
                tree2=new Ball(0.8f,0.4f,30,30,greenye);////尺寸  半径  高
                gan1=new Cylinder(0.8f,0.04f,1f,40,//p1柱
                        shugan,shugan,shugan);
                gan2=new Cylinder(0.8f,0.04f,1f,40,//p1柱
                        shugan,shugan,shugan);
            }
        }//SceneRenderer
        //初始化纹理
        public int initTexture(GL10 gl,int drawableId){
            //生成纹理ID
            int[] textures = new int[1];
            gl.glGenTextures(1, textures, 0);//生成一个纹理id放在textures数组中的0位置
            int currTextureId=textures[0];   //获取生成的纹理id 
            gl.glBindTexture(GL10.GL_TEXTURE_2D, currTextureId);//绑定该纹理id,后面的操作都是针对该id
            //设置MIN_FILTER与MAG_FILTER为MIPMAP纹理过滤方式
            gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR_MIPMAP_NEAREST);
            gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR_MIPMAP_LINEAR);
            //生成MIPMAP纹理
            ((GL11)gl).glTexParameterf(GL10.GL_TEXTURE_2D,GL11.GL_GENERATE_MIPMAP, GL10.GL_TRUE);
            //设置纹理拉伸方式为REPEAT 
            gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);
            gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);
            InputStream is = this.getResources().openRawResource(drawableId);//获取图片资源的输入流
            Bitmap bitmapTmp; 
            try{
                bitmapTmp = BitmapFactory.decodeStream(is);//通过输入流生成位图
            } 
            finally{
                try {
                    is.close();//关闭流
                }catch(IOException e){
                    e.printStackTrace();//打印异常
                }
            }
            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmapTmp, 0);//自动设置图片的格式和类型
            bitmapTmp.recycle(); //回收图片资源
            return currTextureId;
        }
        private void initGreenLight(GL10 gl){//初始化灯的方法
            gl.glEnable(GL10.GL_LIGHT0);//打开0号灯 
            float[] ambientParams={0.6f,0.6f,0.6f,1.0f};//光参数 RGBA
            gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, ambientParams,0); //环境光设置   
            float[] diffuseParams={1.0f,1.0f,1.0f,1.0f};//光参数 RGBA
            gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, diffuseParams,0); //散射光设置 
            float[] specularParams={1.0f,1.0f,1.0f,1.0f};//光参数 RGBA
            gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, specularParams,0);//反射光设置    
        }
        private void initMaterial(GL10 gl){//初始化材质的方法
            float ambientMaterial[] = {0.4f, 0.4f, 0.4f, 1.0f};//环境光为白色材质
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, ambientMaterial,0);
            float diffuseMaterial[] = {1.0f, 1.0f, 1.0f, 1.0f};
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, diffuseMaterial,0);//散射光为白色材质
            float specularMaterial[] = {1.0f, 1.0f, 1.0f, 1.0f};
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, specularMaterial,0);//高光材质为白色
            float shininessMaterial[] = {1.5f}; //高光反射区域
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, shininessMaterial,0);
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            lightRatateThread.setFlag(false);
        }
    }

    以上是我项目中最重要的3D代码 展示的是我们校 第一教学楼





  • 相关阅读:
    CORS详解
    Function program language
    Hello2实例的分析
    Tomcat服务器安装及配置
    案例ORA-00600: internal error code, arguments: [qkaffsindex3], [], [], [], []
    SQL Server新老版本CE区别
    SQL Server标量函数改写内联表值函数优化案例
    SQL Server 2016升级迁移过程中性能问题诊断案例
    Oracle dba角色和sysdba的区别
    SQL Server阻塞blocking案例分析
  • 原文地址:https://www.cnblogs.com/vip-fan1234xiang/p/5077098.html
Copyright © 2011-2022 走看看