-
3 pièce(s) jointe(s)
Modelisation 3D Solide
Bonjour, Bonsoir,
Je ne suis pas sur que la section dans laquelle je postes ce message soit la bonne car je ne suis plus totalement débutant avec java (3eme année de License info) mais on ne peut pas dire que je soit un expert non plus.
Je souhaites implémenter un système de gestion d'objets 3D en Java. C'est a dire, je souhaites gérer des solides (en 3D) puis par des opérations mathématiques les afficher sur l'écran (2D). Pour l'instant, j'ai réussi a implémenter la structure de donnée correspondant a mon solide, c'est a dire, une ArrayList de surface et chaque surface est une ArrayList de Points.
Puis, je projettes mes surfaces sur l'écran (c'est a dire que je crée un nouvel objet nomme Surface2D qui contient la ArrayList du projeté de tous les points de la surface associée). A noter que je fais une projection sur un plan vers un point arbitraire (pour conserver la perspective).
J'ai défini des opérations simples, telles que la rotation et la translation, et lorsque j'affiche le cube en "fils de fer" ca marche sans problème.
Mon problème apparait lorsque je souhaites colorier mes faces. Il arrive que les faces de l'arrière de mon cube soient dessinées après mes faces avant et donc soient "au dessus" de celles-ci.
Je ne vois qu'une solution possible qui serait un procédé lent; a savoir implémenter un système de "tri" ou d'"ordre" d'affichage (et dans ce cas tester pour de nombreux pixels de mon solide la profondeur).
C'est donc la que je bloque et je ne sais pas trop comment faire...
Je sais qu'il existe des bibliothèques Java permettant de gérer un environnement 3D mais j'ai envie de savoir un implémenter un, pour pouvoir un jour, si besoin est implémenter une telle interface dans un langage qui ne possède pas de telle bibliothèque.
Merci d'avance de votre aide et de vos conseils.
P.S.: je joins mon code au post pour les courageux qui se sentent l'envie de le lire.
-
Tu n'as pas le choix : le principe de base est le tri des faces dans leur ordre d'apparition en profondeur (axe Z). Il faut trier selon les sommets de tes différents triangles.
EDIT : après lecture diagonale de ton code, je constate que tu utilises des carrés au lieu de triangles. Simplifie-toi la vie et fait comme tout le monde : utilise des triangles :ccool:
-
Merci de cette réponse si rapide par contre, pour utiliser les dits triangles quelles est la meilleures méthode? J'imagine que calculer les barycentres et les comparer ne suffit pas... Y a t'il des ressources (internet ou livre) que je puisse lire sur le sujet?
-
Il y a énormément de techniques différentes, selon les contraintes du rendu.
Tu peux commencer à chercher de la documentation sur le Z-buffer, l'une des techniques les plus répandues, y compris sur les cartes graphiques ou elle est directement "cablée". Elle est relativement simple à mettre en oeuvre.
Pour un rendu parfait, la technique absolue est le ray-tracing. Malheureusement, selon la taille de l'image à créer et la complexité de la scène, du multi-coeurs sur du multi-processeurs ne sera pas de trop... ;) Par contre si tu es curieux, bricoleur, ami avec les sinus et cosinus, et que tu as de longues heures à y consacrer, cette technique vaut le coup.
Sinon, ton idée sur les barycentres pourrait suffire, tout dépend des contraintes de rendu et de la scène de départ. Le résultat pourrait être intéressant dans ton cas.