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」に置き換えることをお勧めします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)にスケーリングして「ポップ」する必要があります。呼び出し後のマトリックス..次に、円がヒットしたかどうかのタッチを確認します。

`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 に答える