Можно ли рассчитать расстояние между двумя HitResult
`s?
Или как мы можем вычислить реальное расстояние (например, счетчики) с помощью ARCore?
Можно ли рассчитать расстояние между двумя HitResult
`s?
Или как мы можем вычислить реальное расстояние (например, счетчики) с помощью ARCore?
В 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()
. Держа это место с якорем вместо просто Позы, его Поза будет обновляться, чтобы отслеживать физическую функцию в этих изменениях.
Вы можете извлечь две позы HitResult
, используя getHitPose(), а затем сравните их компонент перевода (getTranslation()).
Перевод определяется как
... вектор положения из пункта назначения (обычно мир) координат в локальный координатный кадр, выраженный в назначения (мира).
Что касается физической единицы этого, я не мог найти никакого замечания. С калиброванной камерой это должно быть математически возможно, но я не знаю, действительно ли они предоставляют API для этого
Ответ: да, конечно, вы определенно можете рассчитать расстояние между двумя HitResult
. Размер сетки для ARCore
, как и для фреймворка ARKit
, составляет meters
. Иногда целесообразнее использовать centimetres
. Вот несколько способов, как вы делаете это с Java и старой 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 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;