如何在p5.js的box()的每一面保留不同的图片?

2022-06-30 00:00:00 p5.js canvas javascript processing

作为P5.js的初学者,我正在尝试制作一个交互式骰子,现在唯一的问题是在立方体的每一面都保持不同的面孔。

以下是我的代码:

let sizeOfCube = 400, img;

function preload() {
    img = loadImage("olo/fgfg.jpg");
}

function setup() {
    createCanvas(windowWidth, windowHeight, WEBGL);
}

function draw() {
    background(250);
    translate(0, 0, sizeOfCube);
    if (sizeOfCube > 100) {
        sizeOfCube -= 10;
    }
    rotateX(frameCount * 0.1);
    rotateY(frameCount * (0.1));
    rotateZ(frameCount * 0.1);
    texture(img);
    box(70, 70, 70);
}

此代码添加图像,但应用于所有侧面。是否有方法将6个图像添加到全部6面?

有关演示(纹理和其他),请访问hereMight take some time to load. Please wait!

有什么建议或替代方法吗?请一定要说出来。


解决方案

我这里有一个有效的解决方案。我尝试了上面的建议,使用四边形,并使用纹理和旋转逐个绘制每个脸。我还将draFaceBox函数抽象出来,以便您可以通过传入您自己的维度轻松地重用它。

function preload() {
  BOX_WIDTH = 1083;
  BOX_HEIGHT = 1457;
  BOX_DEPTH = 345;
  FRONT_IMG = loadImage('images/front.png');
  LEFT_IMG = loadImage('images/left.png');
  TOP_IMG = loadImage('images/top.png');
  RIGHT_IMG = loadImage('images/right.png');
  BOTTOM_IMG = loadImage('images/bottom.png');
  BACK_IMG = loadImage('images/back.png');
}

function setup() {
  createCanvas(windowWidth, windowHeight, WEBGL);
  // Make sure the box always fit the screen.
  SCALE_FACTOR = windowHeight / 2 /
      Math.max(Math.max(BOX_WIDTH, BOX_HEIGHT), BOX_DEPTH);
}

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(50);

  // Simple rotation control by mouse.
  rotateX(mouseY);
  rotateY(-mouseX);

  drawFaceBox(BOX_WIDTH, BOX_HEIGHT, BOX_DEPTH,
      FRONT_IMG, TOP_IMG, RIGHT_IMG, BOTTOM_IMG, LEFT_IMG, BACK_IMG);
}

相关文章