绘制随机位置的多个立方体的OpenGL ES的Andr​​oid [英] Drawing multiple cubes at random positions in opengl es android

查看:217
本文介绍了绘制随机位置的多个立方体的OpenGL ES的Andr​​oid的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用的OpenGL ES我渲染它绘制在屏幕中央的简单的立方体类。不过,我希望能够在随机位置绘制在屏幕上多个这样的立方体,但不知道怎么样。下面是呈现多维数据集作为私有类我的自定义表面观。我自不关心有没有包括我的主要ActivityManager。

 公共类TouchSurfaceView扩展GLSurfaceView {私人最终浮动TRACKBALL_SCALE_FACTOR = 52.0f;
私人最终浮动TOUCH_SCALE_FACTOR = 100.0f / 320;
私人MyGLRenderer mRenderer;
私人浮动米previousX;
私人浮动米previousY;
公共TouchSurfaceView(上下文的背景下){
    超级(上下文);
    // TODO自动生成构造函数存根        mRenderer =新MyGLRenderer();
        setRenderer(mRenderer);
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);}    私有类MyGLRenderer实现GLSurfaceView.Renderer {    私人MyGLCube mCube;
    公众持股量mAngleX;
    公众持股量mAngleY​​;
    公共MyGLRenderer(){
        mCube =新MyGLCube();
    }    @覆盖
    公共无效onDrawFrame(GL10 GL){
        // TODO自动生成方法存根
        gl.glDisable(GL10.GL_DITHER);
         gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);         gl.glMatrixMode(GL10.GL_MODELVIEW);
         gl.glLoadIdentity();
         gl.glClientActiveTexture(DRAWING_CACHE_QUALITY_HIGH);
         // gl.glTranslatef(0,0,-3.0f);
         gl.glTranslatef(0,0,-3.0f);
         gl.glRotatef(mAngleX,0,1,0);
         gl.glRotatef(mAngleY​​,1,0,0);
         mCube.draw(GL);    }    @覆盖
    公共无效onSurfaceChanged(GL10 GL,诠释的宽度,高度INT){
        // TODO自动生成方法存根
        gl.glViewport(0,0,宽度,高度);
        流通股比例=(浮点)宽/高;
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-ratio,比率,-1,1,1,10);
    }    @覆盖
    公共无效onSurfaceCreated(GL10 GL,EGLConfig配置){
        // TODO自动生成方法存根
        gl.glDisable(GL10.GL_DITHER);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
        gl.glClearColor(0.5F,2,0.63f,0.2F);    }
}
 }

下面是 MYGLCube 包含顶点,索引和其他的东西构造立方体

 公共类MyGLCube {
私人浮动顶点[] = {
        0.3f,0.3f,-0.3f,// topFront右
        0.3f,-0.3f,-0.3f,// BottomFront右
       -0.3f,-0.3f,-0.3f,// BottomFront左
       -0.3f,0.3f,-0.3f,// topFront左
       0.3f,0.3f,0.3f,// topBack右
       0.3f,-0.3f,0.3f,// BottomBack右
       -0.3f,-0.3f,0.3f,// BottomBack左
       -0.3f,0.3f,0.3f,// topBack左
 };私人浮动rgbaVals [] = {
        1,1,0,.5f,// topFront正确的颜色
        0.25f,0,0.8f,1,// BottomFront正确的颜色
        0,1,1,1,// BottomFront左彩
        0.35f,0.26f,1,0.5f,// topFront左彩
        0.23f,0.62f,3,0.2f,// topBack正确的颜色
        0.3f,0.43f,1,0.2f,// BottomBack正确的颜色
        0.2F,0.3f,0.73f,0.6f,// BottomBack左彩
        0.6f,0.9F,0.65f,0.2F // topBack左彩
};私的短pIndex [] = {
          3,4,0,0,4,1,3,0,1,
          3,7,4,7,6,4,7,3,6,
          3,1,2,1,6,2,6,3,2,
          1,4,5,5,6,1,6,5,4
};
私人FloatBuffer vertBuff,cBuff;
私人ShortBuffer PBUFF;
公共MyGLCube(){
  ByteBuffer的bBuff = ByteBuffer.allocateDirect(vertices.length * 4);
  bBuff.order(ByteOrder.nativeOrder());
  vertBuff = bBuff.asFloatBuffer();
  vertBuff.put(顶点);
  vertBuff.position(0);  ByteBuffer的pbBuff = ByteBuffer.allocateDirect(pIndex.length * 2);
  pbBuff.order(ByteOrder.nativeOrder());
  = PBUFF pbBuff.asShortBuffer();
  pBuff.put(pIndex);
  pBuff.position(0);  ByteBuffer的colorBuff = ByteBuffer.allocateDirect(rgbaVals.length * 4);
  colorBuff.order(ByteOrder.nativeOrder());
  cBuff = colorBuff.asFloatBuffer();
  cBuff.put(rgbaVals);
  cBuff.position(0);
}公共无效画(GL10 GL){
    gl.glFrontFace(GL10.GL_CW);
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glEnable(GL10.GL_SMOOTH);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glCullFace(GL10.GL_BACK);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
    gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertBuff);
    gl.glColorPointer(4,GL10.GL_FLOAT,0,cBuff);
    gl.glDrawElements(GL10.GL_TRIANGLES,pIndex.length,GL10.GL_UNSIGNED_SHORT,PBUFF);
    gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);
 }}


解决方案

您必须使用glPushMatrix和glPopMatrix返回previus possition后平移,旋转...

  @覆盖
公共无效onDrawFrame(GL10 GL){
    // TODO自动生成方法存根
    gl.glDisable(GL10.GL_DITHER);
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);     gl.glMatrixMode(GL10.GL_MODELVIEW);
     gl.glLoadIdentity();
     gl.glClientActiveTexture(DRAWING_CACHE_QUALITY_HIGH);     //绘制立方体1
     gl.glPushMatrix();
     gl.glTranslatef(-0.5f,0,-3.0f);
     gl.glRotatef(mAngleX,0,1,0);
     gl.glRotatef(mAngleY​​,1,0,0);
     mCube.draw(GL);
     gl.glPopMatrix();     //绘制立方体2
     gl.glPushMatrix();
     gl.glTranslatef(0,0,-3.0f);
     gl.glRotatef(mAngleX,0,1,0);
     gl.glRotatef(mAngleY​​,1,0,0);
     mCube.draw(GL);
     gl.glPopMatrix();     //绘制立方体3
     gl.glPushMatrix();
     gl.glTranslatef(0.5F,0,-3.0f);
     gl.glRotatef(mAngleX,0,1,0);
     gl.glRotatef(mAngleY​​,1,0,0);
     mCube.draw(GL);
     gl.glPopMatrix();}

Using OpenGL ES I am rendering a simple cube class that draws it at the centre of the screen. However, I want to be able to draw multiple such cubes on the screen at random positions but don't know how to. Here is the my custom surface view that renders the cube as a private class. I haven't included my main ActivityManager since its not the concern.

 public class TouchSurfaceView extends GLSurfaceView  {

private final float TRACKBALL_SCALE_FACTOR=52.0f;
private final float TOUCH_SCALE_FACTOR=100.0f/320;
private MyGLRenderer mRenderer;
private float mPreviousX;
private float mPreviousY;


public TouchSurfaceView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub

        mRenderer=new MyGLRenderer();
        setRenderer(mRenderer);
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

}

    private class MyGLRenderer implements GLSurfaceView.Renderer{

    private MyGLCube mCube;
    public float mAngleX;
    public float mAngleY; 


    public MyGLRenderer(){
        mCube=new MyGLCube();
    }



    @Override
    public void onDrawFrame(GL10 gl) {
        // TODO Auto-generated method stub


        gl.glDisable(GL10.GL_DITHER);
         gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);   

         gl.glMatrixMode(GL10.GL_MODELVIEW);
         gl.glLoadIdentity();
         gl.glClientActiveTexture(DRAWING_CACHE_QUALITY_HIGH);
         // gl.glTranslatef(0, 0, -3.0f);
         gl.glTranslatef(0, 0, -3.0f);
         gl.glRotatef(mAngleX, 0, 1, 0);
         gl.glRotatef(mAngleY, 1, 0, 0);
         mCube.draw(gl);

    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // TODO Auto-generated method stub
        gl.glViewport(0, 0, width, height);
        float ratio=(float) width/height;
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // TODO Auto-generated method stub
        gl.glDisable(GL10.GL_DITHER);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        gl.glClearColor(0.5f, 2, 0.63f, 0.2f);

    }


}
 }

Here is MYGLCube that contains vertices, indices and other stuff for constructing the cube

    public class MyGLCube {


private float vertices[]={
        0.3f,0.3f,-0.3f, // topFront Right
        0.3f,-0.3f,-0.3f, //BottomFront Right
       -0.3f,-0.3f,-0.3f, //BottomFront Left
       -0.3f,0.3f,-0.3f,  //topFront Left
       0.3f,0.3f,0.3f, // topBack Right
       0.3f,-0.3f,0.3f, //BottomBack Right
       -0.3f,-0.3f,0.3f, //BottomBack Left
       -0.3f,0.3f,0.3f,  //topBack Left
 }; 

private float rgbaVals[]={
        1,1,0,.5f,   // topFront Right color
        0.25f,0, 0.8f,1, //BottomFront Right color
        0,1,1,1, //BottomFront Left color
        0.35f,0.26f,1,0.5f,  //topFront Left color
        0.23f,0.62f,3,0.2f,  // topBack Right color
        0.3f,0.43f,1,0.2f,  //BottomBack Right color
        0.2f, 0.3f, 0.73f,0.6f,  //BottomBack Left color
        0.6f, 0.9f, 0.65f, 0.2f //topBack Left color            
};

private short pIndex[]={
          3,4,0,  0,4,1,   3,0,1, 
          3,7,4,   7,6,4,  7,3,6,
          3,1,2,   1,6,2,  6,3,2,
          1,4,5,   5,6,1,  6,5,4            
};
private FloatBuffer vertBuff, cBuff;
private ShortBuffer pBuff;


public MyGLCube(){
  ByteBuffer bBuff=ByteBuffer.allocateDirect(vertices.length*4);    
  bBuff.order(ByteOrder.nativeOrder());
  vertBuff=bBuff.asFloatBuffer();
  vertBuff.put(vertices);
  vertBuff.position(0);

  ByteBuffer pbBuff=ByteBuffer.allocateDirect(pIndex.length*2);
  pbBuff.order(ByteOrder.nativeOrder());
  pBuff=pbBuff.asShortBuffer();
  pBuff.put(pIndex);
  pBuff.position(0);

  ByteBuffer colorBuff=ByteBuffer.allocateDirect(rgbaVals.length*4);
  colorBuff.order(ByteOrder.nativeOrder());
  cBuff=colorBuff.asFloatBuffer();
  cBuff.put(rgbaVals);
  cBuff.position(0);


}

public void draw(GL10 gl){
    gl.glFrontFace(GL10.GL_CW);
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glEnable(GL10.GL_SMOOTH);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glCullFace(GL10.GL_BACK);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff);
    gl.glColorPointer(4, GL10.GL_FLOAT, 0, cBuff);
    gl.glDrawElements(GL10.GL_TRIANGLES, pIndex.length, GL10.GL_UNSIGNED_SHORT, pBuff);
    gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);
 }  



}

解决方案

You must use glPushMatrix and glPopMatrix to return to previus possition after translate,rotate...

@Override
public void onDrawFrame(GL10 gl) {
    // TODO Auto-generated method stub


    gl.glDisable(GL10.GL_DITHER);
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);   

     gl.glMatrixMode(GL10.GL_MODELVIEW);
     gl.glLoadIdentity();
     gl.glClientActiveTexture(DRAWING_CACHE_QUALITY_HIGH);

     //Draw cube 1
     gl.glPushMatrix();
     gl.glTranslatef(-0.5f, 0, -3.0f);
     gl.glRotatef(mAngleX, 0, 1, 0);
     gl.glRotatef(mAngleY, 1, 0, 0);
     mCube.draw(gl);
     gl.glPopMatrix();

     //Draw cube 2
     gl.glPushMatrix();
     gl.glTranslatef(0, 0, -3.0f); 
     gl.glRotatef(mAngleX, 0, 1, 0);
     gl.glRotatef(mAngleY, 1, 0, 0);
     mCube.draw(gl);
     gl.glPopMatrix();

     //Draw cube 3
     gl.glPushMatrix();
     gl.glTranslatef(0.5f, 0, -3.0f); 
     gl.glRotatef(mAngleX, 0, 1, 0);
     gl.glRotatef(mAngleY, 1, 0, 0);
     mCube.draw(gl);
     gl.glPopMatrix();

}

这篇关于绘制随机位置的多个立方体的OpenGL ES的Andr​​oid的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆