Skip to content

Metal-backed 360° panorama view for iOS

License

Notifications You must be signed in to change notification settings

Q42/MetalScope

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MetalScope

Carthage compatible CocoaPods compatible Swift 3.0.x

Metal-backed 360° panorama view for iOS.

Features
🤘 Built on top of SceneKit + Metal
👀 Distorted stereo view for Cardboard
🌐 Support mono/stereo equirectangular images/videos
▶️ Direct access to AVPlayer for video control
👆 Smooth touch rotation and re-centering
🌄 Custom SCNScene presentation
🐦 Written in Swift 5

Usage

PanoramaView

Use PanoramaView to display an equirectangular image or video.

import MetalScope
import Metal
import AVFoundation

guard let device = MTLCreateSystemDefaultDevice() else {
    fatalError("MetalScope requires Metal 🤘")
}

let panoramaView = PanoramaView(frame: ..., device: device)

// load monoscopic panorama image
let panoramaImage = UIImage(...)
panoramaView.load(panoramaImage, format: .mono)

// load stereoscopic panorama video
let videoURL = URL(...)
let player = AVPlayer(url: videoURL)
panoramaView.load(player, format: .stereoOverUnder)
player.play()

// load any SCNScene
panoramaView.scene = ...

PanoramaView rotates the point of view by device motions and user's pan gesture. To reset rotation, just call setNeedsResetRotation()

let panoramaView: PanoramaView = ...

// double tap to re-center the scene
let recognizer = UITapGestureRecognizer(
  target: panoramaView,
  action: #selector(PanoramaView.setNeedsResetRotation(_:)))
recognizer.numberOfTapsRequired = 2

panoramaView.addGestureRecognizer(recognizer)

// if you want to disable pan gesture:
panoramaView.panGestureRecognizer.isEnabled = false

PanoramaView Preview

60 FPS demo on YouTube

StereoView

For stereo display for Google's Cardboard, use StereoView or StereoViewController instead.

let stereoViewController = StereoViewController(device: ...)

// load media
stereoViewController.load(image, format: .stereoOverUnder)

// or any SCNScene
stereoViewController.scene = panoramaView.scene

// customize stereo parameters if needed
stereoViewController.stereoParameters = StereoParameters(
  screenModel: .default,
  viewerModel: .cardboardMay2015)

present(stereoViewController, animated: true, completion: nil)

Preview of StereoViewController

Check example apps for more samples.

Simulator

PanoramaView, StereoView and StereoViewController can also be used on iOS simulator by using alternative initializers.

#if arch(arm) || arch(arm64)
let panoramaView = PanoramaView(frame: view.bounds, device: device)
#else
let panoramaView = PanoramaView(frame: view.bounds) // simulator
#endif

Please note that these classes are significantly limited in functionality on the simulator. For example, PanoramaView can display photos, but cannot display videos. For StereoView and StereoViewController, it is a placeholder and nothing is displayed.

Requirements

  • Xcode 8.2+
  • iOS 9.0+
  • Swift 3.0+
  • Metal (Apple A7+)

NOTE: Metal is not supported in the iOS Simulator 😢

Installation

Swift Package Manager

If you use the Swift Package Manager, add MetalScope as a dependency using the following URL:

https://github.com/Q42/MetalScope

License

MetalScope is released under the MIT license. See LICENSE for details.

About

Metal-backed 360° panorama view for iOS

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 100.0%