打开GL ES1.0 Trails

时间:2012-10-05 09:08:09

标签: android opengl-es

我是新手打开GL,我只想在屏幕上随机移动一个圆圈,当用户触摸圆圈时,我需要知道击中和未命中。 这是我通过在线课程可以实现的目标。

render class:


    public class HelloOpenGLES10Renderer implements Renderer {
    private int points = 250;
    private float vertices[] = { 0.0f, 0.0f, 0.0f };
    private FloatBuffer vertBuff;
    public float x = 0.0f, y = 0.0f;
    public boolean color = false;
    boolean first = true;

    @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();
        gl.glTranslatef(x, y, 0);
        gl.glColor4f(1.0f, 1.0f, 1.0f, 0f);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, points);

    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        Log.i("TAG", "change" + width + ":" + height);
        gl.glViewport(0, 0, width, height);
        float ratio = (float) width / height;
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7);
        GLU.gluLookAt(gl, 0f, 0f, -5f, 0.0f, 0.0f, 0f, 0.0f, 1.0f, 0.0f);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        Log.i("TAG", "CREATE");
        gl.glClearColor(0.1f, 0.1f, 0.0f, 1.0f);
        initShapes();

    }

    private void initShapes() {

        vertices = new float[(points + 1) * 3];
        for (int i = 3; i < (points + 1) * 3; i += 3) {
            double rad = (i * 360 / points * 3) * (3.14 / 180);
            vertices[i] = (float) Math.cos(rad) * 0.10f;
            vertices[i + 1] = (float) Math.sin(rad) * 0.10f;
            vertices[i + 2] = 0;
        }
        ByteBuffer bBuff = ByteBuffer.allocateDirect(vertices.length * 4);
        bBuff.order(ByteOrder.nativeOrder());
        vertBuff = bBuff.asFloatBuffer();
        vertBuff.put(vertices);
        vertBuff.position(0);

    }

}

Activity:
    package com.example.opengltrail;

    import java.util.Random;

    import android.app.Activity;
   import android.opengl.GLSurfaceView;
    import android.os.Bundle;
    import android.util.FloatMath;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;

    public class MainActivity extends Activity implements OnTouchListener {

    private GLSurfaceView mGLView;
    float oldx = 0, oldy = 0;
    private HelloOpenGLES10Renderer m;
    ProgressDialogThread p;
    ProgressDialogThread123 t;
    boolean stop = true;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mGLView = new GLSurfaceView(this);

        m = new HelloOpenGLES10Renderer();

        mGLView.setRenderer(m);
        mGLView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
        setContentView(mGLView);

        mGLView.setOnTouchListener(this);
        p = new ProgressDialogThread();

    }

    @Override
    protected void onPause() {
        super.onPause();
        mGLView.onPause();
        p.stop();
        stop = false;

    }

    @Override
    protected void onResume() {
        super.onResume();
        mGLView.onResume();
        t = new ProgressDialogThread123();

        t.start();
        p.start();

    }

    /**
     * gets u the random number btw 0.0 to 1.0
     */
    public float getmearandom() {
        Random rng = new Random();
        float next = rng.nextFloat();
        Integer i = rng.nextInt();
        if (i % 2 == 0)
            next = next * (-1);
        return next;
    }

    class ProgressDialogThread123 extends Thread {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();

            for (; stop;) {
                p.run();
            }

        }
    }

    class ProgressDialogThread extends Thread {
        @Override
        public void run() {
            super.run();
            if (stop) {

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                m.x = getmearandom();
                m.y = getmearandom();
                Log.i("m.x=" + m.x + ":", "m.y=" + m.y);
                mGLView.requestRender();
            }

        }
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        float x = event.getX();
        float y = event.getY();
        float x1 = ((x * 2) / 480);
        float y1 = ((y * 2) / 724);
        x1 = -1 + x1;
        y1 = -1 + y1;
        if (y < 362) {
            if (y1 > 0)
                y1 = -y1;
        } else if (y > 362) {
            if (y1 < 0)
                y1 = -y1;
        } else {
            y1 = 0;
        }

        if (x > 240) {
            if (x1 < 0)
                x1 = -x1;

        } else if (x < 240) {
            if (x1 > 0)
                x1 = -x1;
        } else {
            x1 = 0;
        }

        Log.i("x1=" + x1, "y1=" + y1);
        float d = (((m.x - x1) * (m.x - x1)) + ((m.y - y1) * (m.y - y1)));

        float dd = FloatMath.sqrt(d);
        if (dd <= 0.10f) {
            m.color = true;
            // mGLView.requestRender();
            Log.i("Tag", "Circle");
        }
        // m.x += 0.10f;

        return true;
    }
}

Please anyone help me !! thanks in advance

1 个答案:

答案 0 :(得分:1)

如果你只是画了2d我建议你松开“视锥体”和“lookAt”并用坐标为ortho(viewOrigin.x, viewOrigin.x + viewSize.width, viewOrigin.y + viewSize.height, viewOrigin.y, -1.0f, 1.0f)的“ortho”替换它们。这将使您的GL坐标系与视图坐标相同。至于圆顶点,而是创建半径为1.0f的圆顶。现在绘制圆形,在绘制调用之前你只需要“推”矩阵,转换为屏幕坐标(X,Y,.0f),缩放到半径R,以像素为单位(R,R,1.0f)和“pop”通话后的矩阵..现在检查圈子是否被击中:

`bool didHit = ((touch.x-cicrcleCenter.x)*(touch.x-cicrcleCenter.x) +   
               (touch.y-cicrcleCenter.y)*(touch.y-cicrcleCenter.y))  
               <  R*R`;

请注意,“ortho”中的“viewOrigin”取决于您捕捉触摸的位置:如果您在同一视图中捕获它们,无论视图位于何处,它都可能位于(0,0)。当您在视图的左上角和右下角按下时,这些坐标应与您在触摸事件中收到的坐标相对应。

如果你真的需要用3d画画并且你必须使用视锥,你将需要得到你的投影矩阵的反转以从你的触摸创建三维光线,然后检查命中,就像你对子弹一样等。