我正在本网站http://developer.android.com/training/graphics/opengl/touch.html#listener上关注此培训教程。
该链接显示了如何响应触摸事件和旋转三角形的示例。 我有代码所有设置和工作我只是不明白这部分代码:
private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
private float mPreviousX;
private float mPreviousY;
@Override
public boolean onTouchEvent(MotionEvent e) {
// MotionEvent reports input details from the touch screen
// and other input controls. In this case, you are only
// interested in events where the touch position changed.
float x = e.getX();
float y = e.getY();
switch (e.getAction()) {
case MotionEvent.ACTION_MOVE:
float dx = x - mPreviousX;
float dy = y - mPreviousY;
// reverse direction of rotation above the mid-line
if (y > getHeight() / 2) {
dx = dx * -1 ;
}
// reverse direction of rotation to left of the mid-line
if (x < getWidth() / 2) {
dy = dy * -1 ;
}
mRenderer.setAngle(
mRenderer.getAngle() +
((dx + dy) * TOUCH_SCALE_FACTOR));
requestRender();
}
mPreviousX = x;
mPreviousY = y;
return true;
}
getAngle和setAngle是mRenderer对象中的一些实用程序方法,可以在链接中显示的示例中进一步看到。
我需要解释一下这段代码如何精确地计算角度,如何将增量dx和dy以及它们中的一些用起来并将其用作角度以及getHeight和getWidth所发生的是这些高度和宽度整个屏幕?我希望我已经足够清楚了,谢谢。
答案 0 :(得分:0)
虽然这个问题被大幅下调,但是遗漏一个非常常见的openGL开发人员问题是不公平的,因为大多数(几乎)所有的示例和教程都设计得非常糟糕,误导了许多开发人员在早期阶段甚至使他们失去了希望永远了解这是如何运作的。
原因是基本的openGL设置需要大量的知识并且代码量很大。一个熟练的开发人员会将代码分解为多个类,例如着色器,上下文,缓冲区,对象,矩阵......而所有示例或教程或多或少都会在同一个类/文件中显示所有内容,因为它更容易导航一个新鲜的开发者这导致作者将尝试找到与您正在阅读的文章没有直接关系的问题的最小(行数)解决方案。
至于你使用的这个例子:我不知道整个例子或它看起来像什么,但只是看到你发布的方法它会建议你在中间有一些形状(如上所述的三角形)拖动屏幕。
您通常会做的是从中心到手指(x-getWidth(), y-getHeight())
的矢量,然后可以通过atan2f
等方法计算角度,然后将角度设置为对象。这实际上也是一种缩短的方式,但它需要一些数学知识,并且对代码本身有一些解释。
因此,作者使用了一个非常简单的程序,通过垂直或水平拖动,对象将旋转一定角度,旋转方向取决于您拖动的屏幕部分。此外,作者实际上添加了垂直和水平旋转,最后它们只是2个值的总和。
我同意这对于在这种编码方面经验不足的开发人员来说可能会非常困惑。如果没有其他任何内容,那么对于所有未来可能的教程和示例作者来说,这个答案应该是值得考虑的事情。