3D立方体或球体中的android触摸事件



我想触摸3D地球或3D立方体(android opengl)表面上的一个点(例如红点或图像)。用户触摸该点后,将出现新的活动。你知道触摸事件是屏幕的x,y坐标系。三维地球或三维立方体中的点是x、y、z坐标。如何知道触摸点与3D地球中的点相匹配?或者如何将xy(触摸事件)坐标变换为xyz坐标。请给我一些提示或网站!

我能想到两种方法。

首先,您可以尝试将二维屏幕坐标转换为空间中的三维线,并进行三维碰撞检测。屏幕上的每个像素都映射到3D空间中的一条线。我从来没有试过这个,但你可以做那样的事。

要将3d转换为2d,可以执行以下操作。我对数学不太确定,如果有人证实这一点,我会很高兴。

2d_coordinate = world_view_project * 3d_coordinate

如果3d_cordinate是[x,y,z,1],如果我没有错的话,2d_cordinat变成[x',y',depth,1]。您可以反转world_view_project矩阵,并将其相乘[mousex,mousey,1,1],它应该会给出穿过鼠标并处于您所能看到的最大距离的三维点。一旦你找到它,你可以在这个点和相机之间创建一条线,并使用这条线进行三维碰撞测试。线-球体很容易,你可以找到线和球体原点之间的距离,如果它低于半径[链接],就会发生碰撞。对于多边形,您必须找到多边形所在的平面,找到直线和该平面之间的交点[link],并检查多边形上的交点[link]。如果你不想那么复杂,你也可以对立方体使用球体碰撞。

另一种解决方案正好相反,您可以将3d对象映射到屏幕,并检查2d鼠标光标是否在该对象内。对于球体来说,这很容易。我在webgl也做了类似的事情。这应该会给你这个圆的二维原点。若该点和鼠标之间的距离低于半径,则用户单击圆。要找到半径,您可以映射球体的原点+cameraUpVector*球体的半径,这将为您提供2d圆的顶点位置。

对于多边形,它会稍微困难一些。每个三维三角形在屏幕上映射到一个二维三角形。之后,您可以检查鼠标是否在三角形内。[链接]。

如果实现第二种方法,还应该考虑对象是否在相机前面并且可见(0

最新更新