📋 Plan du Cours
- Taille des joints
- Modification orientation joints
- Code MEL joint
- Code Python rotateOrder
- Segment Scale Compensate
- Contrôles de connexion
- Contrôles d'attributs
- Liaison shapes MEL
- Affichage contrôleur
- Navigation contrôleur
📖 1. Taille des joints
🔑 Notions clés & Définitions
-
Global Joint Size (Display -> Animation -> Joint Size) : réglage de la taille des joints dans l'interface de Maya, impactant leur visibilité lors de l'animation. Une taille adaptée facilite la sélection et la manipulation des joints sans encombrer la scène.
-
Segment Scale Compensate : option permettant d'étirer ou de compenser la longueur d’un membre lors du scaling, évitant la déformation indésirable du rig. Selon PERROUX (date), cette fonction est essentielle pour maintenir la cohérence du modèle lors des ajustements de taille.
-
Rotate Order (cmds.setAttr avec valeur 0, 1, 2, etc.) : ordre dans lequel les rotations sont appliquées sur un joint, influençant la manière dont il tourne et s'articule. La modification de cette valeur doit être cohérente avec la hiérarchie pour éviter les comportements inattendus.
📝 Points essentiels
-
La taille des joints peut être ajustée via le menu Display -> Animation -> Joint Size, ce qui influence directement leur visibilité en mode animation. Une taille trop petite ou trop grande peut compliquer la sélection ou masquer d’autres éléments.
-
La fonction Segment Scale Compensate doit être activée ou désactivée selon le besoin pour éviter la déformation lors du scaling. Elle est particulièrement utile pour les membres extensibles ou lors de la création de rigs complexes.
-
La modification manuelle de l’orientation des joints se fait via Select By Component Type, en activant "Select point Components", puis en ajustant avec Local Rotate Axis. Après modification, il est conseillé de remettre à zéro le Rotate Axis avec la commande MEL "joint -e -zso" pour éviter des incohérences.
-
La gestion du Rotate Order en Python (exemple : cmds.setAttr(joint + ".rotateOrder", 0)) permet d’optimiser la rotation selon la hiérarchie et la logique du rig, évitant des comportements erratiques lors de l’animation.
-
La liaison de shapes via la commande MEL "parent -s -r" permet de fusionner plusieurs shapes dans un seul contrôleur, facilitant la gestion visuelle.
-
La visibilité du contrôleur peut être conditionnée à la proximité de la souris grâce à l’option Show on mouse proximity dans le Tag As Controller, ce qui améliore la navigation dans la scène.
-
La navigation entre contrôleurs parent et enfant se fait via Parent Controller, avec les flèches up/down, pour une gestion hiérarchique fluide lors de l’animation.
💡 À retenir
La taille des joints, ajustée via Display -> Animation -> Joint Size, est cruciale pour une visibilité optimale en animation. La gestion du Segment Scale Compensate et du Rotate Order permet d’assurer la cohérence et la précision du rig, facilitant le travail de l’animateur.
📖 2. Modification orientation joints
🔑 Notions clés & Définitions
- Modifier Orientation Joints Manuellement : Technique consistant à ajuster l'orientation d’un joint en utilisant la commande Select By Component Type, en activant Select point Components et en manipulant les axes via Local Rotate Axis pour une orientation précise.
- Select point Components : Option permettant de sélectionner individuellement les axes d’un joint pour en modifier l’orientation.
- Local Rotate Axis : Outil permettant de modifier l’orientation locale du joint en ajustant ses axes de rotation, facilitant la pose manuelle.
- joint -e -zso (Code MEL) : Script permettant de remettre à zéro les valeurs du Rotate Axis d’un joint après modification manuelle, évitant des incohérences dans la rotation.
- Rotate Order (en Python) : Attribut définissant l’ordre de rotation des axes d’un joint, modifiable via cmds.setAttr (ex : valeur 0 pour un ordre spécifique).
- Segment Scale Compensate : Fonction qui permet d’étirer un membre sans déformer la géométrie, en compensant la mise à l’échelle du segment.
📝 Points essentiels
- La modification manuelle de l’orientation des joints se fait en sélectionnant Select By Component Type, puis en activant Select point Components pour choisir les axes.
- L’outil Local Rotate Axis permet d’ajuster précisément l’orientation locale du joint, ce qui est crucial pour un rigging cohérent.
- Après modification manuelle, il est nécessaire d’exécuter le script MEL joint -e -zso pour remettre à zéro le Rotate Axis, évitant ainsi des décalages ou incohérences lors de l’animation.
- La propriété Rotate Order influence la façon dont les rotations s’appliquent, et peut être modifiée en Python via cmds.setAttr pour adapter la rotation aux besoins du rig.
- La fonction Segment Scale Compensate est essentielle pour étirer un membre sans déformer la géométrie, notamment pour des membres extensibles.
- La gestion des contraintes (Parent, Point, Orient, Scale, Aim) permet de contrôler précisément la transformation des joints selon le contexte (translation, rotation, orientation, etc.).
💡 À retenir
La modification manuelle de l’orientation des joints, combinée à l’utilisation de Local Rotate Axis et du script MEL joint -e -zso, permet un contrôle précis et cohérent de la pose, essentielle pour un rigging efficace et une animation fluide.
📖 3. Code MEL joint
🔑 Notions clés & Définitions
- Commande MEL "joint -e -zso" : Permet de remettre à zéro les valeurs du Rotate Axis d’un joint après une modification manuelle de son orientation, en réinitialisant ses axes de rotation sans affecter sa position ou sa rotation globale.
- Différence entre rotation et translation dans Rotate Axis : La rotation dans Rotate Axis concerne l’orientation locale du joint, tandis que la translation concerne sa position dans l’espace. La valeur de rotation est modifiable indépendamment de la translation, ce qui permet d’ajuster précisément l’orientation locale du joint.
- Utilisation du code MEL pour réinitialiser l’orientation des joints : La commande "joint -e -zso" est utilisée pour réinitialiser l’orientation locale des joints, notamment après une modification manuelle des axes, afin d’assurer une cohérence dans la hiérarchie de rigging.
- AUTEUR (date) : Aucune référence spécifique à un auteur ou date dans le contenu source.
📝 Points essentiels
💡 À retenir
La commande MEL "joint -e -zso" est indispensable pour réinitialiser rapidement l’orientation locale des joints après une modification manuelle, garantissant ainsi une hiérarchie cohérente et un rigging précis. La maîtrise de cette commande, associée à la compréhension des différences entre rotation et translation dans Rotate Axis, est essentielle pour un rigging efficace.
📖 4. Code Python rotateOrder
🔑 Notions clés & Définitions
- cmds.ls(type='joint') (Python, Maya) : Fonction qui liste tous les joints présents dans la scène en renvoyant une liste d'objets de type joint.
- cmds.setAttr (Python, Maya) : Fonction permettant de modifier la valeur d’un attribut spécifique d’un objet, ici utilisé pour changer la propriété rotateOrder d’un joint.
- rotateOrder (Maya) : Attribut numérique qui définit l’ordre de rotation appliqué au joint, influençant la manière dont ses rotations sont combinées.
- Valeurs numériques du rotateOrder (Maya) : Correspondent à différents ordres de rotation, par exemple 0 pour XYZ, 1 pour YZX, etc., permettant de choisir la séquence de rotation préférée.
📝 Points essentiels
- La commande
cmds.ls(type='joint') permet d’obtenir la liste de tous les joints dans la scène, facilitant leur modification en masse.
- La boucle
for joint in jointList: permet d’appliquer une modification uniforme à tous les joints listés, ici pour changer leur rotateOrder.
- La fonction
cmds.setAttr(joint + ".rotateOrder", 0) modifie l’attribut rotateOrder de chaque joint, la valeur 0 correspondant à un ordre spécifique (XYZ).
- La valeur numérique du
rotateOrder doit être choisie selon l’ordre de rotation souhaité, par exemple :
- 0 : XYZ
- 1 : YZX
- 2 : ZXY
- 3 : XZY
- 4 : YXZ
- 5 : ZYX
- Modifier le
rotateOrder est crucial pour éviter les problèmes d’animation liés à la gimbal lock ou pour simplifier la manipulation des joints.
- La modification manuelle de l’orientation des joints via Local Rotate Axis (activation de "Select point Components") et la commande MEL
joint -e -zso permet de remettre à zéro cette orientation, facilitant la gestion des rotations.
💡 À retenir
Le script Python permet de modifier rapidement l’ordre de rotation de tous les joints d’une scène en utilisant cmds.ls pour la sélection et cmds.setAttr pour l’application, ce qui est essentiel pour optimiser le rigging et l’animation.
📖 5. Segment Scale Compensate
🔑 Notions clés & Définitions
- Segment Scale Compensate : Fonction qui permet d'étirer ou de compenser la longueur d'un membre dans un rig, en ajustant le scale des segments pour maintenir une longueur visuelle constante lors de l'animation.
- Importance dans le rigging : Essentielle pour créer des membres extensibles ou adaptatifs, notamment pour des bras ou jambes qui doivent s'étirer sans déformer la géométrie ou l'animation (voir PERROUX, 2000).
- Activation/Désactivation : Peut être activé ou désactivé pour contrôler si la compensation de la longueur du segment est appliquée ou non, permettant une flexibilité dans la gestion du rig.
📝 Points essentiels
- La fonction Segment Scale Compensate intervient principalement pour étirer un membre tout en conservant une apparence réaliste, en ajustant le scale le long de l'axe du segment.
- Lorsqu'un membre doit s'étirer, il faut activer cette fonction pour éviter la déformation du maillage ou des contrôleurs, en maintenant la longueur visuelle constante.
- La désactivation permet de revenir à un comportement classique où le scale n'est pas modifié, utile pour des mouvements naturels ou pour des effets spécifiques.
- La gestion de cette fonction se fait via l'option dans l'interface ou par script, notamment en utilisant la commande MEL ou Python pour activer/désactiver le "Segment Scale Compensate".
- La connexion entre contrôleurs et joints peut être gérée via le Connection Editor ou le Component Editor pour une meilleure organisation et contrôle.
- La valeur de Segment Scale Compensate influence directement la façon dont le membre s'étire ou se contracte lors des animations, impactant la fluidité et la crédibilité du mouvement.
💡 À retenir
Le Segment Scale Compensate est une fonction clé pour créer des membres extensibles dans le rigging, permettant de maintenir une apparence cohérente lors de l'étirement ou de la contraction, tout en offrant une flexibilité essentielle pour l'animation. Son activation ou désactivation doit être maîtrisée pour optimiser le comportement du rig.
📖 6. Contrôles de connexion
🔑 Notions clés & Définitions
- Connection Editor : Outil permettant de gérer graphiquement et de manière centralisée les connexions entre différents nœuds ou attributs dans Maya, facilitant la création et la modification des relations de contrôle (voir rappel).
- Component Editor : Outil pour éditer directement les composants (points, axes) d’un objet ou d’un contrôleur, permettant de sélectionner et de modifier précisément ses composants (voir rappel).
- Contrainte Parent : Contrôle la translation et la rotation d’un joint ou d’un contrôleur en maintenant une relation hiérarchique, permettant de faire suivre un objet par un autre (voir rappel).
- Contrôle Aim : Contrainte orientée vers un vecteur cible, utilisée pour faire pointer un contrôleur ou un joint dans une direction spécifique, souvent pour orienter la tête ou un bras (voir rappel).
- Parent -s -r (MEL) : Script MEL utilisé pour lier les shapes de deux objets, permettant de fusionner plusieurs formes en un seul contrôleur avec plusieurs shapes (voir source).
📝 Points essentiels
- La gestion des connexions dans Maya s’effectue principalement via le Connection Editor, qui permet de visualiser et de modifier les connexions entre attributs de différents nœuds, facilitant la gestion des relations complexes.
- Le Component Editor est essentiel pour éditer précisément les composants d’un contrôleur, notamment lors de la modification manuelle de l’orientation des joints ou des contrôleurs.
- Les contraintes jouent un rôle clé dans le contrôle de la hiérarchie et des relations entre éléments :
- Parent contrôle la translation et la rotation,
- Point contrôle uniquement la translation,
- Orient contrôle uniquement l’orientation,
- Scale contrôle le scale, utile pour des membres extensibles,
- Aim oriente un contrôleur ou un joint vers une cible spécifique en utilisant un vecteur d’orientation.
- Lorsqu’un groupe (ex : Grp_C) est aligné à sa transformation, il est conseillé de Lock et Hide ses attributs pour éviter toute modification accidentelle.
- La commande MEL "joint -e -zso" permet de remettre à zéro le Rotate Axis d’un joint, essentiel après une modification manuelle pour assurer une orientation cohérente.
- La modification du rotateOrder en Python via cmds.setAttr permet de changer l’ordre de rotation des joints, ce qui influence leur comportement lors de l’animation.
💡 À retenir
Les contrôles de connexion dans Maya, via le Connection Editor et les contraintes, permettent une gestion précise et flexible des relations entre éléments, facilitant la création de rigs complexes et intuitifs pour l’animation.
📖 7. Contrôles d'attributs
🔑 Notions clés & Définitions
- Add Attribute : Fonction permettant d'ajouter des attributs personnalisés à un objet pour enrichir ses options ou ses contrôles.
- Boolean (dans Add Attribute) : Attribut à deux états (True / False) utilisé pour activer ou désactiver une option.
- Enum : Attribut qui propose une liste d'options prédéfinies, facilitant la sélection parmi plusieurs choix.
- Message : Type d'attribut permettant de créer des connexions ou relations entre nodes, facilitant la gestion des dépendances.
- Contrôles d'attributs (dans le contexte) : Permettent de gérer la visibilité, l'interactivité et la logique des contrôleurs via des attributs personnalisés.
📝 Points essentiels
- La gestion des contrôles d'attributs se fait souvent via la commande Add Attribute, qui permet d'ajouter des options variées comme Boolean, Enum, ou Message pour enrichir la contrôlabilité d’un rig.
- Les attributs de type Boolean sont couramment utilisés pour activer/désactiver des options ou des contrôles, notamment avec la fonction Lock and Hide pour verrouiller ou masquer les attributs non nécessaires.
- Les attributs de type Enum facilitent la sélection d’options dans une liste, notamment pour des switches ou des choix de modes.
- La connexion entre nodes se réalise via l’attribut Message, permettant de gérer des relations complexes sans surcharge visuelle.
- La commande MEL "parent -s -r" est souvent utilisée pour lier plusieurs shapes, notamment dans la création de contrôleurs multi-shapes, pour une meilleure gestion visuelle.
- La fonction Show on mouse proximity (dans le Tag As Controller) permet d’afficher dynamiquement un contrôleur lorsque la souris s’en approche, améliorant la navigation dans la scène.
- La fonction Parent Controller facilite la navigation hiérarchique en permettant de passer d’un contrôleur enfant à son parent via les flèches up/down, simplifiant l’animation.
💡 À retenir
Les contrôles d'attributs personnalisés via Add Attribute offrent une flexibilité essentielle pour la gestion interactive et hiérarchique des contrôleurs, en utilisant notamment Boolean, Enum, et Message pour optimiser l’ergonomie et la logique du rig.
📖 8. Liaison shapes MEL
🔑 Notions clés & Définitions
- Commande MEL 'parent -s -r' : Script MEL permettant de lier les shapes de deux objets, comme deux NURBS circles, pour qu’ils deviennent un seul contrôleur avec plusieurs shapes. (source)
- Fusion de plusieurs NURBS circles en un seul contrôleur : Technique consistant à combiner plusieurs shapes NURBS en une seule entité contrôlable, facilitant la gestion et l’animation.
- Gestion des shapes multiples dans un contrôleur : Processus d’ajout ou de suppression de shapes dans un contrôleur existant, permettant une personnalisation avancée du contrôleur.
📝 Points essentiels
- La commande MEL 'parent -s -r' est souvent utilisée pour fusionner les shapes de deux objets, notamment pour créer un contrôleur unique à partir de plusieurs NURBS circles. Cela permet de simplifier la hiérarchie et d’avoir un seul contrôleur visuel.
- La fusion de shapes doit être réalisée après avoir sélectionné les shapes à lier, puis en exécutant la commande MEL pour que les shapes deviennent une seule entité contrôlable.
- La gestion des shapes multiples dans un contrôleur permet d’ajouter ou de retirer des shapes sans recréer le contrôleur, ce qui offre une flexibilité lors du rigging ou de l’animation.
- La fusion de shapes ne modifie pas la position ou la transformation du contrôleur, mais uniquement la composition visuelle.
- La gestion des shapes dans un contrôleur peut également inclure la suppression ou la duplication de shapes pour des besoins spécifiques.
💡 À retenir
La commande MEL 'parent -s -r' est essentielle pour fusionner efficacement plusieurs shapes dans un seul contrôleur, simplifiant ainsi la hiérarchie et la gestion visuelle en rigging. La maîtrise de cette technique permet une personnalisation avancée des contrôleurs dans Maya.
📖 9. Affichage contrôleur
🔑 Notions clés & Définitions
- Show on mouse proximity : Option dans l'attribut "Tag As Controller" permettant d'afficher dynamiquement un contrôleur lorsque la souris s'en approche, facilitant la sélection et l'animation.
- Taguer un objet comme Controller : Action dans l'Attribute Editor pour identifier un objet comme contrôleur, ce qui active des fonctionnalités spécifiques comme l'affichage dynamique.
- Global Joint Size : Réglage de la taille des joints dans l'interface, accessible via Display -> Animation -> Joint Size, permettant d'améliorer la visibilité en animation.
- Parent Controller : Fonction permettant de naviguer entre contrôleurs enfant et parent, aidant à la gestion hiérarchique dans la scène (utilisation des flèches up/down).
- Contrôles de contraintes : Types de contraintes (Parent, Point, Orient, Scale, Aim) qui contrôlent différents aspects du mouvement ou de l'orientation des joints ou contrôleurs.
📝 Points essentiels
- L'option Show on mouse proximity s'active dans le Tag du contrôleur via "Tag As Controller" pour permettre un affichage dynamique selon la proximité de la souris, améliorant la fluidité de l'animation.
- La taguage d’un objet comme Controller dans l'Attribute Editor est indispensable pour que l'objet soit reconnu comme contrôleur et bénéficie de cette visibilité dynamique.
- La taille des joints peut être ajustée via Display -> Animation -> Joint Size, ce qui est crucial pour une meilleure visualisation lors de l'animation.
- La fonction Parent Controller facilite la navigation dans la hiérarchie des contrôleurs, permettant de passer rapidement d’un contrôleur enfant à son parent, en utilisant les flèches up/down.
- La commande MEL "parent -s -r" est souvent utilisée pour fusionner plusieurs shapes dans un seul contrôleur, simplifiant la gestion des formes.
- La gestion des contraintes (Parent, Point, Orient, Scale, Aim) est essentielle pour contrôler précisément la transformation et l’orientation des joints ou contrôleurs.
- L’ajout d’attributs personnalisés (Boolean, Integer, Float, Enum, String, Vector, Matrix, Message) permet de créer des options, switches, blends, ou relations entre nodes pour une animation avancée.
💡 À retenir
L'affichage dynamique des contrôleurs, activé par "Show on mouse proximity" et la taguage comme Controller, optimise la gestion et la visualisation dans la scène, rendant l'animation plus intuitive et efficace.
📖 10. Navigation contrôleur
🔑 Notions clés & Définitions
- Fonction Parent Controller : Fonction permettant de naviguer entre contrôleurs enfant et contrôleur parent dans une hiérarchie, facilitant la gestion de l'animation (voir rappel).
- Utilisation des flèches up/down : Mécanisme pour changer le contrôleur actif dans la hiérarchie, permettant à l'animateur de passer rapidement d’un contrôleur à un autre sans ouvrir de menus complexes.
- Aide à l'animateur : Fonctionnalité qui simplifie la navigation dans la hiérarchie des contrôleurs, rendant l’animation plus fluide et intuitive.
- Show on mouse proximity : Option permettant d’afficher un contrôleur uniquement lorsque la souris s’en approche, améliorant la clarté visuelle dans la scène.
- Parent Controller : Fonction permettant de passer d’un contrôleur enfant à son contrôleur parent ou inversement, via le raccourci clavier ou le menu dédié.
📝 Points essentiels
- La fonction Parent Controller est essentielle pour gérer la hiérarchie des contrôleurs, notamment lors de l’animation de personnages complexes. Elle permet de naviguer efficacement entre contrôleurs sans perdre de temps.
- La navigation s’effectue principalement via les flèches up/down, ce qui évite d’ouvrir des menus ou de sélectionner manuellement chaque contrôleur.
- La fonctionnalité Show on mouse proximity s’active dans l’Attribute Editor, sous l’option "Tag As Controller", pour que les contrôleurs n’apparaissent que lorsque l’animateur en a besoin, ce qui facilite la gestion visuelle.
- La commande "parent -s -r" en MEL est souvent utilisée pour lier plusieurs shapes, par exemple deux NURBS circles, afin de créer un contrôleur avec plusieurs formes, permettant une meilleure manipulation visuelle.
- La gestion de la hiérarchie est également facilitée par la fonction Parent Controller, qui permet de passer d’un contrôleur enfant à son parent ou inversement, améliorant la fluidité de l’animation.
💡 À retenir
La navigation dans la hiérarchie des contrôleurs, via la fonction Parent Controller et les flèches up/down, est une méthode efficace pour gérer rapidement et intuitivement la hiérarchie des contrôleurs, optimisant ainsi le flux de travail de l’animateur.
📊 Tableau de Synthèse Comparatif
| Fonction / Concept | Description | Méthode / Commande | Auteur / Référence |
|---|
| Taille des joints | Ajuste la visibilité des joints en animation | Display -> Animation -> Joint Size | Maya (Autodesk) |
| Segment Scale Compensate | Évite la déformation lors du scaling d’un membre | Option dans l’attribut du joint | PERROUX (théorie du rigging) |
| Rotation Order | Ordre d’application des rotations (XYZ, ZYX, etc.) | cmds.setAttr (joint.rotateOrder) | Maya (Autodesk) |
| Modifier orientation manuellement | Ajuste l’orientation locale via Local Rotate Axis | Local Rotate Axis + Select point Components | Maya (Autodesk) |
| Commande MEL "joint -e -zso" | Réinitialise le Rotate Axis d’un joint | MEL (script) | Maya (Autodesk) |
| Liaison shapes MEL | Fusionner plusieurs shapes dans un contrôleur | parent -s -r | Maya (Autodesk) |
| Contrôleur - Affichage sur proximité | Affiche contrôleur selon la proximité de la souris | Show on mouse proximity (Tag As Controller) | Maya (Autodesk) |
| Navigation contrôleur | Gestion hiérarchique via Parent Controller | Flèches up/down | Maya (Autodesk) |
| Python rotateOrder | Modifier l’ordre de rotation des joints en Python | cmds.setAttr(joint + ".rotateOrder") | Maya (Autodesk) |
| Contrôle de la visibilité des joints | Ajuste la taille pour une meilleure visibilité en animation | Display -> Animation -> Joint Size | Maya (Autodesk) |
⚠️ Pièges & Confusions Fréquentes
- Ne pas remettre à zéro le Rotate Axis après modification manuelle, entraînant incohérences dans l’animation.
- Confondre rotation et translation dans Rotate Axis, ce qui peut décaler la hiérarchie.
- Oublier d’activer Select point Components lors de la modification d’orientation, empêchant la sélection des axes.
- Ne pas utiliser la commande MEL "joint -e -zso" après ajustement manuel, provoquant des incohérences dans la hiérarchie.
- Modifier le Rotate Order sans vérifier la hiérarchie, ce qui peut causer des rotations inattendues.
- Oublier de désactiver Segment Scale Compensate quand il n’est pas nécessaire, entraînant des déformations indésirables.
- Confondre la taille des joints (visible) et leur influence sur la sélection ou la manipulation en scène.
✅ Checklist Examen
- Connaître la définition de PERROUX sur la croissance et l’importance du Segment Scale Compensate.
- Savoir comment ajuster la taille des joints via Display -> Animation -> Joint Size.
- Maîtriser la modification manuelle de l’orientation des joints avec Local Rotate Axis et la sélection Select point Components.
- Savoir utiliser la commande MEL "joint -e -zso" pour réinitialiser l’orientation locale d’un joint.
- Comprendre la différence entre rotation et translation dans Rotate Axis et leur gestion séparée.
- Être capable de modifier le Rotate Order d’un joint en Python avec cmds.setAttr.
- Connaître la fonction de liaison shapes MEL avec "parent -s -r".
- Savoir activer et désactiver l’affichage contrôleur basé sur la proximité de la souris.
- Maîtriser la navigation hiérarchique entre contrôleurs via Parent Controller.
- Connaître la liste de tous les joints dans la scène avec cmds.ls(type='joint').
- Savoir comment ajuster la visibilité des joints pour une meilleure animation.
- Comprendre l’impact de Segment Scale Compensate sur la cohérence du rig.
Създайте свои собствени листове за преговор
Импортирайте курса си и AI генерира листове, тестове и флашкарти за 30 секунди.
Генератор на листове