How to measure distance using ARCore?

前端 未结 3 1030
太阳男子
太阳男子 2020-12-02 11:34

Is it possible to calculate distance between two HitResult `s ?

Or how we can calculate real distance (e.g. meters) using ARCore?

3条回答
  •  死守一世寂寞
    2020-12-02 12:08

    The answer is: Yes, of course, you definitely can calculate distance between two HitResult's. The grid's size for ARCore, as well as for ARKit framework, is meters. Sometimes, it's more useful to use centimetres. Here are a few ways how you do it with Java and great old 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
    

    Or, alternatively, you can use the following math:

    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;
    

提交回复
热议问题