Skip to content

Instantly share code, notes, and snippets.

@MasDennis
Created October 31, 2020 13:16
Show Gist options
  • Save MasDennis/49e79596c9ab197715be617f3f5096ad to your computer and use it in GitHub Desktop.
Save MasDennis/49e79596c9ab197715be617f3f5096ad to your computer and use it in GitHub Desktop.
let viewBoundingBox = viewSpaceBoundingBox(fromNormalizedImageBoundingBox: boundingBox,
usingDisplayTransform: displayTransform)
let midPoint = CGPoint(x: viewBoundingBox.midX,
y: viewBoundingBox.midY)
// Get the feature point that is closed to our detected rectangle's center
let results = sceneView.hitTest(midPoint, types: .featurePoint)
let depthBufferZ = calculateFragmentDepth(usingCamera: camera,
distanceToTarget: Double(result.distance),
usesReverseZ: sceneView.usesReverseZ)
private func calculateFragmentDepth(usingCamera camera: SCNCamera,
distanceToTarget: Double,
usesReverseZ: Bool) -> Float
{
// SceneKit uses a reverse z buffer since iOS 13. In case it uses a reverse buffer.
// We'll need to swap the near and far planes.
let zFar = usesReverseZ ? camera.zNear : camera.zFar
let zNear = usesReverseZ ? camera.zFar : camera.zNear
let range = 2.0 * zNear * zFar
// The depth value in in normalized device coordinates [-1, 1].
let fragmentDepth = (zFar + zNear - range / distanceToTarget) / (zFar - zNear)
// Convert to normalized coordinates [0, 1].
return Float((fragmentDepth + 1.0) / 2.0)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment