PGraphics相机定位仅发生在下一帧

时间:2017-01-28 17:05:27

标签: rendering processing

  

来自this Github issue

计算机规格:Mac OS Sierra 10.12.3,处理3.2.3

在处理PGraphics相机中使用动态值时,这些只会应用于下一个框架中。我无法将当前帧保存到文件中,此偏移量不是问题。这是预期的行为吗?

请考虑以下代码:

  • 它将显示旋转立方体,红色旋转方块和当前帧数。
  • 有一个x_up全局变量控制相机中的值(默认为0.0)。
  • 如果frameCount % 90 == 0
    • 更改x_up(从0.0到1.0)。
    • 将填充更改为透明蓝色。
    • 保存文件"output/#####_" + x_up + "_.png"(例如:00090_1.0_.png
  • 如果frameCount % 90 == 1
    • 保存另一个具有相同约定,无填充,无x_up更改的文件(例如:00091_0.0_.png
PGraphics pg;
PMatrix mat_scene;
float x_up;

void setup() {
  size(600, 600, P3D);
  pg = createGraphics(width, height, P3D);
  mat_scene = getMatrix();
}

void draw() {
  pg.beginDraw();
  pg.hint(DISABLE_DEPTH_TEST);
  pg.background(200);
  pg.noFill();

  // change stuff if frame % 90
  if (frameCount % 90 == 0) {
    x_up = 1.0;
    pg.fill(0, 0, 255, 10);
  } else {
    x_up = 0.0;
  }

  // the red rect
  pg.pushMatrix();
  pg.setMatrix(mat_scene);
  pg.stroke(255, 0, 0);
  pg.rectMode(CENTER);
  pg.translate(width * .5, height * .5, -600);
  pg.rotateZ(radians(float(frameCount)));
  pg.rect(0, 0, 600, 600);
  pg.popMatrix();

  // the cube
  pg.pushMatrix();
  pg.stroke(128);
  pg.translate(10, 100, -200);
  pg.rotateZ(radians(float(frameCount)));
  pg.box(300);
  pg.popMatrix();

  // the camera
  pg.beginCamera();
  pg.camera(width, height, -height, 0, 0, 0, x_up, 0.0, 1.0);
  pg.endCamera();

  // the frame counter
  pg.pushMatrix();
  pg.fill(255);
  pg.setMatrix(mat_scene);
  pg.textSize(20);
  pg.text(frameCount, 20, 30);
  pg.popMatrix();

  pg.endDraw();

  image(pg, 0, 0);

  if (frameCount > 10 && frameCount % 90 == 0) {
    saveFrame("output/#####_" + x_up + "_.png");
  }

  if (frameCount > 10 && frameCount % 90 == 1) {
    saveFrame("output/#####_" + x_up + "_.png");
  }
}

你可以看到每90帧发生一次“blip”。如果查看输出文件夹,您将在第90帧中看到类似的内容:

在第91帧中有类似的内容:

请注意,您可以告诉它仅相机,因为在第90帧中更改了两个属性(蓝色和相机x_up),但只有第91帧显示相机中的更改。框架90正确显示两个框中的蓝色填充。即使我将帧速率设置为1,也会发生这种情况。如果我使用pg.save代替saveFrame,也会发生这种情况。

这是一个错误吗?我可能会遗漏一些明显的东西,但我不是3D变换或相机的专家。

1 个答案:

答案 0 :(得分:1)

您已经之后调用camera()函数,您已完成所有绘图。所以每一帧,你都这样做:

  • 移动场景中的对象并拍照。
  • 现在移动相机。

因此,在第90帧,您绘制场景,然后移动相机。所以在第91帧,相机正在使用最后一帧的位置。

要解决此问题,只需将您的电话号码移至camera(),然后即可绘制所有内容(但在设置x_up变量后。

correctly rendered scenes