我想触摸3D地球或3D立方体(android opengl)表面上的一个点(例如红点或图像)。用户触摸该点后,新活动将被淘汰。你知道触摸事件是屏幕的x,y坐标系。 3D地球或3D立方体中的点是x y,z坐标。如何知道触摸点是否符合3D地球中的点?或者如何将xy(触摸事件)坐标转换为xyz坐标。请给我一些关于此的提示或网站!
答案 0 :(得分:1)
我能想到两种方法。
首先,您可以尝试将2D屏幕坐标转换为空间中的3D线并进行3D碰撞检测。屏幕上的每个像素都映射到3D空间中的一条线。我从来没有尝试过,但你可以这样做。
要将3d转换为2d,您可以执行以下操作。我不确定数学,如果有人确认这一点,我会很高兴。
2d_coordinate = world_view_project * 3d_coordinate
如果我没有弄错,如果3d_coordinate是[x,y,z,1],则2d_coordinate变为[x',y',depth,1]。您可以反转world_view_project矩阵并将其乘以[mousex,mousey,1,1],它应该为您提供通过鼠标的3d点,并且处于您可以看到的最大距离。找到后,您可以在此点和相机之间创建一条线,并使用此线进行三维碰撞测试。线条球体非常简单,您可以找到线条与球体原点之间的距离,如果它低于半径[link],则会发生碰撞。对于多边形,您必须找到多边形所在的平面,找到直线与此平面[link]之间的交点,并检查多边形[link]上的交点。如果你不想那么复杂,你也可以为你的立方体使用球体碰撞。
另一种解决方案恰恰相反,您可以将3d对象映射到屏幕并检查2d鼠标光标是否在此对象内。对于球体,这很容易。我在webgl做了类似的事情。这应该给你圆的2d原点。如果此点与鼠标之间的距离低于半径,则单击用户圆圈。要查找半径,可以绘制球体原点+ cameraUpVector *球体半径,这将为您提供2d圆顶点的位置。
对于多边形,它会更难一点。每个3d三角形映射到屏幕上的2d三角形。之后,您可以检查鼠标是否在三角形内。 [link]。
如果实现第二种方法,还应考虑对象是否在摄像机前面并且可见(0