Как измерить расстояние с помощью ARCore?

можно ли рассчитать расстояние между двумя HitResult `ы ?

или как мы можем рассчитать реальное расстояние (например, метров) с помощью ARCore?

3 ответов


в Java ARCore world единицы измерения-это метры (я только что понял, что мы можем не документировать это... ииииии похоже, нет. Упс, подал ошибка). Вычитая компонент перевода из двух Poses Вы можете получить расстояние между ними. Ваш код будет выглядеть примерно так:

при первом попадании как 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(). Удерживая это место с помощью якоря, а не просто позы, его поза будет обновляться, чтобы отслеживать физическую функцию через эти изменения.


вы можете извлечь два HitResult позы с помощью getHitPose () а затем сравните их компонент перевода (getTranslation()). Перевод определяется как

...вектор положения от места назначения (обычно мира) координат к локальной системе координат, выраженные в координаты пункта назначения (мира).

что касается физической единицы этого, я не мог найти никаких замечаний. С калиброванной камерой это должно быть математически возможно, но я не знаю, действительно ли они предоставляют API для этого


ответ: Да, конечно, вы наверняка можете рассчитать расстояние между двумя HitResult ' s. Размер сетки для ARCore, а также ARKit рамки meters. Иногда, это более полезно использовать centimetres. Вот несколько способов, как вы это делаете с Java и great old Pythagorean theorem:

enter image description here

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;