Déformation d'objets 3D - Version imprimable +- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org) +-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38) +--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51) +--- Sujet : Déformation d'objets 3D (/showthread.php?tid=5021) |
Déformation d'objets 3D - Foxglove - 26-07-2010 Bonjour, Imaginez un cube qui représente un mur. Un impact d'obus peut déformer le mur en faisant un gros trou dedans. Je voulais avoir votre avis sur deux questions que je me pose. Question 1 : Comment modéliser cette déformation ? J'utilise l'API Java3D (qui utilise openGL ou direct3D), mais je suppose que toutes les API offrent des fonctionnalités similaires. Techniquement, on commence par créer un univers (l'ensemble des objets du monde) et on demande son affichage. On peut manipuler l'univers en déplaçant les objets ou en les faisant tourner par exemple. Mon problème vient du fait que les objets doivent être présents dans le monde initialement. Après avoir réfléchi un peu dessus, et parcouru des sites traitant (un peu) de ça, voici les idées que j'ai retenues : (1) Créer un objet "MurNormal" et un objet "MurAbimé". Téléporter l'objet "MurAbimé" hors de la vue du joueur. Lorsqu'il y a une interaction avec l'objet "MurNormal", échanger la position de "MurNormal" et de "MurAbimé". (2) Modéliser l'objet "MurNormal" comme un objet "MurAbimé" auquel s'ajoute une partie "TrouComblé" (qui comble le trou du mur abimé). Lors de l'interaction avec "MurNormal", la partie "TrouComblé" est téléportée loin. (3) Lors de l'interaction, détacher l'objet "MurNormal" de l'univers, reconstruire (dynamiquement) un objet "MurAbimé" en fonction de l'impact, et attacher cet objet à l'univers. La solution (3) a l'air la plus intéressante, mais la plus compliquée aussi (il faut recalculer la position de tous les triangles en fonction de l'impact). Question 2 : Dans les jeux 3D actuels, est-ce que les animations des objets 3D utilisent des déformations ou uniquement des objets mobiles mais non déformables ? En regardant attentivement les animations de personnages/monstres dans dans MMORPG en 3D, j'ai l'impression que les objets ne sont pas déformables... Qu'en pensez-vous ? Merci RE: Déformation d'objets 3D - Globe - 26-07-2010 En termes de jeux vidéos il existe un tas de moteurs différents qui agissent d'un paquet de façons différentes. La majorité des jeux passent par les textures parce que ça reste le plus simple, pour véritablement avoir l'effet réel d'un impact il me semble que le jeu 'Le pouvoir de la Force' utilise un moteur qui gère la structure "moléculaire" d'un objet, donc chaque objet va réagir selon sa structure, tu jettes un objet dans du verre il se brise, dans du métal il se tord... Mais ça ça reste la crème de la crème. Je ne connais rien en développement 3D mais si tu pouvais utiliser les vertex de ton objet 3D tu devrais pouvoir les renfoncer à l'intérieur de l'objet de manière circulaire le centre étant le point le plus profond de manière à créer un impact réaliste. Sinon si seulement certains de tes murs sont destructibles tu peux toujours les construire brique par brique et les désassembler dans une explosion ou autre de manière assez simple. Le problème reste que pour un rendu vraiment réaliste tu dois considérer chaque partie de l'objet comme un objet à part ce qui doit être très relou à gérer en plus d'être lourd au niveau des ressources. RE: Déformation d'objets 3D - NicoMSEvent - 26-07-2010 pour moi, chaque objet serait une liste de triangles (texturés, ...). Le fait d'abimer ton mur, ajoute des triangles ayant des cordonnées précises, et forme un trou. Donc, pour moi ça reste le même objet. Je verrais bien une fonction : mur.recoit_un_tir(coord_x,coord_y,force,angle_d_impact) qui modifierait ton mur en conséquence RE: Déformation d'objets 3D - Foxglove - 26-07-2010 Merci pour vos remarques (26-07-2010, 12:59 PM)Globe a écrit : Si tu pouvais utiliser les vertex de ton objet 3D tu devrais pouvoir les renfoncer à l'intérieur de l'objet Lors de la création de l'objet (avant que les objets 3D commencent à être affichés), je définis effectivement les coordonnées de mes sommets. Le problème est qu'une fois que mon objet est créé, il devient "solide". Je peux le déplacer, le faire tourner, changer sa texture, mais je ne sais pas comment toucher à ses sommets. De même, je ne sais pas ajouter des sommets à un objet créé. En gros, si j'ai modélisé mon mur comme un cube de 8 sommets, je ne sais pas ajouter des sommets au centre pour l'impact. Si quelqu'un connaissait un moyen de faire cela via l'API, ça m'intéresserait. (26-07-2010, 12:59 PM)Globe a écrit : Sinon si seulement certains de tes murs sont destructibles tu peux toujours les construire brique par brique et les désassembler dans une explosion ou autre de manière assez simple. Oui, je rapproche cette solution de la solution (2) : tu prévois la manière dont l'objet va se casser. Une fois que le mur est modélisé comme un ensemble de briques, je sais les déplacer indépendamment les unes des autres. L'inconvénient est quand on ne peut pas prévoir la manière dont l'objet va se casser. (26-07-2010, 01:27 PM)NicoMSEvent a écrit : pour moi, chaque objet serait une liste de triangles (texturés, ...). Oui, c'est le cas à la création. (26-07-2010, 01:27 PM)NicoMSEvent a écrit : Donc, pour moi ça reste le même objet. C'est vrai, mais ce terme "objet" peut porter à confusion. Disons qu'il y a deux types d'objets, les "Object" (de Java) et les "Shape3D" (de Java3D). Même si mon WallObject est le même "Object" avant et après impact, je crains qu'il ne faille créer deux "Shape3D" différentes. Mon problème est que je ne suis pas sûre que Java3D gère des "Shape3D" qui changent, ou du moins je ne sais pas le faire. Un autre élément pour aller dans ce sens : à la construction d'une Shape3D, on spécifie le nombre de sommets. Ce nombre est immuable. PS : J'ai aussi vu qu'il y avait des SwitchableShape, mais je les ai écartées car je pense qu'il s'agit d'une technique permettant de faciliter les échanges de formes précalculées (comme dans la solution (1)). A étudier. RE: Déformation d'objets 3D - niahoo - 26-07-2010 Alors hmmm bon j'y connais pas grand chose mais si je me base sur ce que j'ai vu c'est une combinaison des solutions 1 et 3 qu'on utilise généralement : Quand un boulet touche ton mur, tu supprimes l'objet mur de ton univers et tu le remplaces par un objet murAbimé. ( enfin tu gardes le même objet Java, mais quand tu appelerais une méthode, par exemple "seFaireDéfoncer()" alors il changera son objet 3D. Et la tu refresh la vue. Donc solution 3 : tu crées dynamiquement des objets3D : ça bouffe du CPU temporairement, c'est le but d'un ordi, et tu ne remplis pas la mémoire en stockant hors de la vue des objets 3D qui vont rester 3 plombes sans jamais servir si un boulet n'est pas tiré. Par contre, t'as un seul, ou quelques uns, objet 3D pour le mur abimé, et tu ne calcules pas selon le point d'impact la déformation. ça c'est le plus simple je pense. Ensuite, quand tu t'es fait une classe de déformations, héritée d'une classe de déformations de murs par des boulets, tu pourras lui demander de créer à la volée des objets 3D de murs abimés selon le point d'impact et le type de projectile. RE: Déformation d'objets 3D - Foxglove - 26-07-2010 Merci de ta réponse (26-07-2010, 01:58 PM)niahoo a écrit : Par contre, t'as un seul, ou quelques uns, objet 3D pour le mur abimé, et tu ne calcules pas selon le point d'impact la déformation. Je vois. Cette solution de précalculer les déformations possibles est plus pratique, c'est vrai, mais ça me chagrine un peu quand même de tout précalculer. C'est comme si tout était connu d'avance. Par contre, une précision par rapport à mon message original. Je recherche les techniques 3D (basées sur les triangles, la manipulation des formes, le paramétrage de l'univers, ...), plutôt que les techniques objets (basées sur l'encapsulation, l'héritage, ...). RE: Déformation d'objets 3D - nicodd - 26-07-2010 Tout dépends de ce que tu veux, mais si il s'agit d'impacts sans destruction totale du mur, une technique qui est employée dans les jeux vidéo récents est de superposer au modèle une texture à laquelle est associée une bump-map qui s'occupe de "creuser" le trou dans le mur. RE: Déformation d'objets 3D - niahoo - 26-07-2010 Comme je te disais, contentes toi de précalculer à l'avance quelques modèles de murs déformés, et quand tout fonctionne bien, alors tu peux allonger la durée du programme pour calculer en direct les déformations. C'est de la ressource en plus et il va en plus falloir, dans le cadre d'un multijoueur, envoyer ce nouvel objet 3D à tous les joueurs à proximité du mur ou qui vont y passer plus tard. (26-07-2010, 06:36 PM)Foxglove a écrit : Par contre, une précision par rapport à mon message original. Je recherche les techniques 3D (basées sur les triangles, la manipulation des formes, le paramétrage de l'univers, ...), plutôt que les techniques objets (basées sur l'encapsulation, l'héritage, ...). Ben si tu te bases sur des API, des bibli, tu risques surtout de tomber sur des classes et des listes de méthodes. RE: Déformation d'objets 3D - Delkaes - 26-07-2010 Comme le dit nicodd, utilise un décal d'impact plutôt que t'embêter a creuser le mur. Après si tu veux vraiment faire dans la 3d, soit tu passe par du displace map + bump, soit tu fais ton mur sous mudbox / zbrush où tu peux facilement faire de l'organique. |