0

我是新打开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
4

1 回答 1

1

如果您只在 2d 中绘图,我建议您松开“平截头体”和“lookAt”并将它们替换为带有坐标的“正交”:ortho(viewOrigin.x, viewOrigin.x + viewSize.width, viewOrigin.y + viewSize.height, viewOrigin.y, -1.0f, 1.0f)。这将使您的 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 中绘制并且你将不得不使用截锥体,你将需要得到你的投影矩阵的逆以从你的触摸中创建 3d 射线,然后如果你喜欢的话,就像检查子弹一样检查命中。

于 2012-10-08T06:54:03.407 回答