2

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

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

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

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

由于我是一名学生,因此我几乎是一个菜鸟程序员。有人有想法吗?

4

1 回答 1

0

看起来你的问题是你修改了TranslationController#onContinueTransformation()方法但没有修改TranslationController#onEndTransformation()方法。

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

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

与 相关的答案sceneform-ux:1.5.1

PS:对于您尝试创建的棋盘游戏体验,一个更可行的解决方案可能是将棋盘创建为 s 的网格,并将游戏块连接到Node最接近in 的位置。这将使您可以灵活地定义您希望的任何板空间并重用相同的自定义,以及创建仅在拖动动作结束时发生的更好的“对齐空间”用户体验。NodelastArHitResultonEndTransformation()TransformationController

于 2018-12-05T01:00:10.397 回答