0

2Dゲームを作ろうとしています。私は OpenGL ES を使用しているため、すべてを 3D でプロットする必要がありますが、z 座標を修正するだけで問題ありません。ここでやりたいことは、2 つのベクトル (C = プレーヤーの中心、P = プレーヤーの真上の点、T = タッチ ポイント) CP と CT の間の角度を計算して、プレーヤーをその方向に向かせることができるようにすることです。2 つのベクトル間の角度を取得する方法は知っていますが、問題はすべての点を同じ平面上に存在させることです (T を平行移動することによって)。

T は (0,0) が左上で、UP が実際には (視覚的に) DOWN である平面上に存在することを知っています。また、C と P の UP は実際には UP であり、それらの X と Y は T とは完全に 3 次元の異なる平面上にあることも知っています。 C と P の平面に。誰でも私を助けることができますか?私は標準の OpenGL 投影モデルを使用しており、錐台から 0,0,-4 ズームアウトしています ((0,0,0) を直接見ています)。私の 2D オブジェクトはすべて平面 (0,0,1) 上にあります。

private float getRotation(float touch_x, float touch_y)
{
    //center_x = this.getWidth() / 2;
    //center_y = this.getHeight() / 2;

    float cx, cy, tx, ty, ux, uy;

    cx = (player.x * _renderer.centerx);
    cy = (player.y * -_renderer.centery);

    ux = cx;
    uy = cy+1.0f;

    tx = (touch_x - _renderer.centerx);
    ty = (touch_y - _renderer.centery);

    Log.d(TAG, "center  x: "+cx+"y:"+cy);
    Log.d(TAG, "up      x: "+ux+"y:"+uy);
    Log.d(TAG, "touched x: "+tx+"y:"+ty);

    float P12 = length(cx,cy,tx,ty);
    float P13 = length(cx,cy,ux,uy);
    float P23 = length(tx,ty,ux,uy);

    return (float)Math.toDegrees(Math.acos((P12*P12 + P13*P13 - P23*P23)/2.0 * P12 * P13));
}

基本的に、標準の視錐台を使用して (tx, ty, -4) を (x, y, 1) に変換できる方法があるかどうかを知りたいです。

私は今、いくつかの他のことを試しました。私のタッチイベントでは、これをやろうとしています:

float[] coords = new float[4];
GLU.gluUnProject(touch_x, touch_y, -4.0f, renderer.model, 0, renderer.project, 0, renderer.view, 0, coords, 0);

RendererオブジェクトのOnSurfaceChangedでモデル、投影、およびビューを設定しています:

    GL11 gl11 = (GL11)gl;

    model = new float[16];
    project = new float[16]; 
    int[] view = new int[4];

    gl11.glGetFloatv(GL10.GL_MODELVIEW, model, 0);
    gl11.glGetFloatv(GL10.GL_PROJECTION, project, 0);
    gl11.glGetIntegerv(GL11.GL_VIEWPORT, view, 0);
4

2 に答える 2

1

私はopenGLに関するいくつかの教科書を持っていますが、そのうちの1つをほこりを払った後、私がやりたいことの用語はピッキングと呼ばれていることがわかりました。私が何を求めているのかを知った後、私はたくさんの良いウェブサイトと参考文献を見つけました:

リストはほとんど無数です。これを行うには700の方法がありますが、どれも私には効果がありませんでした。最終的に、私は基本に戻り、OpenGL | ESの徹底的な学習スティントを行うことにしました。そのために、この本をここで購入しました:http: //www.amazon.com/Graphics-Programming-Android-Programmer-ebook/dp /B0070D83W2/ref=sr_1_2?s=digital-text&ie=UTF8&qid=1362250733&sr=1-2&keywords=opengl+es+2.0+android

私がすでに学んだことの1つは、間違いなく間違ったタイプの投影法を使用していたということです。2Dゲームにフル3Dを使用するべきではありません。フル3D環境でピッキングを行うには、画面のポイントからゲームが行われている3D平面の表面に光線を当てる必要があります。リソースの恐ろしい浪費(クリックごとのレイキャスティング)であることに加えて、他の物語がありました。私はプレーヤーを彼女を囲む円でレンダリングし、彼女を動かすと、円はプレーヤーの中心から外れました。これは、2D平面にレンダリングされた完全な3D環境によるものです。専門的な結果は得られません。正投影を使用する必要があります。

于 2013-03-03T06:27:56.570 に答える
0

一度にたくさんのことをしようとしていると思います。あなたの質問の各文を個別に理解できます。しかし、すべてが絡み合っていると、非常に混乱します。

例外については、基本的な 1 対 1 の射影を取得するために、おそらくゼロ行列ではなく単位行列を渡す必要があります。

次に、すべての UP と DOWN が少なくとも一致するように、y 次元を -1 でスケーリングすることをお勧めします。

あなたが何をしようとしているのかわからないので、これが役に立てば幸いです。特に、「標準の視錐台を使用して (tx, ty, -4) を (x, y, 1) に変換する」は意味がありません。翻訳マトリックスで翻訳できます。ビュー フラスタムにクリップするか、フラスタムから平面 (通常はビュー プレーン) にオブジェクトを投影できます。しかし、すべての Z が一定である場合は、それらを破棄できますよね? では、x=tx、y=ty とすると、tz += 5?

于 2013-03-02T04:55:27.143 に答える