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);