Как измерить расстояние с помощью ARCore?
можно ли рассчитать расстояние между двумя HitResult
`ы ?
или как мы можем рассчитать реальное расстояние (например, метров) с помощью ARCore?
3 ответов
в Java ARCore world единицы измерения-это метры (я только что понял, что мы можем не документировать это... ииииии похоже, нет. Упс, подал ошибка). Вычитая компонент перевода из двух Pose
s Вы можете получить расстояние между ними. Ваш код будет выглядеть примерно так:
при первом попадании как 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
:
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;