我想你应该检查边界框的所有顶点。
我没有测试这段代码,但我希望它能正常工作。
let (localMin, localMax) = endNode.boundingBox
let min = endNode.convertPosition(localMin, to: nil)
let max = endNode.convertPosition(localMax, to: nil)
let arr = [
renderer.projectPoint(SCNVector3(min.x, min.y, min.z)),
renderer.projectPoint(SCNVector3(max.x, min.y, min.z)),
renderer.projectPoint(SCNVector3(min.x, max.y, min.z)),
renderer.projectPoint(SCNVector3(max.x, max.y, min.z)),
renderer.projectPoint(SCNVector3(min.x, min.y, max.z)),
renderer.projectPoint(SCNVector3(max.x, min.y, max.z)),
renderer.projectPoint(SCNVector3(min.x, max.y, max.z)),
renderer.projectPoint(SCNVector3(max.x, max.y, max.z))
]
let minX: CGFloat = arr.reduce(CGFloat.infinity, { $0 > $1.x ? $1.x : $0 })
let minY: CGFloat = arr.reduce(CGFloat.infinity, { $0 > $1.y ? $1.y : $0 })
let minZ: CGFloat = arr.reduce(CGFloat.infinity, { $0 > $1.z ? $1.z : $0 })
let maxX: CGFloat = arr.reduce(-CGFloat.infinity, { $0 < $1.x ? $1.x : $0 })
let maxY: CGFloat = arr.reduce(-CGFloat.infinity, { $0 < $1.y ? $1.y : $0 })
let maxZ: CGFloat = arr.reduce(-CGFloat.infinity, { $0 < $1.z ? $1.z : $0 })
let width = maxX - minX
let height = maxY - minY
let depth = maxZ - minZ
let sizeInPts = CGSize(width: width, height: height)
我将Xcode Playground示例上传到Github。
...这很清楚为什么上述不起作用。从世界单位坐标到屏幕坐标时,用projectPoint投影_bounds_将被夸大。但仍然不确定正确的做法是什么。 –