Pages: 1
Bonjour à tous,
Pour modéliser un toroid (tore, torus...), je me suis d'abord inspiré de ce code d'Ira Greenberg : https://github.com/processing/processin … Toroid.pde
Mais..., en voulant notamment ajouter des torsions, je me suis rendu compte que je ne comprenais pas tout à fait ce code, à la fois par rapport à de la trigonométrie en 3D (!) mais aussi pour modéliser avec des vertex dans l'espace.
J'ai changé ma méthode et écrit le programme joint avec des push/popMatrix(). Je le trouve plutôt simple, et il semble que je le maîtrise bien, l'intérêt pour moi étant de pouvoir le décliner au maximum par la suite.
Malheureusement, je n'ai aucune idée de comment introduire les vertex avec cette approche, et je ne sais même pas si cela est possible.
Merci d'avance pour toutes vos réponses.
int segments, ringRadius; int sides, ringWeight; float scaleFactor; void setup() { size(800, 800, P3D); stroke(255); fill(255); rectMode(CENTER); segments = 15; ringRadius = 200; sides = 5; ringWeight = 10; scaleFactor = 1; } void draw() { ///* hint(DISABLE_DEPTH_TEST); camera(); noLights(); // 2D code background(0); hint(ENABLE_DEPTH_TEST); //*/ lights(); translate(width/2, height/2, 0); scale(scaleFactor); rotateY(mouseX*PI/300); rotateX(mouseY*PI/300); float thetaSegments = TWO_PI / segments; float thetaSides = TWO_PI / sides; //beginShape(); for (int i = 0; i < segments; i++) { float x = cos(thetaSegments * i) * ringRadius; float y = sin(thetaSegments * i) * ringRadius; pushMatrix(); translate(x, y); for (int j = 0; j < sides; j++) { float x2 = cos(thetaSides * j) * ringWeight; float y2 = sin(thetaSides * j) * ringWeight; pushMatrix(); rotateX(PI/2); rotateY((thetaSegments * i)); translate(x2, y2); point(0, 0, 0); popMatrix(); } popMatrix(); } //endShape(); } void mouseWheel(MouseEvent e) { scaleFactor += e.getAmount() / 20; } void keyPressed() { if (keyPressed) { if (key == 's' || key == 'S') { save(millis()+".jpg"); } } }
Dernière modification par step (2015-03-10 12:53:49)
Hors ligne
Je continue mon exploration. J'ai découvert qu'il existe une (discrète) fonction modelX/Y/Z qui permet de récupérer les coordonnées x, y, z des points dans l'espace après des transformations contenues dans des push/popMatrix(). Ca marche, mais pas encore tout à fait : le toroid est bien restitué mais sa taille et son centre sont incorrects dans le code ci-dessous.
Quant aux vertex, je ne vois toujours pas comment, ce qui n'aide pas non plus à bien visualiser.
int segments = 15; int ringRadius = 200; int sides = 5; int ringWeight = 10; float scaleFactor = 1; //vertices PVector[][] vertices = new PVector[segments][sides]; void setup() { size(800, 800, P3D); stroke(255); fill(255); rectMode(CENTER); for (int i = 0; i < segments; i++) { for (int j = 0; j < sides; j++) { vertices[i][j] = new PVector(); } } } void draw() { ///* hint(DISABLE_DEPTH_TEST); camera(); noLights(); // 2D code background(0); hint(ENABLE_DEPTH_TEST); //*/ lights(); pushMatrix(); translate(width/2, height/2, 0); scale(scaleFactor); rotateY(mouseX*PI/300); rotateX(mouseY*PI/300); float thetaSegments = TWO_PI / segments; float thetaSides = TWO_PI / sides; for (int i = 0; i < segments; i++) { pushMatrix(); float xi = cos(thetaSegments * i) * ringRadius; float yi = sin(thetaSegments * i) * ringRadius; translate(xi, yi); for (int j = 0; j < sides; j++) { pushMatrix(); float xj = cos(thetaSides * j) * ringWeight; float yj = sin(thetaSides * j) * ringWeight; rotateX(PI/2); rotateY((thetaSegments * i)); translate(xj, yj); point(0, 0, 0); vertices[i][j].x = modelX(0, 0, 0); vertices[i][j].y = modelY(0, 0, 0); vertices[i][j].z = modelZ(0, 0, 0); popMatrix(); } popMatrix(); } popMatrix(); pushMatrix(); for (int i = 0; i < segments; i++) { for (int j = 0; j < sides; j++) { //vertex(vertices[i][j].x, vertices[i][j].y, vertices[i][j].z); stroke(255, 0, 0); point(vertices[i][j].x, vertices[i][j].y, vertices[i][j].y); stroke(255); } } popMatrix(); } void mouseWheel(MouseEvent e) { scaleFactor += e.getAmount() / 20; } void keyPressed() { if (keyPressed) { if (key == 's' || key == 'S') { save(millis()+".jpg"); } } }
help!
Hors ligne
Pages: 1