6
votes

Comment diviser plusieurs animations de Collada File dans SceneKit

Je charge un fichier tiers .Dae Collada en tant que scène dans un projet Scenekit.

Le fichier .DAE a de nombreuses animations différentes, définies à différents moments / cadres. J'essaie de comprendre comment je peux les scinder et faire référence à chaque animation individuelle par nom de référence. Il n'y a pas de noms de référence intelligibles dans le fichier DAE - les animations sont toutes définies comme une seule animation.

Je suis capable d'analyser les animations dans un objet de caanimation et de vérifier que je l'ai fait avec succès avec succès. Le code suivant: xxx

existe-t-il un moyen de définir une trame de départ et de fin ou de temps à mon objet de caanimation? Quelle est la meilleure façon d'analyser les différentes animations? J'espère que je n'ai pas besoin de diviser manuellement le fichier DAE en plusieurs et de charger chacun individuellement.


6 commentaires

Hors de curiosité, que se passe-t-il si vous produisez - AnimationsKeys: ?


C'est en fait comment je suis venu pour savoir que l'animation s'appelait "Test_collada_dae-1" - c'est la seule chose qu'elle génère.


Je vois ... Savez-vous où les animations sont censées commencer / arrêter? Des images clés ou des percents?


Oui. Je connais des images clés et je pourrais probablement calculer les pourcentages si je dois, mais je ne peux pas comprendre dans l'animation de base comment spécifier une gamme de caractères clés pour animer - il anime toujours toute la séquence, y compris toutes les animations.


@itnaanti: Hé, je suis confronté à un problème similaire. Avez-vous pu trouver une solution?


@ Thex-codeur Malheureusement, non, je n'ai jamais trouvé une bonne solution. Cependant, je n'ai pas réexpédié la question dans plusieurs années. Il peut donc y avoir des solutions qui n'étaient pas disponibles lorsque je travaillais dessus (par exemple, Scenekit a eu des mises à jour depuis lors; je ne les connais pas assez bien pour être utiles .) Je n'ai également jamais essayé les solutions alternatives ci-dessous qui ont été ajoutées après que je suis passé. Cela vaut peut-être la peine d'essayer les 2 autres réponses non acceptées ci-dessous.


3 Réponses :


3
votes

Les outils 3D exportent souvent plusieurs animations comme une animation unique avec des sous-animations. Dans ce cas, Scenekit chargera ces animations en tant que groupe de caanimation avec des sous-animations. Donc, une option est de "analyser" les sous-animations du groupe d'animation et de récupérer ceux que vous souhaitez. Une autre option consiste à récupérer (sous) animations par nom à l'aide de SCNSEnessource (mais cela ne fonctionnera que si votre outil 3D exporté des noms lorsqu'il exportait votre DAE).

Si vous avez besoin d'une animation "Crop" (c'est-à-dire une animation qui commence à t0 avec durée D à partir d'une animation plus longue), Coreanimation a une API pour cela:

  • Créez un groupe d'animation à "Crop" avec durée d.

  • Ajoutez l'animation que vous souhaitez récolter en tant que sous-animation et définir c'est TimeOffset à T0.


2 commentaires

Merci! Je n'étais pas au courant de tout le protocole camediatuming. La propriété de la durée fonctionne parfaitement pour couper la queue du fichier de partout où je spécifie, mais je n'ai pas pu obtenir les propriétés de début ou de timeoffset pour couper la tête comme je le souhaiterais. Si je comprends bien votre commentaire correctement, ce n'est vraiment pas comment cela fonctionne, et je devrais avoir un fichier DAE que je voulais seulement la première animation de la séquence si je voulais essayer de "recadrer" l'animation. Est-ce exact? J'échège toujours vos autres suggestions.


J'ai trouvé ce ronnqvi.st/controlling-animation-timing article qui a une bonne direction de Le protocole Camediatiming, et précisément de la manière dont le délai-filoffset et le début du travail. Ni permettre de couper le début d'un fichier. Je retourne à l'aide de Blender pour diviser mon fichier .dae dans des fichiers individuels pour chaque animation. :(



2
votes

Comme Toyos mentionné dans sa réponse, énumérez le CaanimationGroup Code> à l'aide de SCNSCENESOURCE CODE> et récupérez les objets code> Caanimation CODE> comme suit:

NSURL *daeURL = [[NSBundle mainBundle] URLForResource:@"exportedFilename" withExtension:@"dae"];

SCNSceneSource *sceneSource = [SCNSceneSource sceneSourceWithURL:daeURL options:nil];

NSMutableArray *myAnimations = [@[] mutableCopy];

for (NSString *singleAnimationName in [sceneSource identifiersOfEntriesWithClass:[CAAnimation class]]) {
    CAAnimation *thisAnimation = [sceneSource entryWithIdentifier:singleAnimationName withClass:[CAAnimation class]];
    [myAnimations addObject:thisAnimation];
}


0 commentaires

2
votes

Voici le code qui convertit les numéros de trame en fois, puis ne joue que cette partie de l'animation à l'aide d'un caanimationgroup comme @toyos décrit. Ce code d'exemple joue une animation "inactive" en répétant des images 10 à 160 de Fullanimation : xxx


0 commentaires