似乎HitResult只让我们与表面(平面)或点云交叉。如何通过点击在空气中获得一个点,从而将物体漂浮在空中?
答案 0 :(得分:9)
这实际上取决于你在“空中”的意思。我看到两种可能性:
“在检测到的表面上方”对飞机进行正常的命中测试,并将返回的姿势偏移一些Y距离以获得悬停位置。例如:
Pose.makeTranslation(0, 0.5f, 0).compose(hitResult.getHitPose())
返回比命中位置高50厘米的姿势。从这里创建一个锚,你很高兴。您也可以在命中位置创建锚点,并使用每帧的y平移进行组合,以允许设置悬停高度的动画。
“漂浮在当前设备位置前”为此你可能想要在相机姿势的右侧构成翻译:
frame.getPose().compose(Pose.makeTranslation(0, 0, -1.0f)).extractTranslation()
为您提供仅在展示中心前方1米处的平移姿势。如果你想要在特定的屏幕位置前面,我会在this answer中添加一些代码来进行世界光线转换。
道歉,如果你在Unity / Unreal,你的问题没有指明,所以我假设Java。
答案 1 :(得分:0)
您经常看到命中结果被用户解释为所需位置的原因是实际上没有用于此用户交互的封闭形式解决方案。用户希望从相机指向场景的光线中沿着光线的无限可能位置中的哪一个?点击的2D坐标仍然未定义第三个维度。
正如你所说的“空中”,为什么不采取相机位置和打击结果之间的中心?
您可以使用pose.getTranslation
https://developers.google.com/ar/reference/java/com/google/ar/core/Pose.html#getTranslation(float[],%20int)