Обработка: постоянство в прозрачном трехмерном объекте - PullRequest
1 голос
/ 20 апреля 2019

Ранее определенная форма (треугольник) появляется, но не сохраняется в трехмерном объекте (сфере), но остается снаружи.

Треугольник появляется в прозрачной сфере, но исчезает при следующем рендеринге. Для прозрачности я использовал включенный DEPTH_SORT.

// Aim of program: draw a stack of triangles that goes through a transparent 3D sphere
// Problem: stack not visible inside the sphere

float y;
float x;
float r_sphere = 200;
float up_down = -0.5;

void setup() {

  size(1100, 800, P3D);
  background(0);
  hint(ENABLE_DEPTH_SORT); // option that allows transparency
  fill(0, 40); // alpha parameter for transparency

  x = width/2;
  y = height/2+r_sphere+20;
}

void draw() {

  // 1. draw stack of triangles in new referential
  pushMatrix();

  // define new referential for the triangle at each rendering
  translate(x, y);
  y = y+=up_down;
  // draw the triangle that should persist
  stroke(220, 150, 25);
  strokeWeight(2);
  triangle(0, 0, 90, 0, 70, 30);

  popMatrix();

  // 2. draw the transparent sphere in the initial referential

  translate(width/2, height/2);
  strokeWeight(0.1);
  stroke(155, 220, 220);
  sphere(r_sphere);
}

result

1 Ответ

3 голосов
/ 20 апреля 2019

Проблема со скрытым стеком треугольников вызвана сферой, которая рисуется каждый раз, когда вызывается ничья.Даже если прозрачность установлена ​​на 40, повторяющиеся сферы суммируются, чтобы скрыть все, кроме последнего треугольника, который нарисован поверх всех, кроме самой последней сферы.

Чтобы увидеть, как совокупный эффект сфер скрывает стопку треугольниковустановите альфа на меньшее число.Установив альфа на 5 вместо 40, мы видим короткий след стека треугольников:

fill(0, 5); // alpha parameter for transparency

Если мы изменим альфа на 2, мы получим короткий след, и стек треугольников, кажется, никогда не станет полностью затененным.

Sphere and triangles at alpha of 2

Другой подход к рисованию без наложения стека треугольника - рисовать сферу только один раз.

if (frameCount < 2){
  // 2. draw the transparent sphere in the initial referential 
  translate(width/2, height/2);
  strokeWeight(0.1);
  stroke(155, 220, 220);
  sphere(r_sphere);
}

Это сделаетстопка треугольников видима, но, вероятно, не дает визуального эффекта, который вы ищете, поскольку два треугольника оказываются перед сферой, а не внутри нее.

Третий подход - перерисовать весь стектреугольников снизу вверх до текущей позиции y, а затем рисовать сферу каждый раз, когда вызывается рисование.

Я изменил ваш код, чтобы принять такой подход:

float y;
float x;
float r_sphere = 200;
float up_down = -0.5;

void setup() {

  size(1100, 800, P3D);
  background(0);
  hint(ENABLE_DEPTH_SORT); // option that allows transparency
  fill(0, 40); // alpha parameter for transparency
  x = width/2;
  y = height/2+r_sphere+20;
}

void draw() {

    if (frameCount > height + r_sphere+20){
      noLoop();
    } else {
     background(0);
    }

  // 1. draw stack of triangles in new referential
  // define new referential for the triangle at each rendering
  y = height/2+r_sphere+20;
  for (int i = 0; i < frameCount; i++){
    pushMatrix();
    translate(x, y, 0);
    y = y+=up_down;
    // draw the triangle that should persist
    stroke(220, 150, 25);
    strokeWeight(2);
    triangle(0, 0, 90, 0, 70, 30);
    popMatrix();
  }
  // 2. draw the transparent sphere in the initial referential
  translate(width/2, height/2);
  strokeWeight(0.1);
  stroke(155, 220, 220);
  sphere(r_sphere);
}

Я считаю, что этоПоследний подход наиболее близок к моделированию прозрачной физической сферы и стопки полностью непрозрачных треугольников.Визуальный эффект не такой захватывающий, как в первом подходе, когда альфа установлена ​​на низкое число, поскольку мы не видим стек треугольников как пустоту.

...