• OpenGl绘制螺旋线


    /**
     * 缓冲区工具类
     */
    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 MyLineStripRenderer 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.005f ;   

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

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

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

    z = z - zstep ;    

    coordsList.add(x);    

    coordsList.add(y);    

    coordsList.add(z);  

     }      

    //指定顶点指针   

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, BufferUtil.list2ByteBuffer(coordsList));   

    gl.glDrawArrays(GL10.GL_LINE_STRIP, 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 MyLineStripRenderer();      

       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);    

    }

    }

  • 相关阅读:
    如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
    什么是 JavaConfig?
    序列号Sequences
    包Packages
    参数Parameters、变量Variables
    maven配置多个镜像
    各种http报错的报错的状态码的分析
    举例说明同步和异步。
    第二阶段的任务及燃尽图(第二天)
    第二阶段的任务及燃尽图(第一天)
  • 原文地址:https://www.cnblogs.com/danmao/p/3817396.html
Copyright © 2020-2023  润新知