Я занимаюсь разработкой приложения ARKit ImageTracking, для нашего опыта работы с AR мы хотим, чтобы изображение отслеживания было полностью видимым. Если оно частично видно, мне нужно показать сообщение UI «Пожалуйста, убедитесь, что маркер полностью виден».
Поэтому я добавил плоскость как SCNNode, которая равна размеру маркера. как показано ниже
и получил ограничивающий прямоугольник или четыре угла плоскости, но как определить, что этот самолет полностью виден, или все четыре угла плоскости находятся в кадре камеры?
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
//1. If Out Target Image Has Been Detected Than Get The Corresponding Anchor
guard let currentImageAnchor = anchor as? ARImageAnchor else { return }
let x = currentImageAnchor.transform
print(x.columns.3.x, x.columns.3.y , x.columns.3.z)
//2. Get The Targets Name
let name = currentImageAnchor.referenceImage.name!
//3. Get The Targets Width & Height In Meters
let width = currentImageAnchor.referenceImage.physicalSize.width
let height = currentImageAnchor.referenceImage.physicalSize.height
//4. Create A Plane Geometry To Cover The ARImageAnchor
let planeNode = SCNNode()
planeNode.name = "markerSizePlane"
let planeGeometry = SCNPlane(width: width, height: height)
planeGeometry.firstMaterial?.diffuse.contents = UIColor.blue
planeNode.opacity = 0.25
planeNode.geometry = planeGeometry
//5. Rotate The PlaneNode To Horizontal
planeNode.eulerAngles.x = -.pi/2
//The Node Is Centered In The Anchor (0,0,0)
node.addChildNode(planeNode)
}
/* Getting corners of plane */
func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) {
var bottomLeft: SCNVector3!
var topRight: SCNVector3!
var topLeft: SCNVector3!
var bottomRight: SCNVector3!
//1. Get The Current Point Of View
guard let pointOfView = sceneView.pointOfView else { return }
scene.rootNode.enumerateChildNodes(){
node, stop in
if node.name == "markerSizePlane"{
//print("markerSizePlane position \(node.position)")
let (min, max) = node.boundingBox
bottomLeft = SCNVector3(min.x, min.y, 0)
topRight = SCNVector3(max.x, max.y, 0)
topLeft = SCNVector3(min.x, max.y, 0)
bottomRight = SCNVector3(max.x, min.y, 0)
}
}
}