如何强制对象捕捉到网格?

时间:2018-11-28 18:09:19

标签: java android arcore sceneform

我正在使用ARCore和Sceneform构建棋盘游戏应用程序。我的3D模型需要捕捉到网格,而不是放置在任何地方。想象一下棋盘。
我该怎么做?

我复制了类TransformableNodeTranslationController进行了修改。在TranslationController中,使用desiredLocalPosition在变量Vector3中设置坐标。
据我了解,我应该能够对坐标进行整数除法,以便我的对象只能跳跃特定的距离。

this.desiredLocalPosition = new Vector3(pose.tx(), pose.ty(), pose.tz());

float X = (int) (pose.tx()/0.05f) * 0.05f;
float Y = pose.ty(); //i don't care about vertical
float Z = (int) (pose.tz()/0.05f) * 0.05f;

this.desiredLocalPosition.set(X,Y,Z);

可悲的是,这仅在我拖动对象时有效 ,并在它们实际放置时将其忽略。

由于我是一名学生,所以我几乎是一个菜鸟程序员。有人有主意吗?

1 个答案:

答案 0 :(得分:0)

您的问题似乎是您修改了TranslationController#onContinueTransformation()方法,但没有修改TranslationController#onEndTransformation()方法。

onEndTransformation()方法负责根据在拖动手势结束时检测到的最后一个HitResult来设置新的锚点。在您进入onContinueTransformation()时所设置的僵持位置已被新锚点覆盖。

只需删除onEndTransformation()方法中的逻辑即可启用您要查找的行为。

sceneform-ux:1.5.1相关的答案。

PS:一种针对您尝试创建的棋盘游戏体验的更可行的解决方案可能是将棋盘创建为Node的网格并将游戏块附加到最接近的合格Node lastArHitResult中的onEndTransformation()。这将使您能够灵活地定义所需的任何板级空间并重新使用相同的自定义TransformationController,以及创建更好的“按空间对齐”的用户体验,这种体验仅在拖动动作结束时发生。 / p>