我需要将3d模型加载到我的应用程序(不是游戏,不是它有任何区别)并检测用户何时触摸此模型的特定部分,以采取不同的操作。
我该怎么做?有可能吗?
答案 0 :(得分:0)
我不熟悉Rajawali,但GitHub将其描述为OpenGL ES框架。正如您在上面的评论中所描述的那样,您需要考虑两个基本的用户操作,并且我将添加一个有用的操作:
根据Rajawali公开的OpenGL ES详细信息,您需要执行以下一项或两项操作:
您可以在其他地方详细了解四个OpenGL矩阵。即使Rajawali稍微简化了编码,您也应该了解一下这些矩阵。虽然你的第一个倾向是改变"模型"影响对象位置和方向的矩阵,你更有可能操纵"视图"确定用户看到汽车的空间中的点和方向的矩阵。也就是说,汽车实际上将保持在(0,0,0)的中心,并且用户的滑动,触摸和捏合将改变视点。
限制运动以使车辆始终居中是很好的,因为您的代码可以更简单一些,并且还因为用户不能失去"通过将视点滑向一侧太远的汽车。
视点的最简单变化是缩放,在大多数迭代中意味着简单地改变视点矩阵的Z平移。 Rajawali可以通过提供zoomIn()和zoomOut()函数使这更简单。否则你需要这样做:
如果Rajawali没有提供类似于" screenToWorld"之类的适当功能,那么将(x,y)2D屏幕触摸点转换为投射到3D空间的光线可能会非常棘手。接受2D屏幕空间中的点和世界空间中的3D点或3D射线。花时间谷歌搜索"光线投射"对于Rajawali。以下简要概述了代码需要执行的操作:
OpenGL不提供光线投射功能,除非您别无选择,否则我不建议您自己实施。包围或补充OpenGL的各种框架可以提供此功能。 OpenGL编码器会因此描述我的错误,但是从内存中可以看出如何将2D接触点转换为指向屏幕的3D射线:
同样,Rajawali可能会提供一些功能来确定哪些物体与光线相交。如果返回多个对象,则选择最近的对象。由于您的车辆已经细分为多个子对象,因此这不应该太难。实现双指缩放可以使用户更容易选择一个小对象。
Swiping类似于OpenGL的鼠标移动,OpenGL的许多初学者项目描述了如何将鼠标移动转换为旋转。假设模型仅从地面到顶部围绕垂直轴旋转,那么您只需将左/右滑动更改为关于OpenGL通常为Y轴的正/负旋转。
鉴于这一切,我建议采用以下方法: