ArCore 增强图像将水平放置在墙上
ArCore Augmented Images will be place horizontal on the wall
我正在尝试做这样的事情:
https://www.youtube.com/watch?v=sX1aOBlwGWc
我可以在 AR 中渲染图像。但它总是以错误的方向放置。我真正想要实现的是图像覆盖在当前的海报、图片、横幅上。
这是我的代码:
我的配置:
config.focusMode = Config.FocusMode.AUTO
config.updateMode = Config.UpdateMode.LATEST_CAMERA_IMAGE
config.planeFindingMode = Config.PlaneFindingMode.VERTICAL
我识别图片后的代码
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()
}
ar_layout 文件:
<?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>
我找到了一些关于如何在 Unity 中实现它的教程。但这不是我想要的。有人可以帮我解决这个问题吗?
此时我得到的是:
我通过创建自己的立方体(平面立方体)并将图像添加为纹理来解决这个问题。
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()
}
您应该能够使用 setLocalRotation 更改渲染的方向 image/view/object。
例如,在我的项目中,我使用了下面的代码,它使渲染图像从检测到的图像直接朝外。
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);
AnchorNode 遵循 AugmentedImage 的姿势,因此,您不能在此节点上更改 localRotation
或 localPosition
。来自 AnchorNode.setLocalRotation:"Set the local-space rotation of this node if it is not anchored."
您可以通过引入中间节点来更改局部变换:
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
我正在尝试做这样的事情:
https://www.youtube.com/watch?v=sX1aOBlwGWc
我可以在 AR 中渲染图像。但它总是以错误的方向放置。我真正想要实现的是图像覆盖在当前的海报、图片、横幅上。
这是我的代码:
我的配置:
config.focusMode = Config.FocusMode.AUTO
config.updateMode = Config.UpdateMode.LATEST_CAMERA_IMAGE
config.planeFindingMode = Config.PlaneFindingMode.VERTICAL
我识别图片后的代码
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()
}
ar_layout 文件:
<?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>
我找到了一些关于如何在 Unity 中实现它的教程。但这不是我想要的。有人可以帮我解决这个问题吗?
此时我得到的是:
我通过创建自己的立方体(平面立方体)并将图像添加为纹理来解决这个问题。
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()
}
您应该能够使用 setLocalRotation 更改渲染的方向 image/view/object。
例如,在我的项目中,我使用了下面的代码,它使渲染图像从检测到的图像直接朝外。
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);
AnchorNode 遵循 AugmentedImage 的姿势,因此,您不能在此节点上更改 localRotation
或 localPosition
。来自 AnchorNode.setLocalRotation:"Set the local-space rotation of this node if it is not anchored."
您可以通过引入中间节点来更改局部变换:
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