2016-04-18 11 views
1

親愛なる、私は以下の画像を処理して再作成しようとしています、読書/処理で3D形状のピクセルを変更

を知恵を集めバックグラウンドのグレーの四角によって設定された境界内に「視覚的に配置されている」限り、大胆になります。

これまでのところ、私は目標画像のほとんどを達成することができましたが、暗くなる必要があるそれぞれのピクセルを読み取る方法は見つけられません。 what I did so far

そして、これは私のコードです::私は視覚的に今の私場所です(キューブの回転の差は、現時点では重要ではない)私は、様々なしようとしている

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

ストロークカラーのアルファ値(キューブを描画する前または描画後)を変更することで、ストロークのウェイトをピクセルの位置に基づいて変更することができますが、明らかに間違っています。とにかくこれが可能ならば、私は確かに3D画像から2D画像を読み取ろうとしているのですか?

助けてくれれば幸いです! ありがとうございました

答えて

1

ピクセルを使用すると、この作業が面倒になることがあります。特に、特定の領域に太い線を描く必要があるためです。

既存の2つのコンテンツとほぼ同じコンテンツをレンダリングする2つのPGraphicsを使用することをおすすめしますが、ストロークは太いです。

PGraphicsのcopy()またはblend()ピクセルは、コードの上に太い輪郭を使用して指定できます。

通常、関数に再利用される命令をグループ化することをお勧めします。ここでは、余分な機能や2つの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(); 
} 

うまくいけば、間隔はそれが簡単に多くの引数に従うことになります。 はここにpeviewです:あなたはManfred Mohrに関連する例えば、Golan Levin's courses上のリソースの富をチェックアウトする必要があり

clippy

Manfred Mohr Cube study Processing port test

ので...。さらにチェックアウトするReCode Project

+0

これを明確にしてくれてありがとう、たくさん!それは多くの助けになりました!はい、あなたは正しく推測しました、私はManfred Mohrに取り組んでいます。あなたが提供したリンクは本当に素晴らしいです!再度、感謝します。 –

+0

喜んで助けました。あなたはおそらく、Frieder Nakeの作品もチェックしてください:) –

+0

Friederは実際に私の教授です!! :) –

1

これは、浸食フィルタの仕事のようです。

filter()関数を使用して、画像のその部分にフィルタを適用できます。処理にはあらかじめ定義されたフィルタがいくつか付属しており、erode関数は記述しているものとまったく同じです。

このコード考えてみましょう:

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); 
} 

を:

あなたは所望の効果を達成するために、異なるフィルタ、または同じフィルターを複数回適用することができます:あなたはまたにfilter()機能を適用できることを

void setup(){ 
    size(200, 200); 
} 

void draw(){ 
    background(255); 
    line(0, 0, width, height); 
    for(int i = 0; i < 10; i++){ 
    filter(ERODE); 
    } 
} 

注意をPGraphicsのインスタンスです。これはあなたがしたいことです。

+0

こんにちは、ケビン、あなたのコメントのおかげで!私はfilter()を使用しようとしましたが、私はボックスの*特定のセクション/ピクセル*(私の画像に示されているように)にそれをどのように適用できるか見ることができません。これに関するアドバイスは? –

+0

@IliasKyriazis特定のピクセルを取得する必要はありません。太字にしたいピクセルを 'PGraphics'にコピーし、' PGraphics'で 'filter()'を呼び出し、それを画面に戻してください。 –

+0

私はケビン、あなたが意味するものを参照してください!基本的にジョージの答えに似ていますが、filter()を使用します。どうもありがとう!! –

関連する問題