Depuis quelques jours je travaille à temps perdu (comprendre quand j’ai 5 minutes) avec Xavier Martin aka zeflasher, sur l’intéraction avec le material mappé sur des objects 3D.
Et nous commençons à obtenir quelque chose, donc autant le partager avec vous.
Tout d’abord il a fallu résoudre l’approche mathématique. Cela fu ma partie.
Il faut pour commencer obtenir la coordonnée du click utilisateur dans le container de la scène3D. Jusque là, tout va bien.
Ensuite il faut normaliser cette coordonnée dans le système de coordonnées écran de Sandy. Pour cela il faut repositionner le zéro qui est au centre de l’écran pour Sandy.
Une fois ce point obtenu, l’idée est d’appliquer la projection inverse sur ce point 2D, afin d’obtenir un pseudo point 3D. A ce point 3D, nous appliquons ensuite la transformée inverse de la camera pour repasser ce point dans le repère centré en 0,0,0 de notre scène 3D.
Il faut bien comprendre que nous n’obtenons pas un point 3D à proprement parler à la suite de ces transformations. Nous obtenons plutôt une direction . Et du point de départ qui est la position de la camera et avec cette direction, nous pouvons définir un rayon.
Mouais, bien sympa, mais comment utiliser ça pour notre affaire? Et bien, à partir de ce rayon, il faut calculer l’intersection avec un polygone (triangle) s’il y a.
On va assumer que nous n’effectuons jamais ce calcul avant même de savoir qu’il y a une intersection possible. En effet, ce calcul s’effectuera après un clic souris sur le container d’un objet assurant un résultat d’intersection.
L’intersection avec le polygone passe par la détermination de l’équation du plan (avec la normale que nous avons déja, c’est facile) et de l’intersection droite/plan.
Et hop, avec cela, nous déterminons très précisement l’intersection sur un polygone de notre object, et on retrouve un vrai point 3D!
Bon c’est bien sympa, mais il faudrait plutôt avoir la coordonnée de mapping à ce point pour pouvoir intéragir avec le material.
Bien justement, maintenant que nous avons le point 3D dans un triangle composé de points dont on connait la coordonnée de mapping, ca doit se faire facile non? Et bien je le pensais, mais non.
Je n’ai pas encore compris pourquoi, mais déterminer ce point 2D (coordonnée UV) sur le point 3D calculé en faisant une simple interpolation linéaire depuis les 3 points connus du triangle ne semble pas marcher. (j’ai obtenu des résultats, mais vraiment pas précis et irréguliers).
Alors tout ça pour rien? Et bien non heureusement, mais j’ai me suis bien pris la tête…
Finalement je suis partis sur une approche … 2D :) Je connais la projection écran des points du triangle (donc là c’est 2D) et ces points ont donc une coord UV (2D aussi) associée. Et là, avec de rapides calculs d’intersection entre lignes 2D, j’ai réussi à avoir ce que je voulais… ouf!
voilà donc le premier résultat : (cliquez avec la souris sur l’objet, et déplacez vous avez les touches directionnelles)
Avec le point d’intersection 3D, on peut déterminer la normale à ce point représenté ici par un segment de droite noir, et avec l’approche 2D, on peut modifier la texture.
Bon ok, voici maintenant Xavier qui entre en scène.
Xavier est donc parti de mes résultats pour mettre en place la vraie utilisation de tout ces trucs : l’intéractivité avec le material.
L’idée est donc de mapper l’objet par un movie clip, composant ou autre. et ensuite de pouvoir gérer une intéraction avec ce dernier.
Là le travail est plus sur la gestion des événements. Xavier utilise pour cela l’idée de base de la classe VirtualMouse de Sénocular. Une fois la coordonnée “material ” équivalente à notre position souris calculée, on simule une action avec la souris virtuelle sur le movieclip du mapping. S’il réagit à cette souris virtuelle, le material s’update, et met à jour le rendu sur l’objet 3D.
Bon là ça commence à faire beaucoup de blabla, mais j’espère que ces explications plairont à certains, les autres pouvant cliquer sur la petite démo ci dessous pour voir ce que ça donne
Notez bien que tout cela ne sont que les prémices et n’est absolument pas stable ni fini.
Ceux interessés par les maths derrières, peuvent retrouver tout ça dans les méthodes get2DFrom3D et getUVFrom2D dans la classe Polygone de Sandy.
Cela donne quand même un petit aperçu du futur ![]()


25 October 2007 à 8:26 am
wow ca fait mal!
21 March 2008 à 5:13 pm
wouh merci pour ce post, je suis en train de faire la même chose avec un autre moteur et j’étais bloquée pour retrouver les coordonnée uv de mon point une fois mon triangle trouvé. Je pensais également que ça serait simple mais non
Vous m’avez orientée vers la bonne piste, merci!