我正在Android上制作一个小型AR应用,以从快照中检测GIF并使用AugmentedImages
覆盖实际的GIF,但是我无法获得ViewRenderable
的大小来与之匹配检测到的图像,使其完美覆盖。
我正在跟踪Google的AugmentedImages Sceneform sample,将其更改为Kotlin,并使用自己添加到AugmentedImageDatabase
的图像。
以下是我所能获得的最接近的值,但仍不能完全匹配。 gifView
与ViewRenderable.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,请注意检测到的图像是如何稍大一些,看起来像是在更清晰的渲染图像周围形成边框? (与此问题无关,但是即使我设置了正确的配置设置,我的相机也无法自动对焦)
答案 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更加接近检测到的图像的实际大小。我将继续寻找更好的方法。