如何调整ViewRenderable以匹配AugmentedImage大小?

时间:2019-09-20 15:09:45

标签: kotlin arcore sceneform android-augmented-reality

我正在Android上制作一个小型AR应用,以从快照中检测GIF并使用AugmentedImages覆盖实际的GIF,但是我无法获得ViewRenderable的大小来与之匹配检测到的图像,使其完美覆盖。

我正在跟踪Google的AugmentedImages Sceneform sample,将其更改为Kotlin,并使用自己添加到AugmentedImageDatabase的图像。

以下是我所能获得的最接近的值,但仍不能完全匹配。 gifViewViewRenderable.builder()一起设置,并使用一个简单的XML文件,显示在代码块后面。我在构建器的.thenAccept中使用Glide来从URL加载正确的GIF。

AugmentedImageNode

private var gifView: ViewRenderable? = null
...
fun setImageToNode(image: AugmentedImage) {
    anchor = image.createAnchor(image.centerPose)

    gifView?.sizer = FixedHeightViewSizer(image.extentZ)

    val pose = Pose.makeTranslation(0.0f, 0.0f, 0.0f)
    val localPosition = Vector3(pose.tx(), pose.ty(), pose.tz())
    val centerNode = Node()
    centerNode.setParent(this)
    centerNode.localPosition = localPosition
    centerNode.localRotation = Quaternion(pose.qx(), 90f, -90f, pose.qw())
    centerNode.renderable = gifView
    centerNode.localScale = Vector3(image.extentX * 15f, image.extentZ * 30f, 1.0f)
}   

R.layout.image_item

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/easy_button" />

没有错误消息出现,但是渲染的图像与检测到的图像尺寸不匹配。我希望这是动态的,因为显然不是每个GIF都有相同的尺寸。

请参见this screenshot,请注意检测到的图像是如何稍大一些,看起来像是在更清晰的渲染图像周围形成边框? (与此问题无关,但是即使我设置了正确的配置设置,我的相机也无法自动对焦)

1 个答案:

答案 0 :(得分:0)

我找到了一种更精确地计算比例的方法。我采用的方法不是尝试缩放renderable / ImageView的大小以适合图像,而是改变世界的“比例”,以便无论图像有多少像素宽,它都是与检测到的增强图像相同的尺寸(以米为单位)。我基本上必须弄清楚,如果放大后的图像达到一定大小,那么一米将有多少像素。下面是我正在使用的代码:

val imageWidth = 400 // TODO Get actual width of image dynamically, just luck that GIPHY images are 400 pixels wide
val viewWidth = (imageWidth / image.extentX).toInt()
gifView?.sizer = DpToMetersViewSizer(viewWidth)

val pose = Pose.makeTranslation(0.0f, 0.0f, 0.0f)
val localPosition = Vector3(pose.tx(), pose.ty(), pose.tz())
val centerNode = Node()
centerNode.setParent(this)
centerNode.localPosition = localPosition
centerNode.localRotation = Quaternion(pose.qx(), 90f, -90f, pose.qw())
centerNode.renderable = gifView

这使渲染的GIF更加接近检测到的图像的实际大小。我将继续寻找更好的方法。