Est-il possible de calculer la distance entre deux HitResult
`s?
Ou comment pouvons-nous calculer la distance réelle (par exemple mètres) en utilisant ARCore?
Dans Java Les unités mondiales ARCore sont des mètres (je viens de réaliser que nous pourrions ne pas documenter cela ... aaaand ressemble à non. Oups, bogue déposé). En soustrayant la traduction composant de deux Pose
, vous pouvez obtenir la distance entre eux. Votre code ressemblerait à ceci:
Au premier coup comme hitResult
:
startAnchor = session.addAnchor(hitResult.getHitPose());
Au deuxième coup comme 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);
En supposant que ces résultats ne se produisent pas sur la même image, la création d'un Anchor
est importante car le monde virtuel peut être remodelé à chaque fois que vous appelez Session.update()
. En maintenant cet emplacement avec une ancre au lieu d'une simple pose, sa pose sera mise à jour pour suivre la caractéristique physique à travers ces remodelages.
Vous pouvez extraire les deux poses HitResult
à l'aide de getHitPose () puis comparer leur composant de traduction ( getTranslation () ). La traduction est définie comme
... le vecteur de position du cadre de coordonnées de destination (généralement le monde) au cadre de coordonnées local, exprimé en coordonnées de destination (monde).
Quant à l'unité physique, je n'ai trouvé aucune remarque. Avec une caméra calibrée, cela devrait être mathématiquement possible, mais je ne sais pas s'ils fournissent réellement une API pour cela
La réponse est: oui, bien sûr , vous pouvez certainement calculer la distance entre deux HitResult
. La taille de la grille pour ARCore
, ainsi que pour ARKit
framework, est meters
. Parfois, il est plus utile d'utiliser centimetres
. Voici quelques façons de le faire avec 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
Ou, vous pouvez également utiliser les mathématiques suivantes:
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;