如何在 p5js 中的视频上叠加形状?
How to overlay a shape on a video in p5js?
在 P5js 中,我想将一个形状叠加到视频中,但它们不共享相同的 dom 元素。
有什么办法吗?
Code test here: 视频应该可以通过切割形状的三角形轮廓看到。
代码:
let video;
function preload() {
video = createVideo("video.mp4");
}
function setup() {
createCanvas(400, 300);
background("gray");
video.size(400,400);
video.loop();
var w = width * 0.7;
var h = height * 0.7;
translate((width/2) - (w/2), (height/2) - (h/2));
fill("lightgray");
noStroke();
beginShape();
vertex(0, 0);
vertex(w, 0);
vertex(w, h);
vertex(0, h);
beginContour();
vertex(w * 0.2, h * 0.4);
vertex(w * 0.5, h * 0.8);
vertex(w * 0.8, h * 0.4);
endContour();
endShape();
noLoop();
}
我看到 here 隐藏视频并使用 image
(即 image(video, 10, 10)
)可以绘制单帧。唉,我使用 noLoop()
,在我的情况下,draw()
中的视频不会自动刷新。
"The video should be visible through the triangular contour that cuts the shape."
以下是我使用您的代码快速 play-around 得到的结果。
也许它在某些方面对您有用(例如: 提供了关于如何进行的新想法)。
代码的逻辑是简单地创建 2 层。
底层 1 是 video,顶层 2 是三角形(canvas)。
其他想法可能包括使用像 Screen 或 Multiply 这样的 BlendModes:
示例:canv.blendMode(SCREEN);
其中 SCREEN
使白色透明,MULTIPLY
使黑色透明)。
示例测试代码(制作两层并删除background("gray");
)
let video; let canv;
function preload()
{ video = createVideo("video.mp4"); }
function setup()
{
translate(0, 0);
video.size(400,300);
video.style("z-index: 1"); //# is default in P5.JS
video.position(0, (width * 0.7) );
video.loop();
canv = createCanvas(400, 400);
canv.style("z-index: 2");
canv.position(0, 0); //# important to have a setting
//# Not needed ....
//background("gray");
var w = width * 1;
var h = height * 1;
translate((width/2) - (w/2), (height/2) - (h/2));
fill("lightgray");
noStroke();
beginShape();
vertex(0, 0);
vertex(w, 0);
vertex(w, h);
vertex(0, h);
beginContour();
vertex(w * 0.2, h * 0.4);
vertex(w * 0.5, h * 0.8);
vertex(w * 0.8, h * 0.4);
endContour();
endShape();
noLoop();
}
在 P5js 中,我想将一个形状叠加到视频中,但它们不共享相同的 dom 元素。 有什么办法吗?
Code test here: 视频应该可以通过切割形状的三角形轮廓看到。
代码:
let video;
function preload() {
video = createVideo("video.mp4");
}
function setup() {
createCanvas(400, 300);
background("gray");
video.size(400,400);
video.loop();
var w = width * 0.7;
var h = height * 0.7;
translate((width/2) - (w/2), (height/2) - (h/2));
fill("lightgray");
noStroke();
beginShape();
vertex(0, 0);
vertex(w, 0);
vertex(w, h);
vertex(0, h);
beginContour();
vertex(w * 0.2, h * 0.4);
vertex(w * 0.5, h * 0.8);
vertex(w * 0.8, h * 0.4);
endContour();
endShape();
noLoop();
}
我看到 here 隐藏视频并使用 image
(即 image(video, 10, 10)
)可以绘制单帧。唉,我使用 noLoop()
,在我的情况下,draw()
中的视频不会自动刷新。
"The video should be visible through the triangular contour that cuts the shape."
以下是我使用您的代码快速 play-around 得到的结果。
也许它在某些方面对您有用(例如: 提供了关于如何进行的新想法)。
代码的逻辑是简单地创建 2 层。
底层 1 是 video,顶层 2 是三角形(canvas)。
其他想法可能包括使用像 Screen 或 Multiply 这样的 BlendModes:
示例:canv.blendMode(SCREEN);
其中 SCREEN
使白色透明,MULTIPLY
使黑色透明)。
示例测试代码(制作两层并删除background("gray");
)
let video; let canv;
function preload()
{ video = createVideo("video.mp4"); }
function setup()
{
translate(0, 0);
video.size(400,300);
video.style("z-index: 1"); //# is default in P5.JS
video.position(0, (width * 0.7) );
video.loop();
canv = createCanvas(400, 400);
canv.style("z-index: 2");
canv.position(0, 0); //# important to have a setting
//# Not needed ....
//background("gray");
var w = width * 1;
var h = height * 1;
translate((width/2) - (w/2), (height/2) - (h/2));
fill("lightgray");
noStroke();
beginShape();
vertex(0, 0);
vertex(w, 0);
vertex(w, h);
vertex(0, h);
beginContour();
vertex(w * 0.2, h * 0.4);
vertex(w * 0.5, h * 0.8);
vertex(w * 0.8, h * 0.4);
endContour();
endShape();
noLoop();
}