Reading/Changing 处理中的 3D 形状像素
Reading/Changing pixels of 3D shapes in Processing
亲爱的智慧,
我正在尝试通过处理以下图像重新创建:
差不多我需要创建两个半立方体,它们的轮廓应该更粗,只要它们是"visually located within"背景中灰色方块设置的边界。
到目前为止,我已经设法实现了大部分目标图片,但是我找不到一种方法来读取需要变暗的各个像素。这是我现在在视觉上的位置(目前立方体旋转的差异并不重要):
这是我的代码:
PGraphics pg1;
PGraphics pg2;
void setup() {
size(400,400,P3D);
background(255);
pg1 = createGraphics(200,400,P3D);
pg2 = createGraphics(200,400,P3D);
loadPixels();
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
color grey = color(230);
if (x > 99 && x < 300 && y > 99 && y < 300) {
pixels[y*width+x] = grey;
}
}
}
updatePixels();
}
void draw() {
pg1.beginDraw();
//left cube
pg1.pushMatrix();
pg1.ortho();
pg1.translate(200,200,0);
pg1.rotateX(-2.5289822);
pg1.rotateY(-2.8117256);
pg1.rotateZ(2.9670599);
pg1.stroke(0,10);
pg1.strokeWeight(0.5);
pg1.noFill();
pg1.box(200);
pg1.popMatrix();
//vertical line
pg1.translate(200,200,0);
pg1.stroke(230);
pg1.strokeWeight(0.5);
pg1.line(0,-200,0,0,200,0);
pg1.endDraw();
pg2.beginDraw();
//right cube
pg2.pushMatrix();
pg2.ortho();
pg2.translate(0,200,0);
pg2.rotateX(-1.24);
pg2.rotateY(-2.0);
pg2.rotateZ(-2.9670599);
pg2.stroke(0,10);
pg2.strokeWeight(0.5);
pg2.noFill();
pg2.box(200);
pg2.popMatrix();
//vertical line
pg2.translate(0,200,0);
pg2.stroke(230);
pg2.strokeWeight(0.5);
pg2.line(0,-200,0,0,200,0);
pg2.endDraw();
//display pgs
image(pg1, 0, 0);
image(pg2, 200, 0);
//how can I change specific pixels of the box outlines??
loadPixels();
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (x > 99 && x < 300 && y > 99 && y < 300) {
float r = red(pixels[y*width+x]);
float g = green(pixels[y*width+x]);
float b = blue(pixels[y*width+x]);
pixels[y*width+x] = color(r,g,b,255);
}
}
}
updatePixels();
}
我一直在尝试根据像素位置或通过更改笔划颜色的 alpha 值(在绘制立方体之前或之后)更改笔划粗细的各种版本,但显然我做错了什么。我也不确定,如果这是可能的,因为我显然(?)试图从 3D 形状读取 2D 图像..
如有任何帮助,我们将不胜感激!
非常感谢 - 伊利亚斯
这听起来像是 腐蚀过滤器 的工作。
您可以使用 filter()
函数对图像的该部分应用滤镜。 Processing 附带了一些预定义的过滤器,而 erode 函数完全符合您的描述。
考虑这段代码:
void setup(){
size(200, 200);
}
void draw(){
background(255);
line(0, 0, width, height);
}
生成这个:
您可以应用侵蚀过滤器:
void setup(){
size(200, 200);
}
void draw(){
background(255);
line(0, 0, width, height);
filter(ERODE);
}
其中黑线:
您可以应用不同的滤镜,或多次应用相同的滤镜,以达到您想要的效果:
void setup(){
size(200, 200);
}
void draw(){
background(255);
line(0, 0, width, height);
for(int i = 0; i < 10; i++){
filter(ERODE);
}
}
请注意,您还可以将 filter()
函数应用于 PGraphics
的实例,这就是您想要做的。
使用像素完成这项任务可能会很乏味,尤其是因为您需要在某些区域绘制更粗的线条。
我建议再使用两个 PGraphics,它们呈现的内容与您现有的两个几乎相同,但笔触更粗。
然后您可以在代码顶部使用较粗的轮廓从 PGraphics copy() or blend() 像素。
将重复使用的指令分组到函数中通常是个好主意。这是使用额外函数和两个 PGraphics 层的代码调整版本:
PGraphics pg1;
PGraphics pg2;
PGraphics pg3;
PGraphics pg4;
void setup() {
size(400,400,P3D);
background(255);
noStroke();
fill(0,32);
pg1 = createGraphics(200,400,P3D);
pg2 = createGraphics(200,400,P3D);
pg3 = createGraphics(200,400,P3D);
pg4 = createGraphics(200,400,P3D);
box(pg1,200,200,0,//pg,x,y,z
-2.5289822,-2.8117256,2.9670599,//rx,ry,rz
0,1.5,200);//stroke,thickness,boxSize
box(pg2,0 ,200,0,
-1.24,-2.0,-2.9670599,
127,1.5,200);
//same as above, just using thicker strokes
box(pg3,200,200,0,
-2.5289822,-2.8117256,2.9670599,
0,3.5,200);
box(pg4,0 ,200,0,
-1.24,-2.0,-2.9670599,
64,3.5,200);
//display pgs
image(pg1, 0, 0);
image(pg2, 200, 0);
//copy pixels from pgs drawn with thicker lines
copy(pg3, 100, 100, 100, 200,
100, 100, 100, 200);
copy(pg4, 0 , 100, 100, 200,
200, 100, 100, 200);
//overlay transparent rectangle on top
rect(100,100,200,200);
}
void draw() {
}
//render a box in a given PGraphics with options for position, rotation, stroke and size
void box(PGraphics pg,
float x,float y,float z,
float rx,float ry,float rz,
int cubeStroke,float cubeStrokeWeight,float cubeSize){
pg.beginDraw();
//left cube
pg.pushMatrix();
pg.ortho();
pg.translate(x,y,z);
pg.rotateX(rx);
pg.rotateY(ry);
pg.rotateZ(rz);
pg.stroke(cubeStroke);
pg.strokeWeight(cubeStrokeWeight);
pg.noFill();
pg.box(cubeSize);
pg.popMatrix();
//vertical line
pg.translate(200,200,0);
pg.stroke(230);
pg.strokeWeight(0.5);
pg.line(0,-200,0,0,200,0);
pg.endDraw();
}
希望间距能让大家更容易理解许多论点。
这是一个观点:
所以...
您应该在 Golan Levin's courses, for example related to Manfred Mohr. Additionally check out the ReCode Project
上查看丰富的资源
亲爱的智慧,
我正在尝试通过处理以下图像重新创建:
差不多我需要创建两个半立方体,它们的轮廓应该更粗,只要它们是"visually located within"背景中灰色方块设置的边界。
到目前为止,我已经设法实现了大部分目标图片,但是我找不到一种方法来读取需要变暗的各个像素。这是我现在在视觉上的位置(目前立方体旋转的差异并不重要):
这是我的代码:
PGraphics pg1;
PGraphics pg2;
void setup() {
size(400,400,P3D);
background(255);
pg1 = createGraphics(200,400,P3D);
pg2 = createGraphics(200,400,P3D);
loadPixels();
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
color grey = color(230);
if (x > 99 && x < 300 && y > 99 && y < 300) {
pixels[y*width+x] = grey;
}
}
}
updatePixels();
}
void draw() {
pg1.beginDraw();
//left cube
pg1.pushMatrix();
pg1.ortho();
pg1.translate(200,200,0);
pg1.rotateX(-2.5289822);
pg1.rotateY(-2.8117256);
pg1.rotateZ(2.9670599);
pg1.stroke(0,10);
pg1.strokeWeight(0.5);
pg1.noFill();
pg1.box(200);
pg1.popMatrix();
//vertical line
pg1.translate(200,200,0);
pg1.stroke(230);
pg1.strokeWeight(0.5);
pg1.line(0,-200,0,0,200,0);
pg1.endDraw();
pg2.beginDraw();
//right cube
pg2.pushMatrix();
pg2.ortho();
pg2.translate(0,200,0);
pg2.rotateX(-1.24);
pg2.rotateY(-2.0);
pg2.rotateZ(-2.9670599);
pg2.stroke(0,10);
pg2.strokeWeight(0.5);
pg2.noFill();
pg2.box(200);
pg2.popMatrix();
//vertical line
pg2.translate(0,200,0);
pg2.stroke(230);
pg2.strokeWeight(0.5);
pg2.line(0,-200,0,0,200,0);
pg2.endDraw();
//display pgs
image(pg1, 0, 0);
image(pg2, 200, 0);
//how can I change specific pixels of the box outlines??
loadPixels();
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (x > 99 && x < 300 && y > 99 && y < 300) {
float r = red(pixels[y*width+x]);
float g = green(pixels[y*width+x]);
float b = blue(pixels[y*width+x]);
pixels[y*width+x] = color(r,g,b,255);
}
}
}
updatePixels();
}
我一直在尝试根据像素位置或通过更改笔划颜色的 alpha 值(在绘制立方体之前或之后)更改笔划粗细的各种版本,但显然我做错了什么。我也不确定,如果这是可能的,因为我显然(?)试图从 3D 形状读取 2D 图像..
如有任何帮助,我们将不胜感激! 非常感谢 - 伊利亚斯
这听起来像是 腐蚀过滤器 的工作。
您可以使用 filter()
函数对图像的该部分应用滤镜。 Processing 附带了一些预定义的过滤器,而 erode 函数完全符合您的描述。
考虑这段代码:
void setup(){
size(200, 200);
}
void draw(){
background(255);
line(0, 0, width, height);
}
生成这个:
您可以应用侵蚀过滤器:
void setup(){
size(200, 200);
}
void draw(){
background(255);
line(0, 0, width, height);
filter(ERODE);
}
其中黑线:
您可以应用不同的滤镜,或多次应用相同的滤镜,以达到您想要的效果:
void setup(){
size(200, 200);
}
void draw(){
background(255);
line(0, 0, width, height);
for(int i = 0; i < 10; i++){
filter(ERODE);
}
}
请注意,您还可以将 filter()
函数应用于 PGraphics
的实例,这就是您想要做的。
使用像素完成这项任务可能会很乏味,尤其是因为您需要在某些区域绘制更粗的线条。
我建议再使用两个 PGraphics,它们呈现的内容与您现有的两个几乎相同,但笔触更粗。
然后您可以在代码顶部使用较粗的轮廓从 PGraphics copy() or blend() 像素。
将重复使用的指令分组到函数中通常是个好主意。这是使用额外函数和两个 PGraphics 层的代码调整版本:
PGraphics pg1;
PGraphics pg2;
PGraphics pg3;
PGraphics pg4;
void setup() {
size(400,400,P3D);
background(255);
noStroke();
fill(0,32);
pg1 = createGraphics(200,400,P3D);
pg2 = createGraphics(200,400,P3D);
pg3 = createGraphics(200,400,P3D);
pg4 = createGraphics(200,400,P3D);
box(pg1,200,200,0,//pg,x,y,z
-2.5289822,-2.8117256,2.9670599,//rx,ry,rz
0,1.5,200);//stroke,thickness,boxSize
box(pg2,0 ,200,0,
-1.24,-2.0,-2.9670599,
127,1.5,200);
//same as above, just using thicker strokes
box(pg3,200,200,0,
-2.5289822,-2.8117256,2.9670599,
0,3.5,200);
box(pg4,0 ,200,0,
-1.24,-2.0,-2.9670599,
64,3.5,200);
//display pgs
image(pg1, 0, 0);
image(pg2, 200, 0);
//copy pixels from pgs drawn with thicker lines
copy(pg3, 100, 100, 100, 200,
100, 100, 100, 200);
copy(pg4, 0 , 100, 100, 200,
200, 100, 100, 200);
//overlay transparent rectangle on top
rect(100,100,200,200);
}
void draw() {
}
//render a box in a given PGraphics with options for position, rotation, stroke and size
void box(PGraphics pg,
float x,float y,float z,
float rx,float ry,float rz,
int cubeStroke,float cubeStrokeWeight,float cubeSize){
pg.beginDraw();
//left cube
pg.pushMatrix();
pg.ortho();
pg.translate(x,y,z);
pg.rotateX(rx);
pg.rotateY(ry);
pg.rotateZ(rz);
pg.stroke(cubeStroke);
pg.strokeWeight(cubeStrokeWeight);
pg.noFill();
pg.box(cubeSize);
pg.popMatrix();
//vertical line
pg.translate(200,200,0);
pg.stroke(230);
pg.strokeWeight(0.5);
pg.line(0,-200,0,0,200,0);
pg.endDraw();
}
希望间距能让大家更容易理解许多论点。 这是一个观点:
所以...
您应该在 Golan Levin's courses, for example related to Manfred Mohr. Additionally check out the ReCode Project
上查看丰富的资源