2010-06-09 2 views
0

Salut à tous,XNA, lumière WPF spectacle Visualiseur

Je développe un logiciel pour contrôler la lumière émission (via le protocole DMX), j'utiliser C# et WPF pour développer mon logiciel principal (4.0 .net)

pour aider les gens à afficher un aperçu de leur spectacle, je voudrais faire un live Visualiseur 3D ...

d'abord, je pensais que je pouvais utiliser WPF 3D pour rendre le Visualiseur, mais je dois travailler avec la lumière ..

Mon application principale doit envoyer une propriété (angle de faisceau, orientation (X, Y) , position (X, Y), pinceau (couleur, forme, effet)) au visualiseur 3D

Mais j'aimerais pouvoir déplacer la lumière (position dans la scène) avec la souris pendant l'exécution et avoir une valeur en retour ...

So ..

est-ce que XNA est la meilleure façon de le faire?

Pouvez-vous me aider pour cela:

  • lumière Génération (orientation, bitmap comme filtre devant de la lumière)

  • objet en mouvement Dynamiquement avec la souris et obtenir la position en retour

  • Ajouter ou supprimer dynamiquement le projecteur

Tous vos conseils, échantillon, exemple sont les bienvenus ... Je ne m'attend pas à avoir un résultat parfait à la première fois, mais j'ai besoin de comprendre les principaux concepts pour le faire

Merci!

Répondre

1

XNA ne contient aucune fonctionnalité pour gérer une "scène" - vous devrez l'implémenter vous-même. Par exemple: vous pouvez créer une classe Light contenant les informations sur votre éclairage (position, orientation, etc.), puis en avoir une List<Light>, que vous mettez à jour et restituez vous-même.

Je vais maintenant supposer que vous avez un modèle 3D d'un "Light" (comme dans: la boîte métallique contenant l'ampoule) et aussi un modèle 3D d'une scène. Et que vous pouvez comprendre comment les rendre - il existe de nombreux tutoriels en ligne pour le rendu de modèle simple dans XNA. Here is a starting point.

Donc, votre 3ème exigence ("ajouter dynamiquement ou supprimer un appareil") devrait être assez simple une fois que vous pouvez rendre les choses. Il suffit d'ajouter et de supprimer des lumières de votre liste d'entre eux en fonction de l'entrée de l'utilisateur. Voir le Input namespace.

Et votre 2ème exigence ("déplacer dynamiquement l'objet avec la souris et obtenir la position en retour") devrait également être simple. Si vous voulez que votre utilisateur déplace les lumières en cliquant et en faisant glisser, gardez juste la trace de la position de la souris entre les images et appliquez-la comme ajustement à la position (ou rotation) de la Lumière cliquée.

Pour déterminer quelle lumière l'utilisateur clique en premier lieu, un bon point de départ est le Picking Sample.

Je suppose ici que l'utilisateur cliquera sur la lumière (boîtier métallique) lui-même pour le déplacer/le faire pivoter. Si vous préférez que l'utilisateur clique et fasse glisser l'extrémité de la lumière (l'endroit qu'il projette), c'est plus difficile. Une idée qui vient à l'esprit: Intersectez un rayon de votre Lumière avec la scène pour trouver le centre du point projeté. À ce stade, dessinez un objet "handle" factice (comme une sphère) que l'utilisateur peut cliquer et faire glisser. Lorsque l'utilisateur a fini de glisser, déterminez la nouvelle orientation pour que Light devienne le nouveau centre.

Enfin votre 1ère exigence ("Générer de la lumière (orientation, bitmap comme filtre devant la lumière)") est la plus délicate. Ma compréhension de ceci est que vous voulez un moyen de dessiner le point final du faisceau de lumière sur votre modèle de scène? Si oui, ce que vous cherchez est appelé Projective Texture Mapping. Vraisemblablement, vous aurez une texture circulaire pour les lumières de base, et peut-être d'autres textures pour les gobos. La manière rapide et sale de faire ceci serait de dessiner votre modèle de scène, une fois pour chaque lumière, avec un mélange additif (de sorte que chaque lumière ajoutée avec les autres lumières et le noir n'a eu aucun effet), avec un couleur définie sur la couleur de la lumière, et avec une texture en noir et blanc (un cercle blanc sur fond noir) dessinée avec TextureAddressMode.Clamp, avec un shader qui dessine la texture avec la projection de texture projective qui est mis en place avec la lumière le point de projection.