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.
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
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.
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.
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
}
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