Я использую ARCore для создания своего приложения для Android, где я разрешаю пользователям размещать привязки. Мне нужно проверить, находится ли якорь в текущем кадре. Есть идеи, как мне это сделать? Спасибо!
Выяснение, отображается ли якорь на текущем экране
Ответы (3)
Если вы используете ARCore, вы, вероятно, выполняете усеченную отсечку, когда вы не визуализируете объекты, которые не находятся в видимом пространстве, оптимизация, используемая, чтобы помешать вам делать вызовы gl для визуализации «невидимых» элементов вашей сцены.
Если у вас есть доступ к объектам после того, как средство визуализации вычислит это, вы можете использовать это значение.
Другой способ сделать это - взять камеру и получить матрицы вида и проекции. Затем вы можете спроецировать координаты привязки на 2D-координаты экрана, и если вычисленные координаты находятся за пределами экрана (т. Е. Значения x / y равны> или ‹ширины / высоты экрана). Вам также придется учитывать объекты, которые находятся за камерой (скалярное произведение между камерой вперед и вектором от камеры до якоря должно быть положительным).
https://developers.google.com/ar/reference/java/com/google/ar/core/Camera.html.
Создал метод на основе 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
}
(И я исправил проблему, о которой говорил Антон Стуков в комментариях)
Есть довольно простой способ сделать это. Допустим, у вас есть AnchorNode, прикрепленный к вашему якору.
Сначала получите положение узла в мире:
val worldPosition = node.worldPosition
Во-вторых, используйте камеру сцены, чтобы преобразовать положение мира в точку на экране:
val screenPoint = arFragment.arSceneView.scene.camera.worldToScreenPoint(worldPosition)
Теперь просто проверьте, находится ли точка внутри границ экрана.