От this Github issue:PGraphics позиционирование камеры происходит только в следующем кадре
Компьютерные спецификации: 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 кадров. Если вы посмотрите на выходную папку, вы увидите что-то вроде этого в кадре 90:
и что-то вроде этого в кадре 91:
Обратите внимание, что вы можете сказать это только камера, потому что оба атрибута (синий и камера x_up) изменены в кадре 90, но только на кадре 91 отображается изменение в камере. Кадр 90 правильно показывает синюю заливку в обоих коробках. Это происходит, даже если я установил частоту кадров в 1. Это также произойдет, если я использую pg.save
вместо saveFrame
.
Это ошибка? Я мог бы пропустить что-то очевидное, но я не эксперт в 3D-преобразованиях или камерах.