// Digital Material Cube 006 // FabLab Japan // Hiroya Tanaka // Import Mesh Library import toxi.geom.*; import toxi.geom.mesh.*; import toxi.geom.mesh.subdiv.*; import toxi.processing.*; import toxi.util.*; import toxi.volume.*; ToxiclibsSupport gfx; WETriangleMesh mesh; // Import import processing.opengl.*; import javax.media.opengl.*; import controlP5.*; import javax.swing.*; import SpringGUI.*; SpringGUI gui; // File IO String getFile; String setFile; String [] txtarray = null; String txt = null; // Field int FIELD_SIZE = 50; int FIELD_STEP = 10; // Camera float expo = 1; float rotx, roty; float rate = 0.01; // Resolution of Box int resolution = 1; int divide = 0; // ControlP5 ControlP5 controlP5; Textfield tfUserName; // テキストフィールド String txts = ""; // Text PFont font; long time; // Unlekker import unlekker.data.*; import unlekker.geom.*; STL stl; FaceList poly; void setup() { size(640, 480, OPENGL); gfx=new ToxiclibsSupport(this); controlP5 = new ControlP5(this); controlP5.addButton("loadfile",1,10,45,80,19); controlP5.addButton("savefile",1,100,45,80,19); controlP5.addSlider("divide",0,50,10,70,200,20); } void draw() { background(0); PGraphicsOpenGL pgl = (PGraphicsOpenGL)g; // Lighting ambientLight(150, 150, 150); directionalLight(255,255,255,-1,0,0); pointLight(160, 160, 160, mouseX, mouseY, 200); spotLight(100, 100, 100, mouseX, mouseY, 200, 0, 0, -1, PI, 2); // Camera if (getFile == null && setFile == null) { rotx = rotx + (mouseY - pmouseY) * rate; roty = roty + (mouseX - pmouseX) * rate; } else { rotx = 0; roty = 0; expo = 1; } // FileIO if(getFile != null){ //ファイルを取り込む fileLoader(); } //Text font = createFont("Meiryo", 12); textFont(font); fill(255,255,255); text("06 Mesh Dividing ", 10, 25); // Zoom In and Out if (keyPressed && keyCode==UP) { expo = expo + 0.01; } if (keyPressed && keyCode==DOWN) { expo = expo - 0.01; } // 中心を合わせる pushMatrix(); translate(320,240,200); rotateX(rotx); rotateY(roty);scale(expo); // フレームの描画 pushStyle(); stroke(255, 255, 255); FIELD_STEP = FIELD_SIZE*2/resolution; for(int k = 1; k<=resolution; k = k + 1){ for(int j = 1; j<=resolution; j = j + 1){ for(int i = 1; i<=resolution; i = i + 1){ // x float x = -FIELD_SIZE + FIELD_STEP*(i - 1); float xx = -FIELD_SIZE + FIELD_STEP*(i); float realx = (x + xx)/2; // y float y = -FIELD_SIZE + FIELD_STEP*(j - 1); float yy = -FIELD_SIZE + FIELD_STEP*(j); float realy = (y + yy)/2; // z float z = -FIELD_SIZE + FIELD_STEP*(k - 1); float zz = -FIELD_SIZE + FIELD_STEP*(k); float realz = (z + zz)/2; pushMatrix(); translate(realx,realy,realz); noFill(); box(FIELD_STEP ,FIELD_STEP ,FIELD_STEP ); popMatrix(); } } } popStyle(); // STL書き出し if(setFile != null){ beginRaw("unlekker.data.STL",setFile+".stl"); println("start :"+setFile); } // メッシュの描画 if(poly!=null) { //poly.draw(this); for(int q = 0; q< poly.f.length; q= q + 1){ // 1 to 2 float vecax = poly.f[q].v[6] - poly.f[q].v[3]; float vecay = poly.f[q].v[7] - poly.f[q].v[4]; float vecaz = poly.f[q].v[8] - poly.f[q].v[5]; // 2 to 3 float vecbx = poly.f[q].v[9] - poly.f[q].v[6]; float vecby = poly.f[q].v[10] - poly.f[q].v[7]; float vecbz = poly.f[q].v[11] - poly.f[q].v[8]; // 3 to 1 float veccx = poly.f[q].v[9] - poly.f[q].v[3]; float veccy = poly.f[q].v[10] - poly.f[q].v[4]; float veccz = poly.f[q].v[11] - poly.f[q].v[5]; beginShape(TRIANGLES); vertex(poly.f[q].v[3] + vecax * divide/100 ,poly.f[q].v[4] + vecay * divide/100 , poly.f[q].v[5] + vecaz * divide/100); vertex(poly.f[q].v[6] + vecbx * divide/100 ,poly.f[q].v[7] + vecby * divide/100 , poly.f[q].v[8] + vecbz * divide/100); vertex(poly.f[q].v[9] - veccx * divide/100 ,poly.f[q].v[10] - veccy * divide/100 , poly.f[q].v[11] - veccz * divide/100); endShape(); } } // ボクセルの描画 pushStyle(); noStroke(); noFill(); int len = txts.length(); int l = 0; FIELD_STEP = FIELD_SIZE*2/resolution; for(int k = 1; k<=resolution; k = k + 1){ for(int j = 1; j<=resolution; j = j + 1){ for(int i = 1; i<=resolution; i = i + 1){ //x float x = -FIELD_SIZE + FIELD_STEP*(i - 1); float xx = -FIELD_SIZE + FIELD_STEP*(i); float realx = (x + xx)/2; //y float y = -FIELD_SIZE + FIELD_STEP*(j - 1); float yy = -FIELD_SIZE + FIELD_STEP*(j); float realy = (y + yy)/2; //z float z = -FIELD_SIZE + FIELD_STEP*(k - 1); float zz = -FIELD_SIZE + FIELD_STEP*(k); float realz = (z + zz)/2; pushMatrix(); translate(realx,realy,realz); if (len >0) { if (txts.charAt(l)=='1') { fill(200,200,200); box(FIELD_STEP,FIELD_STEP,FIELD_STEP); } } l=l+1; if (l > len-1) { l = 0; } popMatrix(); } } } popStyle(); popMatrix(); // STL書き出し終了 if(setFile !=null) { endRaw(); setFile = null; println("end"); } // α合成を有効にする GL gl = pgl.beginGL(); gl.glEnable(GL.GL_BLEND); gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); gl.glDisable(GL.GL_DEPTH_TEST); pgl.endGL(); // GUI コンポーネント描画のための設定 camera(); gl = pgl.beginGL(); gl.glDisable(GL.GL_DEPTH_TEST); // 深度テストを無効化 gl.glEnable(GL.GL_BLEND); gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); pgl.endGL(); } // テキストが入力された際にコールバックされるメソッド public synchronized void textfield(String txt) { txts = txt; } public void loadfile(int theValue) { getFile = getFileName(); } public void savefile(int theValue) { setFile = setFileName(); }