Skip to content

Commit

Permalink
Simplify artwork.scn (#26)
Browse files Browse the repository at this point in the history
  • Loading branch information
jocmp committed Mar 17, 2024
1 parent b7fdb36 commit f6ef17a
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 57 deletions.
4 changes: 2 additions & 2 deletions ArtAtGVSU/ARAsset.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ extension ARAsset {
id: artwork.id,
referenceImage: artwork.mediaMedium,
video: artwork.arDigitalAsset,
models: artwork.ar3dModels
models: artwork.arTransform
)

let dirname = "ArtAtGvsu/\(artwork.id)"
Expand All @@ -49,7 +49,7 @@ extension ARAsset {

var models: [Model] = []

for model in artwork.ar3dModels {
for model in artwork.arTransform {
let n = await downloadFile(url: model.url, dirname: dirname)
models.append(Model(url: n, metadata: model.metadata))
}
Expand Down
12 changes: 6 additions & 6 deletions ArtAtGVSU/Artwork.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ struct Artwork: Equatable {
var mediaLarge: URL?
var thumbnail: URL?
var arDigitalAsset: URL?
var ar3dModels: [Model] = []
var arTransform: [Model] = []

static func == (lhs: Artwork, rhs: Artwork) -> Bool {
lhs.id == rhs.id
Expand Down Expand Up @@ -86,7 +86,7 @@ extension Artwork {
mediaMedium: optionalURL(objectDetail.media_medium_url),
mediaLarge: optionalURL(objectDetail.media_large_url),
arDigitalAsset: optionalURL(objectDetail.ar_digital_asset),
ar3dModels: self.getModel(file: objectDetail.ar_3d_file_usdz, matrix: objectDetail.ar_coordinates)
arTransform: getModel(file: objectDetail.ar_3d_file_usdz, matrix: objectDetail.ar_coordinates)
)
}

Expand All @@ -103,10 +103,10 @@ extension Artwork {
m = try mapToARCoordinates(String(matrix ?? ""))
if m.count == 16 {
t = SCNMatrix4(
m11:m[0],m12:m[1],m13:m[2],m14:m[3],
m21:m[4],m22:m[5],m23:m[6],m24:m[7],
m31:m[8],m32:m[9],m33:m[10],m34:m[11],
m41:m[12],m42:m[12],m43:m[14],m44:m[15]
m11: m[0], m12: m[1], m13: m[2], m14: m[3],
m21: m[4], m22: m[5], m23: m[6], m24: m[7],
m31: m[8], m32: m[9], m33: m[10], m34: m[11],
m41: m[12], m42: m[13], m43: m[14], m44: m[15]
)
}
} catch {
Expand Down
127 changes: 78 additions & 49 deletions ArtAtGVSU/Views/ARAssetViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,14 @@ class ARAssetViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet weak var sceneView: ARSCNView!
var arAsset: ARAsset!

var newReferenceImages: Set<ARReferenceImage> = Set<ARReferenceImage>()
var referenceImages: Set<ARReferenceImage> = Set<ARReferenceImage>()

var videoNode: SKVideoNode!
var videoPlayer: AVQueuePlayer!
var videoLooper: AVPlayerLooper?

var asset: MDLAsset?
var objNode: SCNNode?

let angle = CGFloat(10) * CGFloat.pi / 182.0
var artModel: SCNNode?

private var timer: Timer!

Expand All @@ -51,16 +49,16 @@ class ARAssetViewController: UIViewController, ARSCNViewDelegate {
}
}

self.newReferenceImages.insert(arImage)
self.referenceImages.insert(arImage)

self.runImageTrackingSession(with: self.newReferenceImages, runOptions: [.resetTracking, .removeExistingAnchors])
self.runImageTrackingSession(with: self.referenceImages, runOptions: [.resetTracking, .removeExistingAnchors])
}
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)

runImageTrackingSession(with: self.newReferenceImages)
runImageTrackingSession(with: self.referenceImages)
}

func loadImageFrom(completionHandler: @escaping(UIImage)->()) {
Expand All @@ -75,6 +73,31 @@ class ARAssetViewController: UIViewController, ARSCNViewDelegate {
}
}

func placeForegroundObject(_ imageAnchor: ARImageAnchor, _ node: SCNNode) {
guard let modelParent = sceneContainer?.childNode(withName: "model", recursively: true) else {
return
}

guard let arModel = self.arAsset.models.first else {
return
}

guard let model = try? SCNScene(url: arModel.url, options: [.checkConsistency: true]).rootNode.childNodes.first else {
return
}

modelParent.addChildNode(model)
modelParent.geometry?.firstMaterial?.lightingModel = .physicallyBased

self.artModel = modelParent

if let transform = arModel.metadata.transform {
modelParent.transform = transform
}

modelParent.isHidden = false
}

// MARK: - ImageTrackingSession
private func runImageTrackingSession(with trackingImages: Set<ARReferenceImage>,
runOptions: ARSession.RunOptions = [.removeExistingAnchors]) {
Expand All @@ -88,7 +111,7 @@ class ARAssetViewController: UIViewController, ARSCNViewDelegate {
if self.timer != nil {
timer.invalidate()
}
self.objNode = nil
self.artModel = nil

self.dismiss(animated: true)
}
Expand All @@ -104,64 +127,35 @@ class ARAssetViewController: UIViewController, ARSCNViewDelegate {
}

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard anchor is ARImageAnchor else { return }

guard let referenceImage = ((anchor as? ARImageAnchor)?.referenceImage) else { return }

guard let container = sceneView.scene.rootNode.childNode(withName: "container", recursively: true) else {
guard let container = sceneContainer else {
return
}

container.removeFromParentNode()
node.addChildNode(container)
container.isHidden = false

let asset = AVAsset(url: arAsset!.video!)
let item = AVPlayerItem(asset: asset)
videoPlayer = AVQueuePlayer(playerItem: item)
videoLooper = AVPlayerLooper(player: videoPlayer, templateItem: item)

let videoScene = SKScene(size: CGSize(width: 720.0, height: 1280.0))
videoNode = SKVideoNode(avPlayer: videoPlayer)

videoNode.position = CGPoint(x: videoScene.size.width/2, y: videoScene.size.height/2)
videoNode.size = videoScene.size
videoNode.yScale = -1
videoNode.play()
videoScene.addChild(videoNode)

guard let video = container.childNode(withName: "video", recursively: true) else { return }
video.geometry?.firstMaterial?.diffuse.contents = videoScene
video.geometry?.firstMaterial?.shininess = 0
video.geometry?.materials.first?.diffuse.intensity = 1
video.geometry?.materials.first?.lightingModel = .phong

video.scale = SCNVector3(x: Float(referenceImage.physicalSize.width), y: Float(referenceImage.physicalSize.height), z: 1.0)

video.position = node.position

guard let videoContainer = container.childNode(withName: "videoContainer", recursively: false) else { return }
videoContainer.geometry?.firstMaterial?.shininess = 0
guard let imageAnchor = anchor as? ARImageAnchor else {
return
}

videoContainer.runAction(SCNAction.sequence([SCNAction.wait(duration: 1.0), SCNAction.scale(to: 1.0, duration: 0.5)]))
placeLivingPainting(imageAnchor, node)
DispatchQueue.main.async {
self.placeForegroundObject(imageAnchor, node)
}
}

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = (anchor as? ARImageAnchor) else { return }

if self.objNode != nil {
self.objNode?.scale = SCNVector3(1, -1, -1)
self.objNode?.position = SCNVector3(node.position.x, node.position.y, node.position.z)
self.objNode?.rotation = node.rotation
guard let imageAnchor = anchor as? ARImageAnchor else {
return
}


if imageAnchor.isTracked {
if videoNode != nil {
videoNode.play()
}

self.objNode?.isHidden = false
self.artModel?.isHidden = false

if self.timer != nil {
timer.invalidate()
Expand All @@ -173,9 +167,44 @@ class ARAssetViewController: UIViewController, ARSCNViewDelegate {

DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(withTimeInterval: 40, repeats: false) { timer in
self.objNode?.isHidden = true
self.artModel?.isHidden = true
}
}
}
}

private func placeLivingPainting(_ imageAnchor: ARImageAnchor, _ node: SCNNode) {
guard let video = sceneContainer?.childNode(withName: "video", recursively: true) else {
return
}

let referenceImage = imageAnchor.referenceImage
guard let assetVideo = arAsset?.video else {
return
}

let asset = AVAsset(url: assetVideo)
let playerItem = AVPlayerItem(asset: asset)
videoPlayer = AVQueuePlayer(playerItem: playerItem)
videoLooper = AVPlayerLooper(player: videoPlayer, templateItem: playerItem)
videoNode = SKVideoNode(avPlayer: videoPlayer)

let videoScene = SKScene(size: CGSize(width: 720.0, height: 1280.0))
videoNode.position = CGPoint(x: videoScene.size.width / 2, y: videoScene.size.height / 2)
videoNode.size = videoScene.size
videoNode.play()
videoScene.addChild(videoNode)

video.geometry?.firstMaterial?.diffuse.contents = videoScene
video.geometry?.firstMaterial?.shininess = 0
video.geometry?.materials.first?.diffuse.intensity = 1
video.geometry?.materials.first?.lightingModel = .phong
video.scale = SCNVector3(x: Float(referenceImage.physicalSize.width), y: Float(referenceImage.physicalSize.height), z: 1.0)
video.position = node.position
video.isHidden = false
}

var sceneContainer: SCNNode? {
sceneView.scene.rootNode.childNode(withName: "container", recursively: true)
}
}
Binary file modified ArtAtGVSU/art.scnassets/artwork.scn
Binary file not shown.

0 comments on commit f6ef17a

Please sign in to comment.