Outils pour utilisateurs

Outils du site


terrain

Création d'un terrain 3D

import peasy.PeasyCam;
 
PeasyCam cam;
 
int largeurGrille, longueurGrille;
int longueurTerrain, largeurTerrain;
int intervalle = 20;
float[][] terrain;
Maille[][] vecteurs;
 
public void settings() {
  size(800, 800, P3D);
}
 
void setup() {
  cam = new PeasyCam(this, 400);
  longueurTerrain = 1200;
  largeurTerrain = 1200;
  longueurGrille = longueurTerrain / intervalle;
  largeurGrille = largeurTerrain / intervalle;
  terrain = new float[largeurGrille][longueurGrille];
  for (int y = 0; y < longueurGrille; y++) {
    for (int x = 0; x < largeurGrille; x++) {
      terrain[x][y] = map(noise(x / 10.0, y / 10.0), 0, 1, -100, 100);
    }
  }
  vecteurs = new Maille[2 * largeurGrille - 2][longueurGrille - 1];
  println(vecteurs.length);
  for (int y = 0; y < longueurGrille - 1; y++) {
    for (int x = 0; x < largeurGrille - 1; x++) {
      vecteurs[2 * x][y] = new Maille(intervalle, x, y, terrain[x][y], terrain[x][y + 1], terrain[x + 1][y], false);
      vecteurs[2 * x + 1][y] = new Maille(intervalle, x + 1, y + 1, terrain[x + 1][y + 1], terrain[x][y + 1], terrain[x + 1][y], true);
    }
  }
}
 
void draw() {
  background(0);  
  rotateX(PI / 3);
  translate(-largeurTerrain / 2, -longueurTerrain / 2);
  stroke(255, 0, 0);
  noFill();
 
  for (int y = 0; y < longueurGrille - 1; y++) {
    beginShape(TRIANGLE_STRIP);
    for (int x = 0; x < largeurGrille; x++) {
      vertex(x * intervalle, y * intervalle, terrain[x][y]);
      vertex(x * intervalle, (y + 1) * intervalle, terrain[x][y + 1]);
    }
    endShape();
  }
  for (int y = 0; y < longueurGrille - 1; y++) {
    for (int x = 0; x < 2 * largeurGrille - 2; x++) {
      vecteurs[x][y].afficher();
    }
  }
}
 
class Maille {
  PVector position, direction;
  PVector i, j;
  PVector origine, point1, point2;
  int inter;
 
  Maille(int _inter, int x, int y, float u, float v, float w, boolean paire) {
    inter = _inter;
    origine = new PVector(x * inter, y * inter, u);
    if (paire) {
      i = new PVector(0, -inter, w - u);
      j = new PVector(-inter, 0, v - u);
    } else {
      i = new PVector(0, inter, v - u);
      j = new PVector(inter, 0, w - u);
    }
    direction = new PVector();
    PVector.cross(j, i, direction);
    direction.setMag(inter);
 
    PVector milieu = PVector.sub(j, i);
    milieu = milieu.div(2);
    PVector g = PVector.add(i, milieu);
    g = g.mult(2.0 / 3.0);
    position = new PVector(x * inter, y *inter, u);
    position.add(g);
  }
 
 
  void afficher() {
    pushMatrix();
    pushStyle();
    stroke(255);
    translate(position.x, position.y, position.z);
    line(0, 0, 0, direction.x, direction.y, direction.z);
    popStyle();
    popMatrix();
    /*
    pushMatrix();
    pushStyle();
    stroke(255, 0, 0);
    translate(origine.x, origine.y, origine.z);
    line(0, 0, 0, i.x, i.y, i.z);
    stroke(0, 255, 0);
    line(0, 0, 0, j.x, j.y, j.z);
    popStyle();
    popMatrix();*/
  }
 
  void eroder() {
 
  }
}

Inspiration

terrain.txt · Dernière modification: 2020/04/07 17:23 par Mushussu