Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Ответ: да, конечно, вы определенно можете рассчитать расстояние между двумя HitResult. Размер сетки для ARCore, как и для фреймворка ARKit, составляет meters. Иногда целесообразнее использовать centimetres. Вот несколько способов, как вы делаете это с Java и старой 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 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 Anchor
Pose pose1 = // second HitResult 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;