项目里碰到了展示全景图的需求,以前没做过,google了一下已经有不少现成的库可以拿来用了,不过有前辈提到可以用SceneKit来实现,刚好去年做AR的时候用过SceneKit,一下子来了思路,在这里记录一下。
思路
思路就是在SceneKit的场景里放置一个球体,把全景图贴在球体表明,然后把相机放置在球体中心不就得了。
实现
实现起来很简单,往 ViewController 放一个 SCNView,一个相机,一个球体就好。
class PanoramaVC: UIViewController {
let sceneView = SCNView()
// 相机Node
let cameraNode = SCNNode()
// 球体
let sphere = SCNSphere()
...
override func viewDidLoad() {
super.viewDidLoad()
sceneView.scene = SCNScene.init()
sceneView.frame = self.view.frame
self.addSubView(sceneView)
sphere.radius = 50
// 只渲染一面,从球体里面看,外面就不用渲染了
sphere.firstMaterial?.isDoubleSided = false
// 剔除外面
sphere.firstMaterial?.cullMode = .front
// 把全景图“贴”到球体上
sphere.firstMaterial?.diffuse.contents = UIImage.init(named: "全景图名")
// 球体Node,位置放到场景原点
let sphereNode = SCNNode.init(geometry: sphere)
sphereNode.position = SCNVector3Make(0, 0, 0)
sceneView.scene?.rootNode.addChildNode(sphereNode)
// 相机Node,位置放到场景原点
cameraNode.camera = SCNCamera.init()
cameraNode.posit