3
votes

Les images augmentées d'ArCore seront placées horizontalement sur le mur

J'essaye de créer quelque chose comme ceci: https://www.youtube.com/watch?v=sX1aOBlwGWc entrez la description de l'image ici

Je peux rendre une image en RA. Mais il est toujours placé avec la mauvaise orientation. Ce que je veux en fait, c'est qu'une image soit superposée sur l'affiche, l'image, la bannière actuelle.

Voici mon code:

Ma configuration:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:layout_width="50dp"
        android:layout_height="75dp"
        android:src="@drawable/poster" />
</LinearLayout>

Mon code après qu'une image est reconnue.

XXX

le fichier ar_layout:

ViewRenderable.builder()
     .setView(context, R.layout.ar_layout)
     .build()
     .thenAccept {
          addNodeToScene(arFragment, image, it)
     }

private fun addNodeToScene(fragment: ArFragment, image: AugmentedImage, renderable: ViewRenderable) {
    val node = Node()
    node.renderable = renderable
    val pose = image.centerPose
    val anchorNode = AnchorNode(image.createAnchor(pose))
    anchorNode.addChild(node)
    fragment.arSceneView.scene.addChild(anchorNode)
    Toast.makeText(fragment.context, "Added", Toast.LENGTH_SHORT).show()
}

J'ai trouvé quelques tutoriels sur la façon dont vous devez l'implémenter dans Unity. Mais ce n'est pas comme ça que je veux faire. Quelqu'un peut-il m'aider à comprendre cela?

Ce que j'ai obtenu à ce stade:

entrez la description de l'image ici


6 commentaires

déjà essayé Config.PlaneFindingMode.HORIZONTAL ?


Oui j'ai essayé. Cela ne résout pas le problème


layout_width = "50dp" et layout_height = "75dp" définissent généralement une mise en page 2/3 portrait. inverser ces valeurs devrait aboutir à une mise en page paysage 2/3.


Oui je sais. mais ce n'est pas ce que je veux. Je veux superposer l'image sur la table ou sur le mur. Actuellement, l'affiche dépasse de l'image sur la table ou le mur


il y a même Config.PlaneFindingMode HORIZONTAL_AND_VERTICAL . lors de la vérification de l'image inférieure; il est ancré et parfaitement aligné sur la limite supérieure.


que dois-je utiliser? Ou quels paramètres dois-je entrer?


3 Réponses :


2
votes

Je l'ai compris en créant mon propre cube (cube plat) et en ajoutant l'image en tant que texture.

fun renderImage(arFragment: ArFragment, anchor: Anchor) {
    Texture.builder().setSource(BitmapFactory.decodeResource(arFragment.resources, R.raw.sample_image))
            .build()
            .thenAccept {
                MaterialFactory.makeOpaqueWithTexture(arFragment.context, it)
                        .thenAccept { material ->
                            val modelRenderable = ShapeFactory.makeCube(
                                    Vector3(0.84f, 0.01f, 1.12f),
                                    Vector3(0.0f, 0.0f, 0.0f),
                                    material)
                            addNodeToScene(arFragment, anchor, modelRenderable)
                        }
            }
}

private fun addNodeToScene(fragment: ArFragment, anchor: Anchor, renderable: Renderable) {
    val node = Node()
    node.renderable = renderable
    val anchorNode = AnchorNode(anchor)
    anchorNode.addChild(node)

    fragment.arSceneView.scene.addChild(anchorNode)
    Toast.makeText(fragment.context, "Added", Toast.LENGTH_SHORT).show()
}


0 commentaires

0
votes

Vous devriez pouvoir changer l'orientation de l'image / vue / objet rendu en utilisant setLocalRotation.

Par exemple, dans mon projet, j'ai utilisé le code ci-dessous, qui fait que l'image rendue est directement orientée vers l'extérieur de l'image détectée.

Node cornerNode;
localPosition.set(-0.0f * image.getExtentX(), 0.1f, +0.5f * image.getExtentZ());
cornerNode = new Node();
cornerNode.setParent(this);
cornerNode.setLocalPosition(localPosition);
cornerNode.setLocalRotation(Quaternion.axisAngle(new Vector3(-1f, 0, 0), 90f));
cornerNode.setRenderable(testViewRenderable);


0 commentaires

0
votes

Le AnchorNode suit la pose de AugmentedImage et par conséquent, vous ne pouvez pas modifier localRotation ou localPosition sur ce nœud. Depuis AnchorNode.setLocalRotation : "Définissez la rotation de l'espace local de ce nœud s'il n'est pas ancré. "

Vous pouvez modifier la transformation locale en introduisant un nœud intermédiaire:

                    val base = AnchorNode()
                    base.anchor = augmentedImage.createAnchor(augmentedImage.centerPose)

                    val node = Node()
                    node.setParent(base)
                    node.localPosition = Vector3(0f, 0f, augmentedImage.extentZ/2)
                    node.localRotation = Quaternion.axisAngle(Vector3(1.0f, 0f, 0f), -90f)
                    node.localScale = Vector3(augmentedImage.extentX, augmentedImage.extentZ, 0f)

                    node.renderable = renderable


0 commentaires