• 点绘制螺旋线


    /**
     * 缓冲区工具类
     */
    public class BufferUtil {
     /**
      * 将浮点数组转换成字节缓冲区
      */
     public static ByteBuffer arr2ByteBuffer(float[] arr){
      ByteBuffer ibb = ByteBuffer.allocateDirect(arr.length * 4);
      ibb.order(ByteOrder.nativeOrder());
      FloatBuffer fbb = ibb.asFloatBuffer();
      fbb.put(arr);
      ibb.position(0);
      return ibb ;
     }
     
     /**
      * 将list转换成字节缓冲区
      */
     public static ByteBuffer list2ByteBuffer(List<Float> list){
      ByteBuffer ibb = ByteBuffer.allocateDirect(list.size() * 4);
      ibb.order(ByteOrder.nativeOrder());
      FloatBuffer fbb = ibb.asFloatBuffer();
      for(Float f : list){
       fbb.put(f);
      }
      ibb.position(0);
      return ibb ;
     }
    }

    /**  

    * 渲染器

     */

    public abstract class AbstractMyRenderer implements android.opengl.GLSurfaceView.Renderer

    {  

     private float ratio;  

      public float xrotate = 0f;//围绕x轴旋转角度

    public float yrotate = 0f;//围绕x轴旋转角度  

     /**

      * 1.

      */  

    public void onSurfaceCreated(GL10 gl, EGLConfig config)

    {  

     //清平色  

     gl.glClearColor(0f, 0f, 0f, 1f);   

    //启用顶点缓冲区数组

      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  

    }

    /**  

    * 2.

      */

     public void onSurfaceChanged(GL10 gl, int width, int height) {

    //设置视口

      gl.glViewport(0, 0, width, height);   

    ratio = (float)width / (float)height;   

    //投影矩阵  

     gl.glMatrixMode(GL10.GL_PROJECTION);

      //加载单位矩阵  

     gl.glLoadIdentity();  

     //设置平截头体   

    gl.glFrustumf(-ratio, ratio, -1, 1, 3f, 7f);  }

    /**

      * 3.

      */  

    public abstract void onDrawFrame(GL10 gl);

    }

    /**  

    * 点渲染器,绘制螺旋线

     */

    public class MyPointRenderer1 extends AbstractMyRenderer{

     public void onDrawFrame(GL10 gl) {

      //清除颜色缓冲区   

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);   

    //设置绘图颜色   

    gl.glColor4f(1f, 0f, 0f, 1f);     

     //操作模型视图矩阵   

    gl.glMatrixMode(GL10.GL_MODELVIEW);  

     gl.glLoadIdentity();  

     //设置眼球的参数   

    GLU.gluLookAt(gl,0f,0f,5f, 0f, 0f, 0f, 0f,1f,0f);     

     //旋转角度   

    gl.glRotatef(xrotate, 1, 0, 0);  

     gl.glRotatef(yrotate, 0, 1, 0);     

     //计算点坐标   

    float r = 0.5f ;//半径   

    List<Float> coordsList = new ArrayList<Float>();   

    float x = 0f,y = 0f,z = 1f ;   

    float zstep = 0.01f ;  

     for(float alpha = 0f ; alpha < Math.PI * 6 ; alpha = (float) (alpha + Math.PI / 16)){    

    x = (float) (r * Math.cos(alpha));   

     y = (float) (r * Math.sin(alpha));   

     z = z - zstep ;   

     coordsList.add(x);   

     coordsList.add(y);    

    coordsList.add(z);  

     }      

    //转换点成为缓冲区  

     ByteBuffer ibb = ByteBuffer.allocateDirect(coordsList.size() * 4);  

     ibb.order(ByteOrder.nativeOrder());   

    FloatBuffer fbb = ibb.asFloatBuffer();   

    for(float f : coordsList){

        fbb.put(f);   

    }   

    ibb.position(0);      //指定顶点指针   

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ibb);  

     gl.glDrawArrays(GL10.GL_POINTS, 0, coordsList.size() / 3);  

    }

    }

    //主界面

    public class MainActivity extends Activity {

         private AbstractMyRenderer render;  

    private MyGLSurfaceView view;

     public void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);        

    view = new GLSurfaceView(this);        

    render = new MyPointRenderer1();      

       view.setRenderer(render);        

    //GLSurfaceView.RENDERMODE_CONTINUOUSLY:持续渲染(默认)        

    //GLSurfaceView.RENDERMODE_WHEN_DIRTY:脏渲染,命令渲染        

    view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);        

    setContentView(view);    

    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {

    float step = 5f ;    

     //up    

     if(keyCode == KeyEvent.KEYCODE_DPAD_UP){       

    render.xrotate = render.xrotate - step ;    

     }      else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){      

     render.xrotate = render.xrotate + step ;    

     }      else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){       

    render.yrotate = render.yrotate + step ;    

     }      else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){       

    render.yrotate = render.yrotate - step ;      

    }      

    //请求渲染,和脏渲染配合使用      

    view.requestRender();    

     return super.onKeyDown(keyCode, event);    

    }

    }

  • 相关阅读:
    第27课二阶构造模式(上)---------出现的背景
    第26课 静态成员函数
    第25课类的静态成员变量
    第24课经典问题解析(下)--------类的成员函数和成员变量隶属某个具体对象吗
    第24课经典问题(中)-----关于const对象的疑问
    第24课经典的问题(上)---------对象的构造顺序与析构顺序
    第23课 神秘的临时对象
    断剑重铸007
    DG on Windows 10 S: 执行任意代码
    断剑重铸006
  • 原文地址:https://www.cnblogs.com/danmao/p/3817417.html
Copyright © 2020-2023  润新知