Bonjour à tous !
Je découvre depuis peu Processing, et suis en train d'étudier l'exemple "extrusion" fourni par défaut. Le code permet de faire "éclater" les pixels d'une image plane, selon leur brillance (* voir code ci-dessous). Plusieurs questions me viennent, auxquelles je n'arrive pas encore à répondre :
- est-il possible de remplacer la caractéristique "brightness" par une autre, qui agirait sur une autre information contenue dans les pixels ?
- comment faire pour obtenir les coordonnées dans l'espace de chaque pixel de l'image transformée, et les réinjecter dans un logiciel de simulation 3D, de manière à avoir une pré-modélisation d'objet?
Cette question de transfert entre Processing et un logiciel de modélisation 3D m'intéresse particulièrement. N'hésitez pas à soumettre la moindre piste en rapport ! Merci d'avance pour votre partage précieux, vive le web opensource et à bientôt j'espère
*Code par défaut :
PImage extrude;
int[][] values;
float angle = 0;
void setup() {
size(640, 360, P3D);
extrude = loadImage("nom_image_stockee_dans_data.jpg");
extrude.loadPixels();
values = new int[extrude.width][extrude.height];
for (int y = 0; y < extrude.height; y++) {
for (int x = 0; x < extrude.width; x++) {
color pixel = extrude.get(x, y);
values[x][y] = int(brightness(pixel));
}
}
}
void draw() {
background(0);
angle += 0.005;
translate(width/2, 0, -128);
rotateY(angle);
translate(-extrude.width/2, 100, -128);
for (int y = 0; y < extrude.height; y++) {
for (int x = 0; x < extrude.width; x++) {
stroke(values[x][y]);
point(x, y, -values[x][y]);
}
}
}
Hors ligne
Bonjour et bienvenu !
je vais tenter de répondre au mieux à tes questions.
citation :
- est-il possible de remplacer la caractéristique "brightness" par une autre, qui agirait sur une autre information contenue dans les pixels ?
oui, en principe processing te permet de faire tout et n'importe quoi
ici tu pourras changer brightness par saturation par ex. + d'info dans les ref p5 :http://processing.org/reference/
citation :
- comment faire pour obtenir les coordonnées dans l'espace de chaque pixel de l'image transformée, et les réinjecter dans un logiciel de simulation 3D, de manière à avoir une pré-modélisation d'objet?
Il existe des librairies capable d'exporter ton rendu sous differents formats 3D:
citation :
» supercad
by Guillaume Labelle
Lets you export code to many 3d formats such as AutoCAD, Rhino, or SketchUP.
ça devrait t'éviter de calculer la position de chaque pixel dans ton image...manip un peu lourde à faire :
PGraphics3 pg3; void setup() { size(400,400,P3D); pg3=(PGraphics3)g; } void draw() { .. stuff .. color c=get(x,y); float z=pg3.zbuffer[x+y*width]; // z-value is a float }
(merci à JohnG pour ce code trouvé sur le forum P5).
bonne suite.
Dernière modification par oyster_twiter (2011-02-27 22:12:10)
Hors ligne
Hello oyster_twiter !
Merci beaucoup pour l'accueil, et la réponse rapide !
J'ai compris ta réponse à ma 1ère question, et suis en train de me plonger dans les nombreuses refs, c'est super pour découvrir!
Pour la 2ème réponse, j'ai du mal à y croire tant tu me rends un grand service. Au stade de mes connaissances minimes, j'avoue ne pas encore savoir quoi faire précisément de tes précieuses ressources, même si je suis en train de tester différentes manips.
J'ai téléchargé la librairie de Guillaume Labelle sans souci, mais je ne suis même pas sûr de savoir où la placer encore... de même pour ce code miracle que tu m'as généreusement déniché, s'agit-il d'un fichier à sauver à part, où à intégrer dans mon code extrusion?
J'ai lu aussi qu'il fallait que je colle le code suivant :
beginRaw("superCAD.exportFormat", "outputPath.ext"); [...] endRaw();
dans ma méthode draw(), mais là encore je manipule un peu trop de manière hasardeuse... jusqu'ici je l'ai collé comme ça dans mon code d'origine:
...
void draw() {
background(255);
beginRaw("superCAD.exportFormat", "outputPath.ext"); [...] endRaw()
// Update the angle
angle += 0.02;
...
même si jusqu'ici rien ne marche, ça se tient? Je pose sans doute des questions évidentes du fait de mon niveau très très débutant, et je crains d'être au stade où, pour le 1er essai, je nécessite un pas-à-pas un peu galère presqu'au clic près... m'enfin je travaille pour y remédier!
Merci d'avance si tu as le temps de te plier à un décorticage laborieux de ta 1ère réponse, et en tous les cas merci encore pour tout, grâce à toi je sens la voie toute proche ! Bonne soirée et à bientôt !
Hors ligne
Salut,
J'ai pas trop de temps à t'accorder tout de suite, mais je peux essayer de faire avancer le Schmilblick un tant soit peu.
Tu dis que tu n'es pas sûr d'avoir bien placé ta librairie ... normalement tu a un dossier sketchbook quelque part, en principe c'est là que l'on sauvegarde les sketchs.
A l'intérieur de sketchbook il y a un dossier 'libraries' .
Tu places ta librairie dedans, ce qui devrait te donner :
citation :
|_libraries
|_superCad
|_library
|_superCad.jar
|_src ...
si la lib est correctement installée tu devrais la voir apparaître dans processing -> sketch -> import library.
L'exemple qui est proposé sur la page d'accueil de superCAD est plutôt explicite...Je vois pas bien ce que tu as pris/laissé de côté...le mieux serait que tu montres ton code, pour qu'on puisse te dire ou le bât blesse.
+++
Hors ligne
Merci encore !
C'est vraiment sympa de se pencher sur le problème.
La lib apparaît bien dans Processing, merci pour le détail. Par contre je n'ai clairement pas assez de connaissances encore, alors je bidouille mon sketch, j'essaye de rester le plus possible logique en attendant mieux... voilà mon code modifié pour le moment :
PImage extrude;
int[][] values;
float angle = 0;
PGraphics pg;
void setup()
{
size(640, 360, P3D);
extrude=(PImage)g;
pg=(PGraphics)g;
extrude = loadImage("image.jpg");
extrude.loadPixels();
values = new int[extrude.width][extrude.height];
for (int y = 0; y < extrude.height; y++) {
for (int x = 0; x < extrude.width; x++) {
color pixel = extrude.get(x, y);
values[x][y] = int(brightness(pixel));
}
}
}
void draw()
{
background(0);
beginRaw("superCAD.exportFormat", "outputPath.ext"); endRaw();
angle += 0.005;
translate(width/2, 0, -128);
rotateY(angle);
translate(-extrude.width/2, 100, -128);
for (int y = 0; y < extrude.height; y++) {
for (int x = 0; x < extrude.width; x++) {
stroke(values[x][y]);
point(x, y, -values[x][y]);
color c=get(x,y);
float z=pg.zbuffer[x+y*width]; // z-value is a float
}
}
}
Le message d'erreur que j'ai est "pg.zbuffer cannot be resolved or is not a field"... je vois bien à quelle ligne ça cloche mais je comprends déjà pas ce que je fais, donc difficile de résoudre le problème
J'espère ne pas trop écrire n'importe quoi avec mes copier-coller...
+++ et merci !
Hors ligne
Salut void-draw,
citation :
J'espère ne pas trop écrire n'importe quoi avec mes copier-coller...
...bon
En fait il manque quelques trucs pour que ça marche. Je veux bien t'aiguiller, mais je penses qu'il faudrait que tu zyeutes un peu le floss manual en français par exemple
peut-être commencer simplement...
Ici dans le code que tu fais suivre, il manque l'essentiel : si tu veux utiliser une librairie dans processing, il faut que tu l'importes :
import superCAD.*;
Si ce que tu souhaites c'est d'exporter une forme 3D pour pouvoir la retravailler dans un autre soft, alors tu n'as pas besoin de passer par zbuffer ... il te suffit de conserver le code de l'exemple 'extrusion' et d'y ajouter les parties spécifiques à la lib SuperCAD.
Cette partie :
PGraphics3 pg3; void setup() { size(400,400,P3D); pg3=(PGraphics3)g; } void draw() { .. stuff .. color c=get(x,y); float z=pg3.zbuffer[x+y*width]; // z-value is a float }
Il ne faut pas essayé de l'implémenter, c'était pour te montrer au contraire que ça risquait d'être galère...
Bon essaye de repartir simplement sur extrusion et puis import supercad etc.
bonne suite.
Dernière modification par oyster_twiter (2011-02-28 21:10:57)
Hors ligne
Salut à toi oyster_twiter !
Bon, j'ai encore pas mal de boulot ... je lis déjà des manuels sur Processing, mais je veux aller plus vite que la musique et tu as raison de me le rappeler. J'espérais juste pouvoir avancer rapidement sur cet exemple précis (avec de l'aide ), puisque sans lui malheureusement toutes mes expérimentations majeures sont condamnées à stagner.
Comme tu le dis, je souhaite juste exporter la forme de mon image "extrusée", même si visiblement ce n'est pas si simple. Ce que j'avoue ne pas saisir, c'est lorsque tu me dis que je n'ai pas besoin de passer par zbuffer, alors que dans les parties spécifiques à la lib SuperCAD que tu me donnes gracieusement, il y a justement une ligne qui fait appel à zbuffer?
J'ai continué les essais et réussi à exporter en divers formats, seulement ces fichiers sont vides, il y a un message d'erreur qui m'explique que SuperCAD "only supports lines and triangles". Peut-être que ce que j'essaye de faire n'est tout simplement pas possible.
Je continue mes recherches et lectures, merci pour ta patience et ta générosité! A bientôt!
Hors ligne
Bon, malheureusement je n'avance pas sur ce fameux code. ça semble simple en pratique, mais impossible pour moi d'exporter mon rendu extrusion sur un log 3D, quel qu'il soit.
Si quelqu'un a la patience et la générosité pour se pencher davantage sur ce problème auquel j'attache beaucoup d'importance, ça me permettrait de grandes avancées par la suite.
Merci d'avance à tous.
Hors ligne
Salut ,
J'ai essayé de croiser les sketches 'extrusion' et l'exemple 1 de la lib SuperCad.
J'ai rencontré une erreur car pour l'instant supecad n'accepte pas la fonction point() de processing, donc c'est impossible actuellement d'exporter dans un des formats que propose supercad avec des points. Il existe peut être d'autres solutions (autres librairies...) à voir.
J'ai par conter réussi à exporter dans un format sketchup à partir du moment ou j'ai remplacer point() par line(). Ce qui ne rend pas grand chose visuellement je te l'accorde.
voici le code mix :
/** * Extrusion. * * Converts a flat image into spatial data points and rotates the points * around the center. */ import superCAD.*; String cadSoftware, ext; boolean record = false; PImage extrude; int[][] values; float angle = 0; void setup() { size(640, 360, P3D); // Load the image into a new array extrude = loadImage("ystone08.jpg"); extrude.loadPixels(); values = new int[extrude.width][extrude.height]; for (int y = 0; y < extrude.height; y++) { for (int x = 0; x < extrude.width; x++) { color pixel = extrude.get(x, y); values[x][y] = int(brightness(pixel)); } } } void draw() { background(0); // Update the angle angle += 0.005; if(record) beginRaw("superCAD."+cadSoftware, "output."+ext); // Rotate around the center axis translate(width/2, 0, -128); rotateY(angle); translate(-extrude.width/2, 100, -128); // Display the image mass for (int y = 0; y < extrude.height; y++) { for (int x = 0; x < extrude.width; x++) { stroke(values[x][y]); line(x, y, x+10, y+10); // pour l'instant supercad n'accepte pas pour l'instant la fonction point() //point(x, y, -values[x][y]); } } if (record) { endRaw(); record = false; } } void keyPressed() { switch(key) { case 'r': cadSoftware = "Rhino"; ext = "rvb"; break; case 's': cadSoftware = "SketchUP"; ext = "rb"; break; case 'a': cadSoftware = "AutoLISP"; ext = "lsp"; break; case 'p': cadSoftware = "PovRAY"; ext = "pov"; break; case 'm': cadSoftware = "Maya"; ext = "mel"; break; case 'o': cadSoftware = "ObjFile"; ext = "obj"; break; case 'c': cadSoftware = "ArchiCAD"; ext = "gdl"; break; } record = true; }
+++
Hors ligne
Salut oyster_twiter!
Tout d'abord MERCI de chercher avec et pour moi ! Sans toi je me sentirais bien seul sur ce problème.
Tu as rencontré la même erreur que moi avec la fonction point(), comme je le craignais ça tient de la librairie. Néanmoins tu as déjà réussi à faire fonctionner le code avec line(), et même si ça change le rendu c'est déjà une avancée pour moi.
J'ai essayé ton code sur une image, et le fichier .rb pèse presque 50 Mo, quand les fichiers par défaut de SketchUp pèsent entre 1 et 5 Ko. J'ai placé ce fichier obtenu via Processing dans C:/Program Files/Google/Google SketchUp 8/Plugins mais sans surprise, cela fait bugger SketchUp.
Par contre, en faisant le même essai avec l'exemple 1 d'Autocad, qui joue sur des formes et n'importe pas d'image, le fichier .rb pèse 259 Ko et s'ouvre impeccablement avec SketchUp. D'après ce constat, j'ai peur de ne pas pouvoir gérer d'images avec cette manip depuis Processing, d'autant qu'après l'opération d'extrusion elle est en général complexe.
Suite au problème de la fonction point(), j'avais cherché d'autres librairies pour exporter de la 3D, et j'étais tombé sur cette adresse : http://processing3d.com/ ainsi que la librairie Anar+ (qui a l'air d'intégrer Autocad?) http://anar.ch/ qui dit notamment gérer les "Geometric datastructure (groups, objects, faces, lines, points)" dont les points...
J'ai l'impression qu'il y a une vraie voie en ce sens, n'hésite pas à me dire si je me trompe. Je tente de décortiquer le tutorial, qui gère effectivement des points avec la fonction Pt.create(), même si malheureusement il n'importe pas une image comme moi. Apparemment cette fonction permet de créer une "Transmigration Operation", qui m'a tout l'air d'être le principe du code extrusion, non?
Merci pour ta lecture et ton secours de si bon matin, et à bientôt j'espère !
Hors ligne
Re !
Anar+ est visiblement un super kit de librairies, avec un site très complet, rien que les exemples valent le coup d'oeil. Et au passage, il a été créé par Nembrini... et Guillaume Labelle
Sur la page http://anar.ch/info/tutorial:3dobjects, il intègre justement un exemple d'extrusion! Peut-être qu'on approche d'une solution?!
Par contre comme je ne suis pas encore capable de faire fonctionner ce super exemple en y intégrant mon image. Je continue mes recherches, et reste ouvert au moindre conseil !
Hors ligne
Pages: 1