确定Anchor在当前屏幕中是否可见

时间:2018-03-22 23:19:49

标签: android arcore

我使用ARCore构建我的Android应用程序,我允许用户放置锚点。我需要能够检查Anchor是否在当前帧中。 不知道怎么办呢? 谢谢!

3 个答案:

答案 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在评论中说的问题)