如何将OpenGL 2形状移动到用户手指的位置?

时间:2016-12-21 17:40:54

标签: android opengl-es opengl-es-2.0

我对OpenGl编程很新,并且知道你使用translate来移动形状。但我是否也使用它将形状移动到用户触摸屏幕的位置?或者我会使用onTouchEvent来实现这一目标吗? 以及如何。

我查看过有关此事的各种来源,包括: How to move a OpenGL square with the finger? https://developer.android.com/training/graphics/opengl/touch.html

但是我仍然不明白如何做到这一点。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您需要做两件事。首先使用onTouchEvent获取触摸的位置,然后使用某种方法移动对象,例如translate。

当您获得该事件时,您将获得视图中需要转换为openGL坐标系的位置。要计算坐标系,您需要查看您正在使用的投影和/或视图矩阵(如果有)。保留默认坐标系:-1,右:1,顶部:1,底部:-1但如果使用ortho,则需要使用这些坐标。对于更复杂的系统,您应该查看有关如何将视图中的位置转换为openGL坐标的其他答案答案。因此,对于ortho(或无矩阵)过程,结果为:

float viewX, viewY; // got from event
float surfaceViewWidth, surfaceViewHeight; // Size of your view
float left, right, top, bottom; // From ortho or default (-1, 1, 1, -1)

float glX = left + (viewX/surfaceViewWidth)*(right-left);
float glY = top + (viewY/surfaceViewHeight)*(bottom-top);

好的,现在你在场景中有你的位置,你需要移动对象。最常见的方法是在重绘之前在绘制对象之前在模型矩阵上使用translate,这样您需要在渲染器中保存glXglY,以便可以使用draw方法来翻译对象。更好的方法是创建一个包含模型所有数据的类,这样您就可以说model.x = glXmodel.y = glY,但这是您的选择。其他一些选择是使顶点缓冲区无效并在收到事件时重新创建顶点,但我不建议您使用此过程。另一种方法是保留模型矩阵并转换该矩阵,但这更适合拖动...