0

ここで問題が発生しています。速度xayの正方形の発射体を設定し、頂点の位置をそのように設定して、実際の正方形をその場所に描画します。

コード:

vertices.put(new float[] { x1, y1, 1, 1, 1, 1, 0.0f, 1.0f,
                     x2, y2, 1, 1, 1, 1, 1.0f, 1.0f,
                     x3, y3, 1, 1, 1, 1, 1.0f, 0.0f,
                     x4, y4, 1, 1, 1, 1, 0.0f, 0.0f });
                 //  x   y   r  g  b  A   u|s  v|t

ここで、すべてのxは、私が渡すコーナーの位置です。

次に、この長方形(l2rArrow)をx軸とy軸に沿って移動し、画面をそれに追従させます。

    boolean hasTranslated = false;
    if (!l2rArrow.isFired) { // if the arrow has not yet been fired we render it thus
        gl.glPushMatrix(); //save our state

            gl.glTranslatef(l2rArrow.GetToOriginX, l2rArrow.GetToOriginY, 0f); // translate to origin 0,0,0
            gl.glRotatef(LBow.getAngle(), 0f, 0f, 1f); //rotate
            gl.glTranslatef(-l2rArrow.GetToOriginX, -l2rArrow.GetToOriginY, 0f); // translate to where we want to draw it

            texture.bind(gl, Texture.TEXTURE_L2RARROW);
            mRect = new MeshRect(l2rArrow.getMyRect());
            mRect.Draw(GL10.GL_TRIANGLES, gl);


        gl.glPopMatrix(); //return to saved state

    } else { // the arrow has been fired so we need to render it like this and have the "camera" follow it

        hasTranslated = true;
        gl.glPushMatrix();
        gl.glLoadIdentity();
            float camX = (float) ((l2rArrow.startX - l2rArrow.PosX));
            float camY = (float) ((l2rArrow.startY - l2rArrow.PosY));
            if (camY > 0) { camY = 0;}
            if (camX < -4800) { camX = -4800;}

            gl.glTranslatef(camX, camY,0f);



                l2rArrow.Update(deltaTime);
                texture.bind(gl, Texture.TEXTURE_L2RARROW);
                mRect = new MeshRect(l2rArrow.getMyRect());
                mRect.Draw(GL10.GL_TRIANGLES, gl);

        if (l2rArrow.hasCollided) {
            //run collision code for detecting a hit and ending turn
        }
    }

これも機能します。発射物が発射されたとき、私たちはそれを完全に追跡します。今、私は矢じりが矢が移動している角度を指すようにしたいのですが。ですから、飛行中に矢印を回転させる必要があります。この矢印を0,0に戻し、回転させて元に戻してみましたが、矢印を元に戻すと、回転した平面の座標に描画されます。

    } else {

        hasTranslated = true;
        gl.glPushMatrix();
        gl.glLoadIdentity();
            float camX = (float) ((l2rArrow.startX - l2rArrow.PosX));
            float camY = (float) ((l2rArrow.startY - l2rArrow.PosY));
            if (camY > 0) { camY = 0;}
            if (camX < -4800) { camX = -4800;}

            gl.glTranslatef(camX, camY,0f);

            gl.glPushMatrix();  

                gl.glTranslatef(l2rArrow.GetToOriginX, l2rArrow.GetToOriginY, 0f); // translate to origin 0,0,0
                gl.glRotatef((float) l2rArrow.getAngle(), 0f, 0f, 1f); //rotate
                gl.glTranslatef(-l2rArrow.GetToOriginX, -l2rArrow.GetToOriginY, 0f);

                l2rArrow.Update(deltaTime);
                texture.bind(gl, Texture.TEXTURE_L2RARROW);
                mRect = new MeshRect(l2rArrow.getMyRect());
                mRect.Draw(GL10.GL_TRIANGLES, gl);

            gl.glPopMatrix();

        if (l2rArrow.hasCollided) {
            //run collision code for detecting a hit and ending turn
        }
    }

これは分かります。矢印を回転させてから、回転していない平面上の位置に戻すにはどうすればよいですか?

Y = 0になると矢印は止まり、現在のところY=0は回転の角度で走っています。

4

1 に答える 1

0

多くの調査と検討の結果、私は自分の世界でオブジェクトを配置する方法を切り替えることにしました。私は今、それらを所定の位置にglTranslateするという通常の方法のように見えるものを使用します。

これですべてが完全に機能します。

どうやら、以前のやり方はめちゃくちゃになっていたようです。頂点を目的のスペースに直接描画する(原点に描画してから変換しない)と、かなり面倒になる可能性があるためです。

于 2012-08-07T02:58:27.983 に答える