Загрузка изображений в p5 для создания анимации и экспорта ее в виде видео

#javascript #animation #video #3d #p5.js

#javascript #Анимация #Видео #3D #p5.js

Вопрос:

Я пытаюсь загрузить набор изображений, затем для каждого изображения по отдельности создать анимацию, а затем экспортировать эту анимацию. Анимация — это просто вращающийся куб с изображением на одной стороне. На данный момент я могу загружать изображения в пакетном режиме, но затем я получаю и ошибка: "Cannot read properties of undefined (reading 'gifProperties')" которая, похоже, связана с texture() командой

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

 let plate;
let invisible_sides;
let invisible_up_down;

function setup() {
    createCanvas(800, 800, WEBGL);
    textSize(18);
    text("Select the images", 20, 20);
    inputbtn = createFileInput(FileSimple,"true");
    inputbtn.position(30, 40);
    //then i need additional elements: 
    invisible_sides = createGraphics(400,400); 
    invisible_up_down= createGraphics(400,400);  
    BOX_WIDTH = 400;
    BOX_HEIGHT = 400;
    BOX_DEPTH = 400;
}
 

Невидимые переменные, приведенные выше, просто предназначены для заполнения некоторых сторон куба невидимыми текстурами.

Затем мне нужно преобразовать данные файла в изображение, для этого я вызвал функцию FileSimple в моей настройке — createFileInput :

 function FileSimple(file){

if (file.type == 'image'){

    plate = createImg(file.data, '' )

}else{

    img = null;

} }
 

Затем я нашел в другом вопросе о переполнении стека этот ответ для анимации вращающегося куба с разными текстурами на разных сторонах: (Извините, я больше не могу найти канал)

  function drawFaceBox(boxWidth, boxHeight, boxDepth,
 front, top, right, bottom, left, back) {
   angleMode(DEGREES); 
   let w = boxWidth * SCALE_FACTOR;
   let h = boxHeight * SCALE_FACTOR;
   let d = boxDepth * SCALE_FACTOR;

   // Center the box.
   translate(-w / 2, -h / 2);

    texture(front);
    quad(0, 0, w, 0, w, h, 0, h);

    push();
    texture(left);
    translate(0, 0, -d);
    rotateY(-90);
    quad(0, 0, d, 0, d, h, 0, h);

    pop();
    push();
    texture(top);
    translate(0, 0, -d);
    rotateX(90);
    quad(0, 0, w, 0, w, d, 0, d);

    pop();
    push();
    texture(right);
    translate(w, 0, 0);
    rotateY(90);
    quad(0, 0, d, 0, d, h, 0, h);

    pop();
    push();
    texture(bottom);
    translate(0, h, 0);
    rotateX(-90);
    quad(0, 0, w, 0, w, d, 0, d);

    pop();
    push();
    texture(back);
    rotateY(180);
    translate(-w, 0, d);
    quad(0, 0, w, 0, w, h, 0, h);
  }
 

здесь у нас, похоже, проблема с действием текстуры.

Наконец, я хотел бы отобразить анимацию, поэтому я запустил функцию рисования как таковую:

 function draw(){
 background(255);

 drawFaceBox(BOX_WIDTH, BOX_HEIGHT, BOX_DEPTH,
 plate, invisible_up_down, invisible_sides, invisible_up_down, invisible_sides, 
 plate);   }
 

для части экспорта проекта я подумал об использовании этого руководства : https://stubborncode.com/posts/how-to-export-images-and-animations-from-p5-js /

большое вам спасибо за любую помощь, которую вы можете оказать

Комментарии:

1. Будет лучше, если вы будете задавать один вопрос за 1 раз. Проблема с загрузкой изображения и использованием at в качестве текстуры. 2. запись эскиза в виде видео.

2. Да, извините, сначала часть экспорта на самом деле не была вопросом, хотя я, вероятно, задам новый вопрос по этому поводу.

Ответ №1:

Проблема с вашим вызовом texture() заключается в том, что его параметр не должен быть нулевым или неопределенным. Вы можете решить эту проблему, установив по умолчанию пустую текстуру, если plate она еще не определена:

 const SCALE_FACTOR = 0.5;

let arial;
let plate;
let blank;

function preload() {
  arial = loadFont('https://www.paulwheeler.us/files/Arial.otf');
}

function setup() {
  createCanvas(windowWidth, windowHeight, WEBGL);
  textFont(arial);
  textSize(18);
  text("Select the images", 20, 20);
  inputbtn = createFileInput(FileSimple, "true");
  inputbtn.position(30, 40);
  //then i need additional elements:
  blank = createGraphics(400, 400);
  BOX_WIDTH = 400;
  BOX_HEIGHT = 400;
  BOX_DEPTH = 400;
}

function draw() {
  background(255);
  
  orbitControl(1, 1, 0.1);

  drawFaceBox(
    BOX_WIDTH,
    BOX_HEIGHT,
    BOX_DEPTH,
    // Don't pass null or undefined here because texture() will fail
    plate || blank,
    blank,
    blank,
    blank,
    blank,
    plate || blank
  );
}

function FileSimple(file) {
  if (file.type == "image") {
    plate = createImg(file.data, "");
  }
}

function drawFaceBox(
  boxWidth,
  boxHeight,
  boxDepth,
  front,
  top,
  right,
  bottom,
  left,
  back
) {
  angleMode(DEGREES);
  let w = boxWidth * SCALE_FACTOR;
  let h = boxHeight * SCALE_FACTOR;
  let d = boxDepth * SCALE_FACTOR;

  // Center the box.
  translate(-w / 2, -h / 2);

  texture(front);
  quad(0, 0, w, 0, w, h, 0, h);

  push();
  texture(left);
  translate(0, 0, -d);
  rotateY(-90);
  quad(0, 0, d, 0, d, h, 0, h);

  pop();
  push();
  texture(top);
  translate(0, 0, -d);
  rotateX(90);
  quad(0, 0, w, 0, w, d, 0, d);

  pop();
  push();
  texture(right);
  translate(w, 0, 0);
  rotateY(90);
  quad(0, 0, d, 0, d, h, 0, h);

  pop();
  push();
  texture(bottom);
  translate(0, h, 0);
  rotateX(-90);
  quad(0, 0, w, 0, w, d, 0, d);

  pop();
  push();
  texture(back);
  rotateY(180);
  translate(-w, 0, d);
  quad(0, 0, w, 0, w, h, 0, h);
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script> 

Комментарии:

1. Большое вам спасибо, кажется, это помогает, но мне было интересно, почему у меня есть диагонали моего квадрата? я хотел только стороны и, похоже, не могу понять, почему. Также я не понимаю, почему он также отображает изображение, которое я импортировал за пределы холста. Спасибо

2. Итак, я использовал noStroke(); чтобы убрать диагонали и все вершины моего куба, это сработало, но я все еще не понимаю, почему у меня были диагонали, и вторая часть моего вопроса все еще остается в силе, почему он также отображает изображение, которое я импортировал под ним?