[SWIFT] Utilisez SCNIK Constraint pour animer librement le bras du robot

Il existe plusieurs options pour animer un modèle 3D avec SceneKit, mais si vous souhaitez animer les bras et les jambes d'un modèle 3D à volonté, je pense que les options seront SCNIKConstraint ou SCN Animation.

<Méthode d'animation> --SCNTransaction: animez la scène entière en une seule fois en utilisant la rotation et le mouvement des nœuds --SCNAction ・ ・ ・ Animer des nœuds individuels en utilisant la rotation et le mouvement des nœuds --SCNIKConstraint ・ ・ ・ Déplacez-vous comme une marionnette en utilisant des os connectés --SCNAnimation ・ ・ ・ Exécuter une animation prédéfinie

Cet article est détaillé sur les différences entre eux.

Comment utiliser et utiliser l'animation dans SceneKit

L'animation SCN peut être utilisée librement si elle est définie à l'avance, mais la contrainte SCNIK convient lorsque vous souhaitez utiliser de manière interactive la vitesse et la quantité de mouvement de l'animation.

Alors, je vais vous expliquer comment animer librement le bras du robot avec SCNIK Constraint.

Qu'est-ce que SCNIKConstraint?

Le CI de SCNIKConstraint est appelé Cinématique inverse.

Je vais citer cet article car il était facile à comprendre. Note de mise en œuvre de la cinématique inverse

IK est une action qui fait aller les choses connectées à un certain point de sorte que le corps bouge en conjonction avec les mains, les poignets, les bras et les épaules, comme lorsqu'un humain atteint un certain endroit. dire.

SCNIKConstraint est un mécanisme qui vous permet d'appliquer ce CI aux nœuds SceneKit.

référence: Officiel Apple: SCNIK Constraint

procédure

Cette fois, nous allons créer une animation dans laquelle le bras gauche du robot se déplace en fonction de la quantité de traînée.

** Préparez un modèle 1.3D **

Le modèle 3D doit avoir des paramètres d'os. Cette fois, nous utiliserons le modèle existant.

Un modèle 3D du robot (nom de fichier: robot.usdz) est inclus dans l'exemple de projet ARKit d'Apple, alors utilisez-le.

Capturing Body Motion in 3D

Dans cet article, il y avait un exemple de fabrication avec un outil de modélisation.

[SceneKit] Comment utiliser la contrainte SCNIK

** 2. Créez un projet de jeu à partir de la création de projet Xcode **

** 3. Glissez et déposez les fichiers usdz sur votre projet **

Consultez cet article pour savoir comment charger un modèle 3D au format usdz dans SceneKit.

Chargez un modèle 3D au format usdz dans SceneKit et animez-le

** 4. Détecter lorsque l'écran est déplacé **

Enregistrez UIPanGestureRecognizer avec viewDidLoad.

GameViewController.swift


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

** 5. Déterminez les deux joints qui seront le point de départ et le point d'arrivée **

Tout en vérifiant les informations d'os du modèle avec Xcode, déterminez les deux articulations qui seront le point de départ et le point de fin (la pièce qui se déplace réellement). Cette fois, j'ai déplacé la main gauche comme point de départ et la main gauche comme point d'arrivée.

image.png

Si vous ne choisissez pas correctement les deux articulations, elles ne bougeront pas ou se comporteront étrangement.

Par exemple, si je choisissais deux points, la taille et la main gauche, cela ressemblerait à John Travolta de Saturday Night Fever.

** 6.Faites bouger le bras du robot lorsqu'il est traîné **

Obtenez la quantité de mouvement de traînée et déterminez la destination du bras du robot en fonction de celle-ci.

GameViewController.swift


@objc
func handleDrag(_ gestureRecognize: UIPanGestureRecognizer) {
    //Obtenez le point de départ de l'animation (ici, l'épaule du bras gauche)
    guard let root = scene.rootNode.childNode(withName: "left_shoulder_1_joint", recursively: true) else { return }
    //Trouvez l'endroit pour bouger (ici, la main du bras gauche)
    guard let target = scene.rootNode.childNode(withName: "left_hand_joint", recursively: true) else { return }

    //Spécifiez le point de départ et l'emplacement à déplacer vers SCNIKConstraint
    let ik:SCNIKConstraint = SCNIKConstraint.inverseKinematicsConstraint(chainRootNode: root)
    target.constraints = [ik]

    //Déterminez la quantité de mouvement du bras du robot à partir de la quantité de mouvement de traînée
    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)

    //Bouge ton bras
    ik.targetPosition = targetPosition
}

terminer

20201003qiita用.gif

Nous envoyons des informations sur le développement d'applications iOS. Veuillez me suivre car il est également publié sur Twitter. https://twitter.com/jugemjugemjugem

Recommended Posts

Utilisez SCNIK Constraint pour animer librement le bras du robot
Comment utiliser la méthode link_to
Comment utiliser la méthode include?
Comment utiliser la méthode form_with
Comment utiliser la classe wrapper
[Java] Comment utiliser la classe File
[Rails] Comment utiliser la méthode de la carte
Etudier comment utiliser le constructeur (java)
[Traitement × Java] Comment utiliser la boucle
[Traitement × Java] Comment utiliser la classe
[Traitement × Java] Comment utiliser la fonction
[Java] Comment utiliser la classe Calendar
Comment utiliser le module caméra OV7725 (ESP32-WROVER-B)
Lorsque vous souhaitez utiliser la méthode à l'extérieur
Sortie de la façon d'utiliser la méthode slice
Comment utiliser la méthode replace () (Java Silver)
[Introduction à Ruby] Comment utiliser la méthode slice