2017-10-13 9 views

Répondre

1

J'ai eu la même question ces jours-ci, j'ai essayé 2 solutions,

1. frame.hitTest (MotionEvent)

2. projet, le sommet du monde Arcore à 2d coordonnées en vue

au début, j'utiliser 1. pour obtenir le succès poser sur l'avion et comparer à la pose existait déjà objet 3D, mais une fois l'objet 3d laissé cela ne fonctionnera pas dans l'avion.

À la fin, j'utilise 2. pour obtenir le vertex de l'objet 3d affiché, puis faire un test avec la position de prise.

Si vous suivez l'exemple Arcore, vous pouvez voir cette ligne dans la méthode de tirage de ObjectRenderer.java

Matrix.multiplyMM(mModelViewProjectionMatrix, 0, 
        cameraPerspective, 0, mModelViewMatrix, 0); 

« mModelViewProjectionMatrix » il suffit d'utiliser cette matrice de ModelViewProjection pour cartographier le sommet de votre déjà ajouté objet 3d du monde 3d arcore à la vue 2D.

Dans mon cas, je fais quelque chose comme ça,

pose.toMatrix(mAnchorMatrix, 0); 
objectRenderer.updateModelMatrix(mAnchorMatrix, 1); 
objectRenderer.draw(cameraView, cameraPerspective, lightIntensity); 

float[] centerVertexOf3dObject = {0f, 0f, 0f, 1}; 
float[] vertexResult = new float[4]; 
Matrix.multiplyMV(vertexResult, 0, 
        objectRenderer.getModelViewProjectionMatrix(), 0, 
        centerVertexOf3dObject, 0); 
// circle hit test 
float radius = (viewWidth/2) * (cubeHitAreaRadius/vertexResult[3]); 
float dx = event.getX() - (viewWidth/2) * (1 + vertexResult[0]/vertexResult[3]); 
float dy = event.getY() - (viewHeight/2) * (1 - vertexResult[1]/vertexResult[3]); 
double distance = Math.sqrt(dx * dx + dy * dy); 
boolean isHit = distance < radius; 

J'utilise cette application dans Arcore Mesure,
https://play.google.com/store/apps/details?id=com.hl3hl3.arcoremeasure

et le code source, https://github.com/hl3hl3/ARCoreMeasure/blob/master/app/src/main/java/com/hl3hl3/arcoremeasure/ArMeasureActivity.java