如何在HelloArActivity v1.1.0中实现两点间getDistance()及ARCore测距
嘿,我来帮你理清在HelloArActivity v1.1.0里实现两点测距的具体步骤和ARCore的使用方式~
一、getDistance()方法的实现位置与逻辑
你可以把这个测距方法直接写在HelloArActivity类内部,作为一个工具方法——既可以是静态方法方便全局调用,也可以作为成员方法使用。
核心实现逻辑
ARCore里所有空间点的位置都是通过Pose类描述的,我们只需要获取两个点的三维坐标,用欧几里得距离公式计算即可:
// 放在HelloArActivity类内部的工具方法 private float getDistance(Pose pose1, Pose pose2) { // 提取两个点的三维坐标(x,y,z) float[] pos1 = pose1.getTranslation(); float[] pos2 = pose2.getTranslation(); // 计算三维空间中的欧几里得距离 float dx = pos1[0] - pos2[0]; float dy = pos1[1] - pos2[1]; float dz = pos1[2] - pos2[2]; return (float) Math.sqrt(dx*dx + dy*dy + dz*dz); }
如果你的场景是用Anchor标记固定点,调用时传入anchor.getPose()即可;如果是触摸获取的临时空间点,就传hitResult.getHitPose()。
二、ARCore测距的代码整合与使用方式
接下来把这个方法融入ARCore的交互流程里,通常我们需要先标记两个点,再计算并显示距离:
1. 实现触摸标记点的逻辑
在HelloArActivity中,触摸屏幕获取AR空间点的逻辑一般写在onSingleTapUp方法里,我们可以在这里添加标记两个点并计算距离的逻辑:
// 定义成员变量存储两个标记锚点 private Anchor firstAnchor = null; private Anchor secondAnchor = null; @Override public boolean onSingleTapUp(MotionEvent e) { Frame frame = arFragment.getArSceneView().getArFrame(); if (frame != null) { List<HitResult> hitResults = frame.hitTest(e); for (HitResult hitResult : hitResults) { Trackable trackable = hitResult.getTrackable(); // 确保点击的是已识别的平面 if (trackable instanceof Plane && ((Plane) trackable).isPoseInPolygon(hitResult.getHitPose())) { if (firstAnchor == null) { // 标记第一个点 firstAnchor = hitResult.createAnchor(); addMarkerToScene(firstAnchor); // 添加3D标记到场景 } else if (secondAnchor == null) { // 标记第二个点并计算距离 secondAnchor = hitResult.createAnchor(); addMarkerToScene(secondAnchor); // 调用getDistance计算距离 float distance = getDistance(firstAnchor.getPose(), secondAnchor.getPose()); // 用Toast显示距离(单位是米) Toast.makeText(this, "两点距离:" + String.format("%.2f", distance) + "米", Toast.LENGTH_SHORT).show(); // 重置锚点,方便下次测量 firstAnchor = null; secondAnchor = null; } break; } } } return super.onSingleTapUp(e); }
2. 给标记点添加3D视觉反馈
上面用到的addMarkerToScene方法是用来在AR场景中显示标记点的,你可以用ARCore的ShapeFactory快速创建一个简单的球体标记:
private void addMarkerToScene(Anchor anchor) { // 创建红色球体作为标记(半径0.05米) MaterialFactory.makeOpaqueWithColor(this, new Color(android.graphics.Color.RED)) .thenAccept(material -> { ModelRenderable sphere = ShapeFactory.makeSphere(0.05f, new Vector3(0, 0, 0), material); AnchorNode anchorNode = new AnchorNode(anchor); anchorNode.setRenderable(sphere); arFragment.getArSceneView().getScene().addChild(anchorNode); }); }
3. 关键注意事项
- 确保ARCore已经正确初始化,
arFragment已经和Activity绑定 - 计算出的距离单位是米,保留两位小数会更直观
- 如果需要实时更新距离(比如拖动第二个点),可以把计算逻辑移到
onUpdate方法中,实时刷新显示
内容的提问来源于stack exchange,提问作者user9586939
相关产品推荐
相关产品推荐

