有两件事你需要做。首先使用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);
好了,所以现在你有你需要移动的对象场景的位置。最常见的方法是在绘制对象之前在模型矩阵上使用翻译,因为您需要将glX
和glY
保存到渲染器中,以便您可以使用draw方法中的值来翻译对象。更好的方法是有一个包含模型所有数据的类,所以你会说model.x = glX
和model.y = glY
但这是你的选择。其他一些选择是使顶点缓冲区无效并在收到事件时重新创建顶点,但我不建议您使用此过程。另一种方法是保持模型矩阵和翻译矩阵,但更适合于拖动...
移动形状将拖动。那么如何翻译模型矩阵,因为我目前正在做Matrix.translateM(mTriangle.mModelMatrix,0,0,0,0); 并将模型矩阵作为x和y坐标不起作用。 – DarkEnergy
那么你需要翻译它的两个触摸位置的差异。例如,如果先前的触摸位于(10,10),下一个位于(12,14),则将翻译为(2,4),即(12-10,14-10)。 –