您可以使用pushMatrix();隔离您的两个坐标空间(3D,然后是顶部的“2D” );和弹出矩阵();
这是 LoadDisplaySVG 示例的修改版本:
PShape bot;
void setup() {
size(640, 360,P3D);
bot = loadShape("bot1.svg");
}
void draw(){
background(102);
pushMatrix();//3D
translate(width * .5,height *.5,-150);
rotateX(map(mouseX,0,width,-PI,PI));
rotateY(map(mouseY,0,height,PI,-PI));
box(150);
popMatrix();
pushMatrix();//2D
shape(bot, 110, 90, 100, 100); // Draw at coordinate (110, 90) at size 100 x 100
shape(bot, 280, 40); // Draw at coordinate (280, 40) at the default size
popMatrix();
}
我对调用进行了缩进,以便更容易发现坐标系是如何隔离的。在幕后,基本的矩阵乘法部分已为您完成。只需将推送/弹出矩阵调用视为创建层次结构/树状结构,就像您在 3D 编辑器中组织您的 3D 场景一样。
更新
根据评论,仔细观察后,P3D 渲染形状的效果不如 2D 渲染器。
另一种选择是使用PGraphics作为 2D 缓冲区进行渲染,然后将其显示为 3D 场景中的图像:
PShape bot;
PImage botimg;
void setup() {
size(640, 360,P3D);
bot = loadShape("bot1.svg");
//2D buffer -> pixels
PGraphics p = createGraphics(width,height);
p.beginDraw();
p.background(0,0);//transparent bg
p.shape(bot,0,0,bot.width,bot.height);
p.endDraw();
//botimg = p;//PGraphics extends PImage so this works or use p.get() to get only pixels cloned
botimg = p.get(0,0,ceil(bot.width)+1,ceil(bot.height)+1);//a few extra pixels so we don't clip the image
}
void draw(){
if(botimg == null){
}
background(102);
pushMatrix();//3D
translate(width * .5,height *.5,-150);
rotateX(map(mouseX,0,width,-PI,PI));
rotateY(map(mouseY,0,height,PI,-PI));
box(150);
popMatrix();
pushMatrix();//2D
//shape(bot, 110, 90, 100, 100); // Draw at coordinate (110, 90) at size 100 x 100
//shape(bot, 280, 40); // Draw at coordinate (280, 40) at the default size
image(botimg,280,40,botimg.width,botimg.height);
popMatrix();
}
在调用图像时,P3D 渲染器在幕后生成一个四边形并对其进行纹理处理。使用 svg 的像素表示可以获得更好的结果,但它也不再可扩展:
还要注意立方体上的 3d 笔划的一个小故障,它受到纹理透明度的影响。