[SWIFT] Laden Sie ein 3D-Modell im usdz-Format in SceneKit und animieren Sie es

Ich werde Ihnen zeigen, wie Sie ein 3D-Modell im usdz-Format in SceneKit laden und animieren.

Ich habe auf diesen Artikel verwiesen, aber jetzt muss ich "ModelIO" nicht mehr verwenden, also schreibe ich ihn erneut. Laden Sie das 3D-Modell im USDZ-Format mit Model I / O und verwenden Sie es mit SceneKit

Verfahren

  1. Bereiten Sie ein 3D-Modell im usdz-Format vor Dieses Mal habe ich den Spielzeug-Schlagzeuger von [Apples offizieller Website] heruntergeladen (https://developer.apple.com/jp/augmented-reality/quick-look/).

  2. Erstellen Sie ein Spielprojekt aus der Xcode-Projekterstellung

  3. Ziehen Sie usdz-Dateien per Drag & Drop in Ihr Projekt

image.png

  1. Laden Sie das Modell

Ich werde es in viewDidLoad von GameViewController schreiben.

GameViewController.swift


override func viewDidLoad() {
    super.viewDidLoad()
    
    guard let url = Bundle.main.url(forResource: "toy_drummer", withExtension: "usdz") else { fatalError() }
    let scene = try! SCNScene(url: url, options: [.checkConsistency: true])

Wenn Sie die URL direkt an SCNScene übergeben, können Sie die usdz-Datei so wie sie ist laden.

  1. Animation steuern Zu diesem Zeitpunkt beginnt die in usdz enthaltene Animation zu spielen, und der Toy-Schlagzeuger beginnt, die Trommel zu spielen.

Lassen Sie uns nur die Bewegung des linken Arms stoppen.

Wenn Sie die usdz-Datei öffnen, sehen Sie, dass der linke Arm den Namen "arm_keft" trägt und eine Animation mit dem Namen "transform" enthält. image.png

Nehmen Sie es mit einem Code heraus.

GameViewController.swift


let drummer = scene.rootNode.childNode(withName: "toy_drummer", recursively: true)!

let armLeft = drummer.childNode(withName: "arm_left", recursively: true)
let player = armLeft?.animationPlayer(forKey: "transform")
player?.stop()

Ich erhalte den linken Armknoten vom toy_drummer-Knoten. Und ich bekomme die "Transform" -Animation und stoppe sie.

  1. Bewegen Sie den linken Arm beim Antippen

Früher hatten wir animationPlayer in einer lokalen Variablen, jetzt möchten wir ihn in einer Instanzvariablen speichern, damit er in Ereignishandlern verwendet werden kann.

GameViewController.swift


class GameViewController: UIViewController {
    var player: SCNAnimationPlayer?

Starten Sie im Event-Handler die Animation der Bewegung des linken Arms. Es ist notwendig, "addGestureRecognizer" aufzurufen, um den Ereignishandler zu registrieren, aber der Code, der beim Erstellen des Spielprojekts automatisch generiert wird, wird umgeleitet.

GameViewController.swift


@objc
func handleTap(_ gestureRecognize: UIGestureRecognizer) {
    player?.animation.repeatCount = 1
    player?.play()
}

Fertig

Der linke Arm wird beim Tippen animiert. Es gibt auch andere Animationen, aber dieses Mal können Sie sehen, dass sie sich in einer Schleife befinden, weil sie nicht gesteuert werden.

toy_drummer.gif

Wir senden Informationen zur Entwicklung von iOS-Anwendungen. Bitte folgen Sie mir, da es auch auf Twitter gepostet wird. https://twitter.com/jugemjugemjugem

Recommended Posts

Laden Sie ein 3D-Modell im usdz-Format in SceneKit und animieren Sie es
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java
21 Lesen Sie das Skript aus der Datei und führen Sie es aus
(Ruby on Rails6) Erstellen einer Datenbank und Anzeigen in einer Ansicht
Ich habe ein Routensuchprogramm in TDD geschrieben und versucht, es umzugestalten