[SWIFT] Verwenden Sie die SCNIK-Einschränkung, um den Arm des Roboters frei zu animieren

Es gibt verschiedene Optionen zum Animieren eines 3D-Modells mit SceneKit. Wenn Sie jedoch die Arme und Beine eines 3D-Modells nach Belieben animieren möchten, sind die Optionen SCNIKConstraint oder SCN Animation.

--SCNTransaction: Animieren Sie die gesamte Szene auf einmal mithilfe der Drehung und Bewegung von Knoten --SCNAction ・ ・ ・ Animieren Sie einzelne Knoten mithilfe von Knotenrotation und -bewegung --SCNIKConstraint ・ ・ ・ Bewegen Sie sich wie eine Marionette mit verbundenen Knochen --SCNAnimation ・ ・ ・ Führen Sie eine voreingestellte Animation aus

Dieser Artikel beschreibt die Unterschiede zwischen ihnen.

Wie man eine Animation in SceneKit ausführt und wie man sie richtig verwendet

SCN Animation kann frei betrieben werden, wenn dies im Voraus definiert wurde. SCNIK Constraint eignet sich jedoch, wenn Sie die Geschwindigkeit und den Bewegungsumfang der Animation interaktiv bedienen möchten.

Daher werde ich erklären, wie der Arm des Roboters mit SCNIK Constraint frei animiert werden kann.

Was ist SCNIKConstraint?

Die IK von SCNIKConstraint heißt Inverse Kinematics.

Ich werde diesen Artikel zitieren, weil er leicht zu verstehen war. Implementierungshinweis zur inversen Kinematik

IK ist eine Aktion, bei der die verbundenen Dinge zu einem bestimmten Punkt gelangen, sodass sich der Körper in Verbindung mit Händen, Handgelenken, Armen und Schultern bewegt, wie wenn ein Mensch nach einem bestimmten Ort greift. sagen.

SCNIKConstraint ist ein Mechanismus, mit dem Sie diese IK auf SceneKit-Knoten anwenden können.

Referenz: Apple Official: SCNIK Constraint

Verfahren

Dieses Mal erstellen wir eine Animation, in der sich der linke Arm des Roboters entsprechend dem Luftwiderstand bewegt.

** Bereiten Sie ein 1.3D-Modell vor **

Das 3D-Modell muss Knocheneinstellungen haben. Dieses Mal werden wir das vorhandene Modell verwenden.

Ein 3D-Modell des Roboters (Dateiname: robot.usdz) ist in Apples ARKit-Beispielprojekt enthalten. Verwenden Sie dieses Modell.

Capturing Body Motion in 3D

In diesem Artikel gab es ein Beispiel für das Erstellen mit einem Modellierungswerkzeug.

[SceneKit] Verwendung der SCNIK-Einschränkung

** 2. Erstellen Sie ein Spielprojekt aus der Xcode-Projekterstellung **

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

In diesem Artikel erfahren Sie, wie Sie ein 3D-Modell im usdz-Format in SceneKit laden.

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

** 4. Erkennen, wann der Bildschirm gezogen wird **

Registrieren Sie UIPanGestureRecognizer bei viewDidLoad.

GameViewController.swift


let tapGesture = UIPanGestureRecognizer(target: self, action: #selector(handleDrag(_:)))
scnView.addGestureRecognizer(tapGesture)

** 5. Bestimmen Sie die beiden Gelenke, die der Startpunkt und der Endpunkt sein sollen **

Bestimmen Sie beim Überprüfen der Knocheninformationen des Modells mit Xcode die beiden Gelenke, die der Startpunkt und der Endpunkt sind (der Teil, der sich tatsächlich bewegt). Dieses Mal habe ich die linke Hand als Startpunkt und die linke Hand als Endpunkt bewegt.

image.png

Wenn Sie die beiden Gelenke nicht richtig auswählen, bewegen sie sich entweder nicht oder verhalten sich seltsam.

Wenn ich zum Beispiel zwei Punkte wählen würde, die Taille und die linke Hand, würde es wie John Travolta von Saturday Night Fever aussehen.

** 6. Bewegen Sie den Arm des Roboters beim Ziehen **

Ermitteln Sie das Ausmaß der Widerstandsbewegung und bestimmen Sie anhand dieser das Ziel des Roboterarms.

GameViewController.swift


@objc
func handleDrag(_ gestureRecognize: UIPanGestureRecognizer) {
    //Holen Sie sich den Startpunkt der Animation (hier die Schulter des linken Arms)
    guard let root = scene.rootNode.childNode(withName: "left_shoulder_1_joint", recursively: true) else { return }
    //Holen Sie sich den Ort, um sich tatsächlich zu bewegen (hier die linke Armhand)
    guard let target = scene.rootNode.childNode(withName: "left_hand_joint", recursively: true) else { return }

    //Geben Sie den Startpunkt und den Ort an, an dem Sie zu SCNIKConstraint wechseln möchten
    let ik:SCNIKConstraint = SCNIKConstraint.inverseKinematicsConstraint(chainRootNode: root)
    target.constraints = [ik]

    //Bestimmen Sie das Ausmaß der Bewegung des Roboterarms aus dem Ausmaß der Widerstandsbewegung
    let move = gestureRecognize.translation(in: view)
    let targetPosition = SCNVector3(target.position.x + Float(move.x * 0.1), target.position.y + Float(move.y * 0.1 * -1), target.position.z)

    //Bewege deinen Arm
    ik.targetPosition = targetPosition
}

Fertig

20201003qiita用.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

Verwenden Sie die SCNIK-Einschränkung, um den Arm des Roboters frei zu animieren
Verwendung der link_to-Methode
Verwendung der include? -Methode
Verwendung der Methode form_with
Verwendung der Wrapper-Klasse
[Java] Verwendung der File-Klasse
[Schienen] Verwendung der Kartenmethode
Studieren der Verwendung des Konstruktors (Java)
[Verarbeitung × Java] Verwendung der Schleife
[Verarbeitung × Java] Verwendung der Klasse
[Verarbeitung × Java] Verwendung der Funktion
[Java] Verwendung der Calendar-Klasse
Verwendung des Kameramoduls OV7725 (ESP32-WROVER-B)
Wenn Sie die Methode außerhalb verwenden möchten
Ausgabe der Verwendung der Slice-Methode
Verwendung der replace () -Methode (Java Silver)
[Ruby-Grundlagen] Verwendung der Slice-Methode