Выяснение, отображается ли якорь на текущем экране

Я использую ARCore для создания своего приложения для Android, где я разрешаю пользователям размещать привязки. Мне нужно проверить, находится ли якорь в текущем кадре. Есть идеи, как мне это сделать? Спасибо!


person user3860345    schedule 22.03.2018    source источник


Ответы (3)


Если вы используете ARCore, вы, вероятно, выполняете усеченную отсечку, когда вы не визуализируете объекты, которые не находятся в видимом пространстве, оптимизация, используемая, чтобы помешать вам делать вызовы gl для визуализации «невидимых» элементов вашей сцены.

Если у вас есть доступ к объектам после того, как средство визуализации вычислит это, вы можете использовать это значение.

Другой способ сделать это - взять камеру и получить матрицы вида и проекции. Затем вы можете спроецировать координаты привязки на 2D-координаты экрана, и если вычисленные координаты находятся за пределами экрана (т. Е. Значения x / y равны> или ‹ширины / высоты экрана). Вам также придется учитывать объекты, которые находятся за камерой (скалярное произведение между камерой вперед и вектором от камеры до якоря должно быть положительным).

https://developers.google.com/ar/reference/java/com/google/ar/core/Camera.html.

person ACVM    schedule 23.03.2018

Создал метод на основе camera.worldToScreenPoint(worldPosition). Итак, я могу проверить, видна ли позиция:

fun com.google.ar.sceneform.Camera.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
}

(И я исправил проблему, о которой говорил Антон Стуков в комментариях)

person d.sn    schedule 12.12.2019
comment
как вы можете получить projectionMatrix и viewMatrix? - person Manuela; 28.04.2020
comment
com.google.ar.sceneform.Camera # getViewMatrix и com.google.ar.sceneform.Camera # getProjectionMatrix - person d.sn; 02.05.2020
comment
спасибо @ d.sn, какие параметры getViewMatrix или getProjectionMatrix? у вас есть пример использования? кроме того, com.google.ar.sceneform.math.Matrix.multiply хочет объекты Matrix, как преобразовать массив float [16] в Matrix? - person Manuela; 06.05.2020
comment
1. эти методы не имеют параметров getViewMatrix () и getProjectionMatrix () 2. com.google.ar.sceneform.math.Matrix.Matrix (float []) и com.google.ar.sceneform.math.Matrix # set (float []) - person d.sn; 07.05.2020

Есть довольно простой способ сделать это. Допустим, у вас есть AnchorNode, прикрепленный к вашему якору.

Сначала получите положение узла в мире:

val worldPosition = node.worldPosition

Во-вторых, используйте камеру сцены, чтобы преобразовать положение мира в точку на экране:

val screenPoint = arFragment.arSceneView.scene.camera.worldToScreenPoint(worldPosition)

Теперь просто проверьте, находится ли точка внутри границ экрана.

person Oleksii Shliama    schedule 27.12.2018
comment
Это только половина решения. Если узел находится за камерой, то точка также находится внутри границы размера. Но объект в данный момент не в поле зрения. - person Anton Stukov; 09.12.2019