0

我正在尝试创建一个 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);
4

2 回答 2

1

我有几本关于 openGL 的教科书,在掸掉一本之后,我发现我想做的事情的术语叫做Picking。一旦我知道我在问什么,我就找到了很多好的网站和参考资料:

这份名单几乎数不胜数。有 700 种方法可以做到这一点,但没有一种方法对我有用。最终,我决定回归基础并进行彻底的 OpenGL|ES 学习,为此我在这里购买了这本书:http: //www.amazon.com/Graphics-Programming-Android-Programmer-ebook/dp /B0070D83W2/ref=sr_1_2?s=数字文本&ie=UTF8&qid=1362250733&sr=1-2&keywords=opengl+es+2.0+android

我已经了解到的一件事是我肯定使用了错误的投影类型。我不应该将全 3D 用于 2D 游戏。为了在完整的 3D 环境中进行拾取,我必须将一条光线从屏幕点投射到进行游戏的 3D 平面的表面上。除了资源的可怕浪费(每次点击的光线投射)之外,还有其他的迹象。我会为我的玩家渲染一个围绕她的圆圈,当我移动她时,圆圈会偏离玩家的中心。这是由于在 2D 平面上渲染的完整 3D 环境。它只是不会产生专业的结果。我需要使用正交投影。

于 2013-03-03T06:27:56.570 回答
0

我认为你试图一次做太多事情。我可以分别理解你问题的每一句话;但是串在一起,很混乱。

对于例外情况,您可能需要传递恒等矩阵而不是零矩阵来获得基本的 1 对 1 投影。

然后我建议您将 y 维度缩放 -1,以便所有 UP 和 DOWN 至少匹配。

我希望这会有所帮助,因为我不能 100% 确定您要做什么。特别是,“使用标准视锥体将 (tx, ty, -4) 转换为 (x, y, 1)”对我来说没有意义。您可以使用翻译矩阵进行翻译。您可以剪辑到视锥,或将对象从视锥投影到平面(通常是视图平面)。但是如果你所有的 Z 都是不变的,你可以直接丢弃它们,对吧?那么,假设 x=tx 和 y=ty,那么tz += 5?

于 2013-03-02T04:55:27.143 回答