如何使用 ARCore 测量距离?
Posted
技术标签:
【中文标题】如何使用 ARCore 测量距离?【英文标题】:How to measure distance using ARCore? 【发布时间】:2018-02-09 10:53:27 【问题描述】:是否可以计算两个 HitResult
`s 之间的距离?
或者我们如何使用 ARCore 计算实际距离(例如米)?
【问题讨论】:
【参考方案1】:在 Java ARCore 世界中,单位是米(我刚刚意识到我们可能不会记录这一点...... aaaand 看起来不像。糟糕,已提交错误)。通过减去两个Pose
s 的平移分量可以得到它们之间的距离。您的代码将如下所示:
第一次点击为hitResult
:
startAnchor = session.addAnchor(hitResult.getHitPose());
第二次点击hitResult
:
Pose startPose = startAnchor.getPose();
Pose endPose = hitResult.getHitPose();
// Clean up the anchor
session.removeAnchors(Collections.singleton(startAnchor));
startAnchor = null;
// Compute the difference vector between the two hit locations.
float dx = startPose.tx() - endPose.tx();
float dy = startPose.ty() - endPose.ty();
float dz = startPose.tz() - endPose.tz();
// Compute the straight-line distance.
float distanceMeters = (float) Math.sqrt(dx*dx + dy*dy + dz*dz);
假设这些命中结果不会发生在同一帧上,创建Anchor
很重要,因为每次调用Session.update()
时都可以重新塑造虚拟世界。通过使用锚点而非仅使用 Pose 来保持该位置,其 Pose 将更新以跟踪这些重塑过程中的物理特征。
【讨论】:
ARCore world units are meters
- 太棒了!这对 Unity 也有效吗?
刚刚确认是的,Unity 中的仪表也是如此。虚幻可能是厘米什么的。【参考方案2】:
您可以使用getHitPose() 提取两个HitResult
姿势,然后比较它们的翻译分量(getTranslation())。
翻译定义为
...从目的地的位置向量(通常 world) 坐标系到局部坐标系,表示为 目的地(世界)坐标。
至于这个的物理单位我找不到任何备注。使用经过校准的相机,这在数学上应该是可能的,但我不知道他们是否真的为此提供了 API
【讨论】:
【参考方案3】:答案是:是的,当然,您绝对可以计算出两个HitResult
之间的距离。 ARCore
以及 ARKit
框架的网格大小为 meters
。有时,使用centimetres
会更有用。以下是一些使用 Java 和伟大的旧 Pythagorean theorem
的方法:
import com.google.ar.core.HitResult
MotionEvent tap = queuedSingleTaps.poll();
if (tap != null && camera.getTrackingState() == TrackingState.TRACKING)
for (HitResult hit : frame.hitTest(tap))
// Blah-blah-blah...
// Here's the principle how you can calculate the distance
// between two anchors in 3D space using Java:
private double getDistanceMeters(Pose pose0, Pose pose1)
float distanceX = pose0.tx() - pose1.tx();
float distanceY = pose0.ty() - pose1.ty();
float distanceZ = pose0.tz() - pose1.tz();
return Math.sqrt(distanceX * distanceX +
distanceY * distanceY +
distanceZ * distanceZ);
// Convert Meters into Centimetres
double distanceCm = ((int)(getDistanceMeters(pose0, pose1) * 1000))/10.0f;
// pose0 is the location of first Anchor
// pose1 is the location of second Anchor
或者,您也可以使用以下数学:
Pose pose0 = // first HitResult's Anchor
Pose pose1 = // second HitResult's Anchor
double distanceM = Math.sqrt(Math.pow((pose0.tx() - pose1.tx()), 2) +
Math.pow((pose0.ty() - pose1.ty()), 2) +
Math.pow((pose0.tz() - pose1.tz()), 2));
double distanceCm = ((int)(distanceM * 1000))/10.0f;
【讨论】:
你能分享你的完整代码吗?对我有很大帮助 您能否帮我获取对象的height
。假设我在某个点放置了一个立方体并缩放该立方体。现在即将到来的最终值是向量。我没有任何将其转换为米的参考。
为什么要乘以 100 (1000/10=100) 来将米转换为厘米?为什么不直接做 distanceInMeters*100?
因为 distanceM 类型转换为 int
但结果除以 float
。虽然,你可以按照你喜欢的方式计算它)))这是一个精度问题......以上是关于如何使用 ARCore 测量距离?的主要内容,如果未能解决你的问题,请参考以下文章