Можно ли разместить 3d-объекты поверх дополненных изображений в определенном порядке? - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь сделать небольшое приложение для поиска сокровищ с увеличенными изображениями. Поскольку я новичок, возможно, что-то не так в моем коде. Дело в том, что мне нужно проверить, ищет ли пользователь расширенные изображения в правильном порядке (это означает, что ему или ей нельзя разрешать пропускать изображение, если это происходит, должно отображаться сообщение, и не должно быть 3D-модели). оказываемый). Пользователь получит подсказку (тост) о том, где ему следует искать следующее увеличенное изображение. Эта подсказка будет отображаться только в том случае, если пользователь следит за правильным порядком изображений. Если пользователь находится в правильном порядке, 3d-модель будет отображаться в верхней части расширенного изображения. Когда пользователь касается 3d-модели, появляется сообщение (подсказка, указывающая следующее изображение).

Итак, моя проблема заключается в том, что цикл проверяет соответствие между любым дополненным изображением в моей базе данных augmented-икадр в реальном мире, проверяет все условия одновременно (по крайней мере, выглядит так). В моем примере я использую только два изображения, чтобы лучше понять проблему (я добавлю больше позже). Давайте предположим, что правильный порядок: image1-image2 (сначала изображение 1, затем изображение 2). Когда я сначала ищу второе изображение (в неправильном порядке), 3d-модель не отображается, и отображается сообщение о том, что пользователь сталкивается с неправильным изображением. Проблема возникает позже, когда я снова возвращаюсь к правильному изображению (изображение 1). Что происходит, так это то, что обе модели (из image1 и image2) отображаются вместе поверх image1, тогда как должна была появиться только модель, связанная с моим image1 (поскольку я сейчас в правильном порядке). Я хочу, чтобы каждая модель отображалась только поверх правильного дополненного изображения и только тогда, когда изображение отображается в правильном порядке.

Вот часть моего кода, которая проверяет изображения в реальном мире:

private void onUpdateFrame(FrameTime frameTime) {
        Frame frame = arFragment.getArSceneView().getArFrame();
        Collection<AugmentedImage> augmentedImages = frame.getUpdatedTrackables(AugmentedImage.class);

        //This loop is constantly comparing every frame seen in the real world (by our phone camera) with the
        // images contained in our augmented images Database. When an image caught by our camera matches any image in our
        // database and that image is seen in the correct order , a 3d object is going to be placed on top
        // of that image (This is supposed to only happen ONCE per image - using the method placeOBject).

        for (AugmentedImage augmentedImage : augmentedImages) {
            if (augmentedImage.getTrackingState() == TrackingState.TRACKING) {


                //Each one of the if statements below check a certain image included in our database. And every nested if/else
                // statements check if the images were captured in the correct order (Meaning that no image has been skipped).
                if (augmentedImage.getName().equals("muriloCard") && imgCont1==0) {
                    placeObject1(arFragment, augmentedImage.createAnchor(augmentedImage.getCenterPose()), Uri.parse("models/MagnifyingGlass.sfb"));
                    imgCont1++;
                }
                if (augmentedImage.getName().equals("earthAugmented") && (imgCont2==0)) {
                    if (textSeen1 == true && (imgCont1!=0)){
                        placeObject2(arFragment, augmentedImage.createAnchor(augmentedImage.getCenterPose()), Uri.parse("models/Present.sfb"));
                        imgCont2++;
                    }else if (textSeen1 == false) {
                        Toast.makeText(arFragment.getContext(), "You are in image EARTH. You are in the wrong image.", Toast.LENGTH_LONG).show();
                        textSeen1 = true;
                    }

                }

Как вы можете видеть, мое первое изображение (image1) - "muriloCard", а второе (image2) «EarthAugmented». Проблема, о которой я уже говорил, возникает, когда я сначала смотрю на «earthAugmented», а потом на «muriloCard». Каждый оператор if должен проверяться отдельно, но похоже, что цикл for проверяет их одновременно, а это означает, что как только значение

imgCont1 

увеличивается, это выглядит так, что оба выражения удовлетворены, и обаобъекты (подарок и увеличительное стекло) размещаются одновременно, используя оба метода ниже:

placeObject1(arFragment, augmentedImage.createAnchor(augmentedImage.getCenterPose()), Uri.parse("models/MagnifyingGlass.sfb"));
placeObject2(arFragment, augmentedImage.createAnchor(augmentedImage.getCenterPose()), Uri.parse("models/Present.sfb"));

Таким образом, вместо вызова placeObject1 при первом просмотре изображения и вызова placeObject2 при отображении второго изображенияВидно, оба вызываются одновременно, когда видно мое первое изображение (только после того, как второе уже было видно). Есть ли способ изменить это поведение?

...