2017-01-28 2 views
1

От 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-преобразованиях или камерах.

ответ

1

Вы вызываете функцию camera()после, вы сделали весь свой чертеж. Поэтому каждый кадр, вы делаете это:

  • Переместите объекты в своей сцене и сделайте снимок.
  • Теперь переместите камеру.

Итак, на кадре 90 вы рисуете свою сцену, а затем перемещаете камеру. Таким образом, на кадре 91 камера использует положение из последнего кадра.

Чтобы это исправить, просто переместить вызов camera() в , прежде чем вы рисуете все (но после того, как вы установите переменную x_up.

correctly rendered scenes

Смежные вопросы