我使用ARCore构建我的Android应用程序,我允许用户放置锚点。我需要能够检查Anchor是否在当前帧中。 不知道怎么办呢? 谢谢!
答案 0 :(得分:0)
如果您正在使用ARCore,那么您可能正在进行截头剔除,而不会渲染不在可查看空间内的对象,这种优化用于阻止您进行gl调用以呈现“不可见”的元素你的场景。
如果您在渲染器计算此对象后有权访问这些对象,则可以使用该值。
另一种方法是抓住相机并获取视图和投影矩阵。然后,您可以将锚定坐标投影到2D屏幕坐标上,并且如果计算的坐标在屏幕之外(即,x / y值>>或<屏幕宽度/高度)。您还必须考虑相机后面的物体(相机前移和从相机到锚点的矢量之间的点积应该是正的)。
https://developers.google.com/ar/reference/java/com/google/ar/core/Camera.html
答案 1 :(得分:0)
有一个非常简单的方法可以做到这一点。假设您在锚点上附加了一个AnchorNode。
首先,获取节点的世界位置:
val worldPosition = node.worldPosition
第二,使用场景相机将世界位置转换为屏幕点:
val screenPoint = arFragment.arSceneView.scene.camera.worldToScreenPoint(worldPosition)
现在只需检查该点是否在屏幕尺寸范围内即可。
答案 2 :(得分:0)
我基于camera.worldToScreenPoint(worldPosition)
创建了一个方法。所以我可以检查一个职位是否可见:
fun OriginalCamera.isWorldPositionVisible(worldPosition: Vector3): Boolean {
val var2 = com.google.ar.sceneform.math.Matrix()
com.google.ar.sceneform.math.Matrix.multiply(projectionMatrix, viewMatrix, var2)
val var5: Float = worldPosition.x
val var6: Float = worldPosition.y
val var7: Float = worldPosition.z
val var8 = var5 * var2.data[3] + var6 * var2.data[7] + var7 * var2.data[11] + 1.0f * var2.data[15]
if (var8 < 0f) {
return false
}
val var9 = Vector3()
var9.x = var5 * var2.data[0] + var6 * var2.data[4] + var7 * var2.data[8] + 1.0f * var2.data[12]
var9.x = var9.x / var8
if (var9.x !in -1f..1f) {
return false
}
var9.y = var5 * var2.data[1] + var6 * var2.data[5] + var7 * var2.data[9] + 1.0f * var2.data[13]
var9.y = var9.y / var8
return var9.y in -1f..1f
}
(并且我解决了Anton Stukov在评论中说的问题)