我正在尝试创建一个 2D 游戏。因为我使用的是 OpenGL ES,所以我必须以 3D 形式绘制所有内容,但我只需修复 z 坐标,这很好。现在我要做的是计算两个向量之间的角度(C = 玩家中心,P = 玩家正上方的点,T = 接触点)CP 和 CT,这样我就可以让玩家面向那个方向。我知道如何获得 2 个向量之间的角度,但我的问题是让所有点都存在于同一平面上(通过平移 T)。
我知道 T 存在于 (0,0) 位于左上角且 UP 实际上是 DOWN(视觉上)的平面上。我也知道 C 和 P 的 UP 实际上是 UP,并且它们的任何 X 和 Y 都在与 T 完全不同的 3 维平面上。我需要将 C 和 P 放到 T 的平面上(我在下面尝试过)或得到 T到 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);
这是抛出异常我在渲染器对象的 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);