Bonjournal,
j'ai craqué: j'ai fini par implémenter les surfaces dans mon package java dont tu n'as que faire...
Cela dit c'est particulièrement pas beau sans le Z-buffer:
http://jmathtools.sourceforge.net/GridPlotsExample.png(...)
Alors voilou, je voudrais bien implémenter le Z-buffer mais comme je suis une bille en algo et une feignasse de surcroit, je cherche un pseudo code ou qlq chose comme ça qui serait bien optimisé...
A vot' bon coeur...
Merci.
PS: non, Google n'est pas mon ami, et d'ailleurs j'ai pas d'amis.
# Wikipédia ?
Posté par Krunch (site web personnel) . Évalué à 4.
http://en.wikipedia.org/wiki/Z-buffering(...)
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: Wikipédia ?
Posté par Prae . Évalué à 3.
(mais moins complet :(
# Approche pas si naive que cela ...
Posté par Mouns (site web personnel) . Évalué à 4.
1. tu poses les éléments
2. tu change de referentiel pour que l'origine soit dans l'oeil o de l'observateur et que l'axe oz soit la profondeur, et que les axes ox et oy correspondent à l'horizontale et la verticale de l'ecran
3. tu ne colories que les pixels calculées ayant l'ordonnées sur l'axe oz la plus petite
normalement avec ça tu ne sera pas loin du Z-buffer ;)
PS :
http://www.google.com/search?client=safari&rls=fr&q=Z+buffe(...)
# Java 3D ?
Posté par pierthi . Évalué à 1.
* Ça n'utiliseras jamais d'accélération matérielle.
* Code ultra bloat pour une fonctionnalité annexe.
* Sans compter tous les bugs.
J'ai jamais utilisé Java 3D, mais ça sera à mon avis bien plus joli et optimisé que le meilleur algo que tu puisses trouver ...
[^] # Re: Java 3D ?
Posté par vrm (site web personnel) . Évalué à 2.
[^] # Re: Java 3D ?
Posté par GuieA_7 (site web personnel) . Évalué à 1.
Et en plus il s'épargnera une dépendance à Java3d, on pourra générer des graphiques en ligne de commandes sans que rien ne s'affiche etc....
# bsp?
Posté par kra . Évalué à 2.
en gros, c'est une structure d'arbre qui te classe tes facettes selon un ordre "devant/derriere", qui fait que tu n'as pas besoin de Z buffer.
tu parcours ton arbre dans le sens arriere/avant et tu affiches chaque facette sans te preoccuper de sa profondeur, vu que tout est trie.
Ca boost pas mal les perfs en plus.
une pitite recherche sur le web te donnera un mine d'info la dessus (c'est assez casse couille a faire quand meme, mais quand ca marche, bah ca fait plaiz').
[^] # Re: bsp?
Posté par GuieA_7 (site web personnel) . Évalué à 2.
Un BSP c'est quand même un poil bourrin : c'est ce qui est au coeur d'un Quake 3 par exemple, parce que c'est l'algo typique pour les moteurs 3D en intérieur. Mais ça sert surtout à savoir quels triangles il faut afficher et lesquels vont être cacher par d'autres (et donc ne pas les envoyer inutilement dans la carte graphique).
Mais pour un affichange precis au pixel prés, ça ne dispense pas d'utiliser le z-buffer (Quake 3 ne s'en prive pas sauf erreur grossière de ma part).
[^] # Re: bsp?
Posté par Antoine . Évalué à 3.
Oui, car certaines faces peuvent être en intersection (exactement le cas sur le screenshot du monsieur d'ailleurs).
Sans compter que les textures semi- transparentes obligent à tracer aussi les faces qui sont derrière : les structures de détection d'occlusion (comme le BSP) ne sont qu'une heuristique.
Sinon un z-buffer, c'est très simple, mais ça nécessite d'écrire soi-même la routine qui va écrire les pixels individuels : peut-être pas super en Java ?
[^] # Re: bsp?
Posté par GuieA_7 (site web personnel) . Évalué à 2.
On est bien d'accord qu'il ne va pas obtenir le truc le plus rapide du monde. Mais :
- même si personnellement, je n'utiliserai java que lorsqu'on aura au moins une jvm libre mature (attention je ne critique absolument pas le travail de ceux qui bossent sur les jvm libres), il faut reconnaitre que le java ça peut être quand même raisonnablement rapide (mais très gourmand en RAM en revanche).
- Comme je le dit dans un post plus haut, je ne suis pas fan de l'utilisation de OpenGL dans ce cas.
- Il peut se faire un module en C qui fait ça, mais bon contrairement au reste de l'appli il faut le compiler pour chaque archi, et c'est peut être pas ce qu'il veut.
Après c'est sûr que le z-buffer c'est la solution facile et bourrine et qu'on doit pouvoir trouver mieux dans son cas. Il peut par exemple partir du postulat qu'il n'a que des segments de droites dans 2 plan orthogonaux et trouver un algo adapté à ce cas. Mais je présume qu'après il voudra aussi faire des surfaces pleines, et que le z-buffer sera encore la solution facile qui marche tout le temps.
[^] # Re: bsp?
Posté par kra . Évalué à 2.
ben au temps pour moi alors, on nous avait parle de ca lors de mes cours d'infographie a la fac, et on nous avait presente ca comme la solution miracle face au Z buffer.
par contre, le prof nous l'avait fait implementer sur une scene en exterieur (le rendu du campus d'orsay paris XI).
[^] # Re: bsp?
Posté par Krunch (site web personnel) . Évalué à 3.
http://en.wikipedia.org/wiki/Binary_space_partitioning(...)
Sinon pour les algorithmes et structures de données en général, il y a le "Dictionary of Algorithms and Data Structures" qui recence pas mal de trucs avec des liens vers des exemples d'implémentations mais évidemment le z-buffer n'est pas dedans.
http://www.nist.gov/dads/(...)
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
# performances...
Posté par yaya . Évalué à 1.
Un petit complément d'info : le plot 3d en question est interactif et doit pouvoir assumer la rotation par déplacement de la souris.
exemple:
http://jmathtools.sourceforge.net/plot3dapplet.php(...)
m'enfin si l'algo choisi ne donne pas suffisamment de rapidité, je repasse en mode filaire le temps de la rotation et je fais le Z-buffer une fois la position figée...
Autre chose : Je ne souhaite pas avoir recours à du code ou du matériel natif... en clair 100% java.
Encore merci.
(z'êtes mes amis hein ?)
[^] # Re: performances...
Posté par Jylam / jylam.lnxsce (site web personnel) . Évalué à 2.
Donc assez simplement, un zbuffer, c'est tout bete. Quand tu rasterizes tes triangles (ou tes ce-que-tu-veux d'ailleur), tu interpoles les valeurs x et y de tes vertices. de V1 vers V2, de V1 vers V3 (moitié du haut), et de V2 vers v3 et V1 vers V3 (moitié du bas). Ca, je suppose que tu as deja fais.
Le zbuffer, c'est la meme chose, sachant que tu vas passer a ton rasterizer les valeurs Z des 3 vertices sus-nommés.
Tu vas alors interpoler tes 3 valeurs de la meme maniere, et n'afficher le pixel QUE si la valeur est inferieure a celle deja ecrire dans ton buffer. Si tel est le cas, tu inscris dans ton buffer cette nouvelle valeur Z, et tu passes au pixel suivant.
Avantage, tu as donc une precision de profondeur au pixel.
Desavantages, deja tu peux avoir un probleme de precision suivant la profondeur du buffer (on utilise en general les valeurs de 1/Z, de facon a etre plus precis pres de la camera, et moins au fond). Ensuite, cela t'oblige a reserver de la memoire de la meme taille X*Y que ton buffer d'affichage, multiplié par la precision (2 pour 16bits, 4 pour 32, etc).
Dernier probleme, les faces translucides poseront probleme si tu ne fait pas de cas particulier. (trier les faces translucides et les afficher APRES tout le reste, de facon a ne pas oublier d'afficher ce qui se trouve derriere).
Voila, ce n'est surement pas tres clair, mais tu peux voir que c'est quand meme extremement simple pour qui a deja realisé un rasterizer.
(oui et j'utilise plein de mots anglais)
[^] # Re: performances...
Posté par yaya . Évalué à 1.
déjà que mon moteur 3D est gourmand, ça va être coton.
(CF l'applet cité dans mon post précédent)
Je me demande si on ne pourrais pas optimiser ce comportement pour des objets plus spécifiques que des points ?
par exemple on pourrait considérer l'objet "segment de droite" dont le valeur à mettre en Zbuffer serait le Zbuffer du centre....
idem pour des triangles.
pour les points c'est plus simple.
Bien sûr cela serait assez inexact localement, mais si les objets sont suffisamment petits (taille des segments), ça pourrait être économique en CPU ?
[^] # Re: performances...
Posté par Antoine . Évalué à 5.
Dans ce cas pas besoin de se faire chier à utiliser un Zbuffer.
Tu peux utiliser l'algorithme du peintre, c'est-à-dire trier les primitives à afficher (polygones, etc...) de la plus lointaine à la plus proche en considérant par exemple le Z du barycentre de chaque primitive. Ensuite, tu traces les primitives dans l'ordre obtenu.
Mais le résultat en cas d'intersection risque d'être bien moche.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.