在WEBGL画布中使用可变字体,p5 js。

问题描述 投票:1回答:1

我有一个WEBGL画布,我正在其中加载一个3D模型。我还有一个用createP创建的可变字体的文本。问题是,我需要将文本置于背景和三维模型之间。但我只能让文字在画布的前面(3d模型的顶部)。有什么办法可以实现这个目标吗?

Ps. 用text()创建文本不允许我有可变的权重值。

let kalameh;
var cnv;
let img;

function preload(){
    img = loadImage('assets/lines.png');
    kalameh = loadModel('kalameh.obj');  
}

function setup() {
    cnv = createCanvas(700, 700, WEBGL);
    var x = (windowWidth - width) / 2;
    var y = (windowHeight - height) / 2;
    cnv.position(x, y);

    wordA = createP('my text');
}

function draw() {
    background(220, 220, 220);

    wordA.style('font-size', '110px');
    wordA.style('font-weight', '200');
    wordA.style('font-stretch', '200%');
    wordA.style('align', 'center');
    wordA.position(40,25);

    image(img, -1*windowWidth/2, -1*windowHeight/2, windowWidth, windowHeight);

    translate (0,0,100);

    pointLight(255,255,255, -350,0,400);
    pointLight(255,255,255, 350,0,400);


    ambientMaterial(255);
    noStroke();


    scale (0.25);
    model(kalameh);

}
javascript html 3d webgl p5.js
1个回答
1
投票

您可以创建两个草图(从而创建两个画布),并将其分配给我。z-index 的特性 -11 使它们分别成为前景和背景草图。然后,您可以将您创建的段落元素夹在两个画布之间,给它一个 z-index0. 然后你可以通过调用 clear() 在绘制循环的开头。

在下面的代码片段中,3D对象在文本段落的前面,而 "背景 "的白色方块在文本的后面。

let testP;

new p5(function(p){
 
    p.setup = function() {
      const foregroundCanvas = p.createCanvas(400, 400, p.WEBGL);
      foregroundCanvas.id("foregroundSketch");
      foregroundCanvas.position(0, 0);
      p.normalMaterial();
      
      testP = p.createP("In front of background / behind object ")
      testP.position(95, 115);
      testP.id("sandwichedParagraph")
      p.angleMode(p.RADIANS)
    }
 
    p.draw = function() {
        p.clear();
        //drag to move the world.
        // p.orbitControl();
        p.push();
        let rotateAngle = p.sin(p.frameCount/50);
        p.rotateX(rotateAngle/2);
        p.rotateY(-rotateAngle);
        p.rotateZ(rotateAngle);
        p.box(200, 100, 40);
        p.pop();
    }
}, "foregroundSketch");



new p5(function(p){
 
    p.setup = function() {
      const backgroundCanvas = p.createCanvas(400, 400);
      // backgroundCanvas.parent("wrapper")
      backgroundCanvas.position(0, 0);
      backgroundCanvas.id("backgroundSketch")
      
      p.noStroke();
    }
    p.draw = function() {
        p.background(200);
        let shiftAmount = p.map(p.sin(p.frameCount/60), -1, 1, 80, 310);
        p.rect(shiftAmount, 120, 40, 40);
    }
}, "backgroundSketch");
html, body {
  margin: 0;
  padding: 0;
}

/* The sketch with the white square has z-index of -1 (background!) */
#backgroundSketch {
  z-index: -1;
  position: absolute;
}

/* The <p> has z-index of 0 (sandwiched between both sketches)*/
#sandwichedParagraph {
  z-index: 0;
  position: absolute;
}

/* The sketch with the object has z-index of 1 (foreground!)*/
#foregroundSketch {
  z-index: 1;
  position: absolute;
}
<!DOCTYPE html>
<html lang="en">
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.10.2/p5.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.10.2/addons/p5.sound.min.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
    <meta charset="utf-8" />

  </head>
  <body>
    <script src="sketch.js"></script>
  </body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.