问题描述
我正在开发一个应用程序,我想添加一个“欢迎!”屏幕上带有一个将用户带到AR会话的按钮。通常,在第一个View Controller上设置AR会话。添加提示用户进入AR会话的屏幕(而不是启动屏幕)的最佳方法是什么? 我尝试创建一个新的ViewController并将代码包含在现有代码之前,但这对我不起作用。我从来没有真正做过这样的屏幕更换,所以任何建议都将不胜感激!
import UIKit
import RealityKit
import ARKit
class ViewController: UIViewController,ARSessionDelegate {
//delay app launch to show splash screen
func application(_ application: UIApplication,didFinishLaunchingWithOptions
launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Thread.sleep(forTimeInterval: 3.0)
// Override point for customization after application launch.
return true
}
//end splash screen delay
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
arView.session.delegate = self
showModel()
overlayCoachingView()
setupARView()
arView.addGestureRecognizer(UITapGestureRecognizer(target: self,action: #selector(handleTap(recognizer:))))
}
func showModel(){
let anchorEntity = AnchorEntity(plane: .horizontal,minimumBounds:[0.7,0.7])
anchorEntity.scale = [0.2,0.2,0.2]
let entity = try! Entity.loadModel(named: "COW_ANIMATIONS")
entity.setParent(anchorEntity)
arView.scene.addAnchor(anchorEntity)
}
//Overlay coaching view "adjust iphone scan"
func overlayCoachingView () {
let coachingView = ARCoachingOverlayView(frame: CGRect(x: 0,y: 0,width:
arView.frame.width,height: arView.frame.height))
coachingView.session = arView.session
coachingView.activatesAutomatically = true
coachingView.goal = .horizontalPlane
view.addSubview(coachingView)
}//end overlay
func setupARView(){
arView.automaticallyConfigureSession = false
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal,.vertical]
configuration.environmenttexturing = .automatic
arView.session.run(configuration)
}
//object placement
@objc
func handleTap(recognizer: UITapGestureRecognizer){
let location = recognizer.location(in:arView)
let results = arView.raycast(from: location,allowing: .estimatedplane,alignment: .horizontal)
if let firstResult = results.first {
let brownCowAnchor = aranchor(name: "COW_ANIMATIONS",transform: firstResult.worldTransform)
arView.session.add(anchor: brownCowAnchor)
} else {
print("Object placement Failed - Couldn't find surface.")
//cow animations
//let robot = try! ModelEntity.load(named: "COW_ANIMATIONS")
let brownCowAnchor = AnchorEntity()
let blackCowAnchor = AnchorEntity()
//anchor.children.append(robot)
//arView.scene.anchors.append(anchor)
//robot.playAnimation(robot.availableAnimations[0].repeat(duration: .infinity),//transitionDuration: 0.5,//startsPaused: false)
//start cow animation
let brownCow = try! ModelEntity.load(named: "COW_ANIMATIONS")
let blackCow = try! ModelEntity.load(named: "Cow")
brownCow.position.x = -1.0
blackCow.position.x = 1.0
brownCowAnchor.position.z = -2.0
blackCowAnchor.position.z = -2.0
brownCow.setParent(brownCowAnchor)
blackCow.setParent(blackCowAnchor)
arView.scene.anchors.append(brownCowAnchor)
arView.scene.anchors.append(blackCowAnchor)
let cowAnimationResource = brownCow.availableAnimations[0]
let horseAnimationResource = blackCow.availableAnimations[0]
brownCow.playAnimation(cowAnimationResource.repeat(duration: .infinity),transitionDuration: 1.25,startsPaused: false)
blackCow.playAnimation(horseAnimationResource.repeat(duration: .infinity),transitionDuration: 0.75,startsPaused: false)
//end cow animations
}
}
func placeObject(named entityName: String,for anchor: aranchor) {
let entity = try! ModelEntity.loadModel(named: entityName)
entity.generateCollisionShapes(recursive: true)
arView.installGestures([.rotation,.translation],for: entity)
let anchorEntity = AnchorEntity(anchor: anchor)
anchorEntity.addChild(entity)
arView.scene.addAnchor(anchorEntity)
}
}
解决方法
然后,为欢迎屏幕创建一个新的UIViewController
类。
class WelcomeViewController: UIViewController {
}
然后,在情节提要板中,将欢迎视图控制器设置为WelcomeViewController
类。
通过WelcomeViewController
将“让我们去”按钮连接到@IBAction
。
在@IBAction
内,执行以下操作:
@IBAction func goPressed(_ sender: Any) {
let storyboard = UIStoryboard(name: "Main",bundle: nil)
if let viewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as? ViewController {
self.present(viewController,animated: true,completion: nil) /// present the view controller (the one with the ARKit)!
}
}
然后,返回情节提要,并将Storyboard ID
设置为主视图控制器(带有ARSCNView
的视图控制器)为ViewController
:
就是这样!