zoukankan      html  css  js  c++  java
  • openGL线s的绘制

    /**  

    * 缓冲区工具类  

    */

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

    //半径  

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

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

    //循环绘制点  

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

    coordsList.add(0f);    

    coordsList.add(0f);    

    coordsList.add(0f);    

       coordsList.add(x);   

     coordsList.add(y);   

     coordsList.add(z);   

    }

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

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

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

    }

    }

  • 相关阅读:
    SimpleDateFormatter Java中的用法
    线性判别分析浅析及推导
    主成分分析(PCA)原理及推导
    浅说机器学习理论
    给“过拟合”下一个准确且规范的定义
    信息熵和Gini指数的关系
    WinRAR默认压缩格式ZIP
    批量学习和在线学习的区别
    LDA线性判别分析
    主成分分析(PCA)原理与实现
  • 原文地址:https://www.cnblogs.com/danmao/p/3817334.html
Copyright © 2011-2022 走看看