You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:35:45