【问题标题】:How can I force objects to snap to a grid?如何强制对象捕捉到网格?
【发布时间】:2018-11-28 18:09:18
【问题描述】:

我正在使用 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);

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

虽然我是一名学生,但我几乎是一个菜鸟程序员。有人有想法吗?

【问题讨论】:

  • 嘿,欢迎来到 StackOverflow!您能否添加您所看到行为的简短视频/ gif?看看你是如何修改 TranslationController 类的也很有帮助;您是否更改了onContinueTransformation()updatePosition() 方法?
  • 感谢您的回复!我用我的问题中的代码更新了onContinueTransformation()。我也尝试制作视频,对于糟糕的质量感到抱歉。 youtube.com/watch?v=EAAkYcDBlnw&list=WL 所以代码似乎在我实际拖动模型时有效,但是当我放开它们时,它们仍然会跳到最后一个手指接触位置,如果你明白我的意思的话。
  • 不错的一个!我想我明白发生了什么。

标签: java android arcore sceneform


【解决方案1】:

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

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

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

sceneform-ux:1.5.1相关的答案。

P.S:对于您尝试创建的棋盘游戏体验,一个更可行的解决方案可能是将棋盘创建为Nodes 的网格,并将游戏块附加到最接近的符合条件的NodelastArHitResultonEndTransformation()。这将使您能够灵活地定义您希望的任何板空间并重复使用相同的自定义 TransformationController,并创建仅在拖动动作结束时发生的更好的“对齐空间”用户体验。

【讨论】:

  • 你可以在这里看到一些工作代码 - github.com/AlgoRyan/arcore-design-experiments/tree/…
  • 太棒了,我想这就是我要找的。你的代码就像我想象的那样工作。你的附言建议可能是一个更好的主意,你会怎么做?我现在将问题标记为已解决..
  • 乐于助人。我怀疑实施该董事会想法会有些参与,但最终会更加灵活和一致。我将首先创建一个自定义BoardSpaceNode 并重写TranslationController#onEndTransformation() 方法以将拖动的游戏块附加到最近检测到的BoardSpaceNode,可能在有限的距离内。然后,您可以考虑重新实现对 TranslationController#onContinueTransformation() 方法的更改以反映新方法。除此之外,我会让你自己弄清楚。祝你好运! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
相关资源
最近更新 更多