Я пытаюсь сделать небольшое приложение для поиска сокровищ с увеличенными изображениями. Поскольку я новичок, возможно, что-то не так в моем коде. Дело в том, что мне нужно проверить, ищет ли пользователь расширенные изображения в правильном порядке (это означает, что ему или ей нельзя разрешать пропускать изображение, если это происходит, должно отображаться сообщение, и не должно быть 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 при отображении второго изображенияВидно, оба вызываются одновременно, когда видно мое первое изображение (только после того, как второе уже было видно). Есть ли способ изменить это поведение?