У меня есть приложение, которое при обнаружении изображения помещает 3d-модель, но когда я изменяю изображение, чтобы обнаружить его, не меняю отображаемую модель, я не работаю над ним, но не могу найти ответ.
Это классы java, которые я использую в своем приложении android.
MainActivity
public class MainActivity extends AppCompatActivity {
private final Map<AugmentedImage, AugmentedImageNode> augmentedImageMap = new HashMap<>();
private ArFragment arFragment;
private AugmentedImageNode node;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
arFragment.getArSceneView().getScene().addOnUpdateListener(this::onUpdateFrame);
}
private void onUpdateFrame(FrameTime frameTime) {
Frame frame = arFragment.getArSceneView().getArFrame();
// If there is no frame, just return.
if (frame == null) {
return;
}
Collection<AugmentedImage> updatedAugmentedImages =
frame.getUpdatedTrackables(AugmentedImage.class);
for (AugmentedImage augmentedImage : updatedAugmentedImages) {
switch (augmentedImage.getTrackingState()) {
case PAUSED:
Toast toast = Toast.makeText(this,
"Imagen detectada: " + augmentedImage.getName(), Toast.LENGTH_SHORT);
toast.show();
break;
case TRACKING:
switch (augmentedImage.getIndex()) {
case 0://MODELO 3D
node = new AugmentedImageNode(this);
node.setImage(augmentedImage, "kubone.sfb");
augmentedImageMap.put(augmentedImage, node);
arFragment.getArSceneView().getScene().addChild(node);
break;
case 1://MODELO 3D
if (node != null)
node = new AugmentedImageNode(this);
node.setImage(augmentedImage, "mew.sfb");
augmentedImageMap.put(augmentedImage, node);
arFragment.getArSceneView().getScene().addChild(node);
break;
}
break;
case STOPPED:
System.out.println("!!!STOPPED!!!");
augmentedImageMap.remove(augmentedImage);
break;
}
}
}
}
AugmentedImageNode
@SuppressWarnings({"AndroidApiChecker"})
public class AugmentedImageNode extends AnchorNode {
private static CompletableFuture<ModelRenderable> kubone;
private static CompletableFuture<ModelRenderable> mew;
private AugmentedImage image;
public AugmentedImageNode(Context context) {
kubone = ModelRenderable.builder().setSource(context, Uri.parse("kubone.sfb")).build();
mew = ModelRenderable.builder().setSource(context, Uri.parse("mew.sfb")).build();
}
@SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"})
public void setImage(AugmentedImage image, String modelo) {
this.image = image;
if (!kubone.isDone() || !mew.isDone()) {
CompletableFuture.allOf(kubone, mew).thenAccept((Void aVoid) -> setImage(image,
modelo)).exceptionally(throwable -> {
Log.e("ERROR", "Error al cargar ", throwable);
return null;
});
}
if (modelo.equalsIgnoreCase("kubone.sfb")) {
setAnchor(image.createAnchor(image.getCenterPose()));
Node nodo = new Node();
nodo.setParent(this);
nodo.setRenderable(kubone.getNow(null));
}
if (modelo.equalsIgnoreCase("mew.sfb")) {
setAnchor(image.createAnchor(image.getCenterPose()));
Node nodo = new Node();
nodo.setParent(this);
nodo.setRenderable(mew.getNow(null));
}
}
public AugmentedImage getImage() {
return image;
}
}