如何以特定顺序将3d对象放置在增强图像的顶部

时间:2019-10-29 18:45:43

标签: java android android-studio augmented-reality arcore

我想做的是一个带有增强图像的寻宝应用程序。由于我是初学者,因此我的代码中可能存在某些错误。事实是,我需要验证用户是否按正确的顺序查找增强后的图像(这意味着不应允许他或她跳过图像,如果发生这种情况,则应显示一条消息,并且不应使用3D模型呈现)。用户将收到提示(吐司),提示他/她应在哪里寻找下一个增强图像。仅当用户遵循正确的图像顺序时,才会显示该提示。如果用户的顺序正确,则3D模型将显示在增强图像的顶部。当用户触摸3D模型时,将出现一条消息(提示指示下一张图像)。

所以,我的问题是,循环检查我的扩充数据库中的任何扩充图像与现实世界中的帧之间的匹配,同时检查所有条件(至少看起来是这样)。在我的示例中,我仅使用两个图像来更好地理解问题(稍后将添加更多内容)。假设正确的顺序是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;
                    }

                }

如您所见,我的第一个图像(图像1)是“ muriloCard”,第二个图像(图像2)是“ 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,而是在看到我的第一个图像的同时调用它们(仅在已经看到第二个图像之后)。有没有办法改变这种行为?

0 个答案:

没有答案