2016-12-21 15 views
0

我对OpenGl编程相当陌生,并且知道您使用translate来移动形状。但是,我是否也使用它将形状移动到用户触摸屏幕的位置?或者我会使用onTouchEvent来完成这个? 以及如何。如何将OpenGL 2形状移动到用户的手指位置?

我已经看过这方面包括各种来源: How to move a OpenGL square with the finger? https://developer.android.com/training/graphics/opengl/touch.html

但是我还是不知道如何可以做到这一点。

任何帮助表示赞赏。

回答

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); 

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

+0

移动形状将拖动。那么如何翻译模型矩阵,因为我目前正在做Matrix.translateM(mTriangle.mModelMatrix,0,0,0,0); 并将模型矩阵作为x和y坐标不起作用。 – DarkEnergy

+0

那么你需要翻译它的两个触摸位置的差异。例如,如果先前的触摸位于(10,10),下一个位于(12,14),则将翻译为(2,4),即(12-10,14-10)。 –