Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Invité régulier
    Inscrit en
    mars 2011
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : mars 2011
    Messages : 42
    Points : 5
    Points
    5

    Par défaut Meilleure architecture pour application3D/kinect

    Bonjour,

    Je développe une application 3D (XNA) qui utilise le système Kinect. J'ai quelques hésitations dans l'architecture à utiliser. Au début, je voulais me tourner vers l'architecture MVC. Mais la partie présentation de mon application ne présente aucune interaction avec l'utilisateur. L'utilisateur se contente de regarder l'animation 3D et interagit avec la kinect. Quelle serait l'utilité dans ce cas de la partie contrôleur ?

    Merci beaucoup pour vos explications

  2. #2
    Membre régulier
    Inscrit en
    août 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 70
    Points : 82
    Points
    82

    Par défaut

    Bonjour,

    Je ne connais pas les frameworks et autres utilisés par kinect, donc s'il y a des spécificités à ce système, je vais peut-être répondre à coté.

    Dans MVC, toute interaction de l'utilisateur impliquant un changement dans le modèle doit passer par le contrôleur, même si l'interaction ne provient pas d'un élément de la vue (un clic sur un bouton par exemple).

    Dans votre cas, si je comprend bien, la vue de votre application ne va générer aucun évènement. Elle va donc exclusivement servir à l'affichage des données du modèle.
    Vous êtes donc exactement dans le cas d'utilisation prévu à l'origine par MVC : Le périphérique d'entrée (kinect en l'occurence) est complètement géré par le contrôleur.

    En supposant que l'application permette de faire tourner un objet de l'animation par une rotation de la main, voici un schéma, grossier, des traitements effectués :
    • Kinect détecte une interaction de l'utilisateur -> quart de tour de la main
    • L'interaction est envoyée au contrôleur
    • Le contrôleur traduit l'interaction 'quart de tour de la main' en action à réaliser sur le modèle -> tourner l'objet de 90°
    • Le contrôleur envoie l'action 'tourner l'objet de 90°' au modèle
    • Le modèle exécute l'action -> l'objet fait une rotation de 90°
    • Le modèle notifie la vue d'un changement.
    • La vue met à jour l'orientation de l'objet et s'affiche -> sur l'écran, l'objet a fait un quart de tour


    Le contrôleur a donc le rôle majeur d'interpréter les commandes envoyées par kinect comme des actions à effectuer dans l'application.

    D'un point de vue personnel, qui n'engage que moi donc, je dirais que votre application correspond bien au cas d'utilisation "prévu" par MVC.
    Les différentes opérations à effectuer peuvent être réparties de façon claire et équilibrée (en termes de responsabilités) sur les 3 parties (Modèle, Vue et Contrôleur).

  3. #3
    Invité régulier
    Inscrit en
    mars 2011
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : mars 2011
    Messages : 42
    Points : 5
    Points
    5

    Par défaut

    Bonjour,

    Je vous remercie pour votre réponse claire et précise. Cependant, j'aurais encore une question.

    Mon programme est formé d'une application XNA (la vue) et d'une dll qui comprend la contrôleur et le modèle. Le problème vient que l'application XNA possède une méthode Update() du framework XNA qui doit inclure toutes les mises à jours de la vue. Cette méthode est appelée en boucle. Je ne peux donc pas utiliser d’évènement pour que le modèle avertisse la vue qu'elle doit se mettre à jour. Mon seul moyen de procéder est que la vue se mette à jour continuellement sur le modèle. Est ce correct ?

    Je vous remercie.
    Bonne soirée

  4. #4
    Membre régulier
    Inscrit en
    août 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 70
    Points : 82
    Points
    82

    Par défaut

    Bonjour,

    Je ne connais pas non plus le framework XNA, donc je suppose que la méthode Update() est une méthode que vous devez implémenter dans votre application?

    Si j'ai bien compris la solution que vous proposez, vous suggérez que la vue récupère les données du modèle à chaque affichage. Mais je ne saisis pas bien quand est-ce que le modèle est mis à jour?

    Personnellement, je vois 2 façons de faire (l'une d'entre elle est peut être celle que vous proposez?).

    Solution 1
    La première solution consiste à avoir 2 threads :
    • Un thread qui s'occupe du traitement des données (controleur->modèle->vue)
    • Un thread qui s'occupe de l'affichage (vue)

    La méthode Update() du framework XNA est donc dans un thread réservé à l'affichage. Les mises à jour sont dans un autre thread.
    Cette décomposition permet d'avoir une indépendance entre le nombre d'images par seconde et les mises à jour des données, ainsi qu'un gain potentiel en performances.
    Le GROS inconvénient est que les données internes à la vue sont partagées par plusieurs threads.


    Solution 2
    L'autre solution, plus simple à mettre en oeuvre, consiste à faire de la méthode Update() de XNA, la boucle principale de votre application.
    Votre méthode Update() va contenir deux appels :
    1. Demander au contrôleur de se mettre à jour
    2. Demander à la vue de s'afficher

    Au cours de la première étape, le contrôleur récupère les évènements de Kinect, ce qui va déclencher l'envoi d'une action au modèle.
    Le modèle se met alors à jour, ce qui va envoyer une notification à la vue.
    La vue se met donc à jour en récupèrant les données du modèle.

    Au cours de la deuxième étape, la vue affiche simplement les données qui ont été mises à jour au cours de la première étape.

    Avec cette solution, l'application possède un thread unique, ce qui est plus simple.
    Par contre, pour chaque image affichée, il faut mettre à jour tout le reste de l'application (récupération des données de kinect et mise à jour du modèle).
    On peut, cela dit, ne pas faire la mise à jour du contrôleur à chaque boucle, via l'utilisation d'un compteur ou d'un timer.


    Ces solutions supposent que la DLL soit capable d'envoyer des notifications.
    Si ce n'est pas le cas, il faut effectivement que l'application XNA aille interroger régulièrement la DLL à la recherche de mises à jour, et envoyer une notification à la vue.

  5. #5
    Invité régulier
    Inscrit en
    mars 2011
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : mars 2011
    Messages : 42
    Points : 5
    Points
    5

    Par défaut

    Bonjour,

    Je vous remercie. Je vais donc opter pour la première solution car dans XNA il y a deux méthodes implémentées Update() et Draw() (appelées en boucle).

    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •