Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2015-03-10 11:47:00 utiliser push/popMatrix() pour définir des vertex est-il possible?

step
nouveau membre
Lieu: Angoulême
Date d'inscription: 2008-04-02
Messages: 9
Site web

utiliser push/popMatrix() pour définir des vertex est-il possible?



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

 

#2 2015-03-12 17:10:46 Re : utiliser push/popMatrix() pour définir des vertex est-il possible?

step
nouveau membre
Lieu: Angoulême
Date d'inscription: 2008-04-02
Messages: 9
Site web

Re: utiliser push/popMatrix() pour définir des vertex est-il possible?



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! smile

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024