一臭觉、原理部分
1.利用SceneKit 造一個(gè)球面
2.將圖片鋪滿球面
3.在球中心放一個(gè)相機(jī),也就是我們的眼睛所在,
4.根據(jù)手勢(shì)或者陀螺儀,改變相機(jī)視野
大概這樣.png
二肠骆、代碼部分
1.導(dǎo)入 SceneKit框架
SceneKit是一個(gè)高性能的渲染游戲引擎,它能夠?qū)?3D 模型文件,用很簡(jiǎn)單的方式渲染出來(lái).
import SceneKit
2.創(chuàng)建SCNView 并加到 view上
let scnView = SCNView()
scnView.frame = view.bounds
//SCNView中scene默認(rèn)為 nil
scnView.scene = SCNScene()
self.view.addSubview(scnView);
3.添加相機(jī)節(jié)點(diǎn)
let camera = SCNCamera()
cameraNode.camera = camera
cameraNode.camera?.automaticallyAdjustsZRange = true;
cameraNode.position = SCNVector3Make(0, 0, 0);
scnView.scene?.rootNode.addChildNode(cameraNode);
4.添加圖片顯示節(jié)點(diǎn)
let panoramaNode = SCNNode()
panoramaNode.geometry = SCNSphere(radius: 100);
//剔除外表面
panoramaNode.geometry?.firstMaterial?.cullMode = .front
//只顯示一個(gè)面
panoramaNode.geometry?.firstMaterial?.isDoubleSided = false
panoramaNode.position = SCNVector3Make(0, 0, 0);
scnView.scene?.rootNode.addChildNode(panoramaNode);
5.顯示圖片
let image = UIImage(named: "星空")
panoramaNode.geometry?.firstMaterial?.diffuse.contents = image
6.實(shí)現(xiàn)滑動(dòng)旋轉(zhuǎn)
let pan = UIPanGestureRecognizer(target: self, action: #selector(panImage(gesture:)))
scnView.addGestureRecognizer(pan)
根據(jù)手指移動(dòng)距離計(jì)算角度,然后旋轉(zhuǎn)相機(jī)節(jié)點(diǎn)
if gesture.state == .began {
let currentPoint = gesture .location(in: self.scnView)
lastPoint_x = currentPoint.x
lastPoint_y = currentPoint.y
}else{
let currentPoint = gesture .location(in: self.scnView)
var distX = currentPoint.x - lastPoint_x
var distY:CGFloat = currentPoint.y - lastPoint_y
lastPoint_x = currentPoint.x
lastPoint_y = currentPoint.y
distX *= -0.003
distY *= -0.003
fingerRotationY += distY
fingerRotationX += distX
var modelMatrix = SCNMatrix4MakeRotation(0, 0, 0, 0)
modelMatrix = SCNMatrix4Rotate(modelMatrix, Float(fingerRotationX),0, 1, 0);
modelMatrix = SCNMatrix4Rotate(modelMatrix, Float(fingerRotationY), 1, 0, 0);
self.cameraNode.pivot = modelMatrix;
}
7.實(shí)現(xiàn)圖片放大縮小
添加捏合手勢(shì)
let pinch = UIPinchGestureRecognizer(target: self, action: #selector(pinchGesture(gesture:)))
scnView.addGestureRecognizer(pinch)
手勢(shì)計(jì)算
@objc func pinchGesture(gesture:UIGestureRecognizer){
if !gesture.isKind(of: UIPinchGestureRecognizer.self){
return
}
let pinchGesture = gesture as! UIPinchGestureRecognizer
if pinchGesture.state != .ended && pinchGesture.state != .failed{
if/* pinchGesture.scale != NAN && */ pinchGesture.scale != 0.0{
var scale = pinchGesture.scale - 1
if scale < 0 {
scale *= (sScaleMax - sScaleMin)
}
currentScale = scale + prevScale
currentScale = validateScale(scale: currentScale)
let valScale = validateScale(scale: currentScale)
let xFov = 90 * (1-(valScale-1)*0.15)
let yFov = 50 * (1-(valScale-1)*0.15)
cameraNode.camera?.xFov = Double(xFov)
cameraNode.camera?.yFov = Double(yFov)
}
}else if pinchGesture.state == .ended{
prevScale = currentScale
}
}
private func validateScale(scale:CGFloat) -> CGFloat {
var validateScale = scale
if scale < sScaleMin {
validateScale = sScaleMin
} else if scale > sScaleMax{
validateScale = sScaleMax
}
return validateScale
}
效果
全景圖來(lái)自微博 侵刪