我对OpenGl编程很新,并且知道你使用translate来移动形状。但我是否也使用它将形状移动到用户触摸屏幕的位置?或者我会使用onTouchEvent来实现这一目标吗? 以及如何。
我查看过有关此事的各种来源,包括: How to move a OpenGL square with the finger? https://developer.android.com/training/graphics/opengl/touch.html
但是我仍然不明白如何做到这一点。
感谢任何帮助。
答案 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,这样您需要在渲染器中保存glX
和glY
,以便可以使用draw方法来翻译对象。更好的方法是创建一个包含模型所有数据的类,这样您就可以说model.x = glX
和model.y = glY
,但这是您的选择。其他一些选择是使顶点缓冲区无效并在收到事件时重新创建顶点,但我不建议您使用此过程。另一种方法是保留模型矩阵并转换该矩阵,但这更适合拖动...