ARCORE: проверка размещенных объектов, чтобы убедиться, что они разнесены, не работает - PullRequest
0 голосов
/ 06 марта 2020

В настоящее время я делаю проект AR с использованием android studio и ARCore, и для моей проблемы у меня есть объекты AR, где они будут размещаться, где бы я ни нажимал, так что это приводит к проблеме, когда они могут быть расположены рядом друг с другом и поэтому объекты накладываются друг на друга и не выглядят лучше всего. Итак, я пытаюсь раздвинуть их, чтобы они не перекрывали друг друга, но код, который я сделал, не работает. Вот мой код:

arFragment.setOnTapArPlaneListener(
                (HitResult hitResult, Plane plane, MotionEvent motionEvent) -> {

                    if (plane.getType() != Plane.Type.HORIZONTAL_UPWARD_FACING){
                        return;
                    }
                    Anchor anchor = hitResult.createAnchor();
                    arranchors.addElement(anchor); //adding anchor to my vector arr that keeps track of anchors
                    if(arranchors.size() >=2)//only check when there is 2 or more objects 
                    {
                        //here we will check for distance between two objects
                        double dist;
                        for(int i=0; i<arranchors.size()-1; i++) {
                            //dist= getMetersBetweenAnchors(arranchors.elementAt(i),arranchors.elementAt(j));
                            dist= getDistanceMeters(arranchors.elementAt(i).getPose(),arranchors.elementAt(i+1).getPose());
                            //4 is just a random number for testing. not exactly sure what would be a real number to put.
                            if(dist < 4)
                            {
                                //here we will have to change how far they are.
                                //makeTranslation have random values just to test.
                                arranchors.elementAt(i).getPose().compose(Pose.makeTranslation(10.0f, 7.5f, 10.0f));

                            }
                        }
                    }

                    //placeObject(arFragment, arranchors.lastElement(), selectedObject);
                    placeObject(arFragment, anchor, selectedObject); //selectedObject is the renderable (like laptopRenderable)
                }
);

У меня есть две функции для нахождения расстояния между двумя якорями, которые я нашел в Интернете, и пытаюсь оба, чтобы увидеть, какая работает правильно. Ниже приведен код для них обоих:

float getMetersBetweenAnchors(Anchor anchor1, Anchor anchor2)
{
        float[] distance_vector = anchor1.getPose().inverse()
                .compose(anchor2.getPose()).getTranslation();
        float totalDistanceSquared = 0.0f;
        for(int i=0; i<3; ++i)
            totalDistanceSquared += distance_vector[i]*distance_vector[i];
        return (float) Math.sqrt(totalDistanceSquared);
}
//have two getdistance functions just to see which one works correctly or better.
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);
}

Пожалуйста, просмотрите мой код и посмотрите, что я могу делать неправильно. Большое спасибо за ваше время и хорошего.

...