在“触摸平面”和“游戏平面”之间进行翻译

时间:2013-03-01 11:29:25

标签: android math opengl-es

我正在尝试制作2D游戏。因为我使用OpenGL ES,我必须在3D中绘制所有内容,但我只是修复了z坐标,这很好。现在我要做的是计算两个向量之间的角度(C =玩家中心,P =高于玩家的点,T =触摸点)CP和CT,这样我就可以让玩家面向那个方向。我知道如何获得2个向量之间的角度,但我的问题是让所有点都存在于同一平面上(通过翻译T)。

我知道T存在于一个平面上,其中(0,0)在左上角而UP实际上是DOWN(在视觉上)。我也知道C和P的UP实际上是UP,并且他们的X和Y在与T的完全三维不同的平面上。我需要将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);

抛出异常我正在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);

2 个答案:

答案 0 :(得分:1)

我有几本关于openGL的教科书,经过一次关闭后,我发现我想要做的术语叫做选择。一旦我知道我在问什么,我就找到了很多很好的网站和参考资料:

这个名单几乎无数。有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

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

答案 1 :(得分:0)

我认为你想要一次做太多。我可以分别理解你问题的每个句子;但它们串起来了,非常令人困惑。

对于例外,您可能需要传递标识矩阵而不是零矩阵才能获得基本的1对1投影。

然后我建议你将y维度缩放-1,这样所有的UP和DOWN都至少匹配。

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