J'essaye de créer quelque chose comme ceci: https://www.youtube.com/watch?v=sX1aOBlwGWc
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:
3 Réponses :
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() }
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);
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
déjà essayé
Config.PlaneFindingMode.HORIZONTAL
?Oui j'ai essayé. Cela ne résout pas le problème
layout_width = "50dp"
etlayout_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?