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

How can I force objects to snap to a grid?

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

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

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);

遗憾的是,这仅在我拖动对象时有效,当它们实际放置时会忽略它。

因为我是一名学生,所以我几乎是一个菜鸟程序员。有人有想法吗?

看来您的问题是您修改了 TranslationController#onContinueTransformation() 方法而不是 TranslationController#onEndTransformation() 方法。

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

只需删除 onEndTransformation() 方法中的逻辑即可实现您正在寻找的行为。

sceneform-ux:1.5.1 相关的答案。

P.S:对于您尝试创建的棋盘游戏体验,一个更可行的解决方案可能是将棋盘创建为 Node 的网格并将游戏块附加到最接近的合格NodeonEndTransformation() 中的 lastArHitResult。这将使您能够灵活地定义您想要的任何板空间并重复使用相同的自定义 TransformationController,以及创建更好的 "snap-to-space" 用户体验,这种体验仅在拖动动作结束时发生。