在 android 中,我采用了一个旋转球体示例 given here .它创建了一个显示旋转球体(地球)的简单应用程序。
现在,如果在手机显示屏上按下旋转球体,我想做点什么。我不想对旋转球体外部的触摸事件使用react。到目前为止,这是我通过使用 GLSurfaceView
的派生版本所做的尝试:
public class MyGLSurfaceView extends GLSurfaceView {
MyGLSurfaceView(Context context) {
super(context);
}
public boolean onTouchEvent(MotionEvent event) {
int x = (int)event.getX();
int y = (int)event.getY();
Log.d("onTouchEvent",String.format("keyCode: %d coords: %d %d", event.getActionMasked(), x, y));
Renderer renderer = this.Renderer.getRenderer(); // ERROR
return super.onTouchEvent(event);
}
}
如果没有 ERROR 行,这段代码就可以工作,当我按下显示屏时,我得到了 x/y 坐标。
但是,为了评估事件是否在球体内,我的方法是获取具有 Sphere
对象的渲染器以确定 x/y坐标在球体内。
但是 ERROR 行不起作用,我收到一条错误消息
Error:(26, 56) error: cannot find symbol method getRenderer()
我该如何解决这个错误;还是有更理智的方法来自动查明事件是否在 Sphere
-graphics-object 上?
也许更改构造函数并将渲染器实例也传递给 MyGLSurfaceView
是个好主意?附录:这个想法似乎行不通。我收到一个我不明白的构造函数错误...
最佳答案
您的问题比检测触摸事件要复杂得多。渲染器不仅拥有球体对象,它还拥有整个 OpenGL ES 内容。因此,即使在检测到触摸事件之后,您仍需要将屏幕 2D 坐标转换为 3D 射线并检查它是否与球体相交。这称为光线转换。 Here是光线转换算法的一个很好的解释。还有一个 good video tutorial用于实现光线转换 Java。
此外,您还需要按照您和@satm12 的建议在 GLSurfaceView
的构造函数中传递渲染器。
关于android - 如何检测android中某个渲染器区域内的触摸事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346942/