Loading...
Logo
Processing Forum
Hello all, for a project I need a textured rounded box, because I couldn't find it I thought I'd make it myself, its nearly there I am just missing the last small bit, but because my brain is hurting due to all the trigionometry terror I just can't figure it out. I hope someone here can point it out :)
The script requires a texture named "tex" once you run the sketch you'll see that the rounded corners are now round and therefore do not fit right, I think I'm missing some kind of sinus cosinus tangent thingy at the rounded corners vertex part.

Thank you!




void roundedCube(PImage tex, float xSize, float ySize, float zSize, float radR) {
  int tesVal = 2;
  float rad = radR;

  pushMatrix();
  boxFace(xSize, ySize, zSize, radR, tesVal);
  rotate(PI, 1, 0, 0);
  boxFace(xSize, ySize, zSize, radR, tesVal);
  rotate(PI/2, 1, 0, 0);
  boxFace(xSize, zSize, ySize, radR, tesVal);
  rotate(PI, 1, 0, 0);
  boxFace(xSize, zSize, ySize, radR, tesVal);
  rotate(PI/2, 0, 1, 0);
  boxFace(ySize, zSize, xSize, radR, tesVal);
  rotate(PI, 1, 0, 0);
  boxFace(ySize, zSize, xSize, radR, tesVal);
  popMatrix();
}

void boxFace(float a, float b, float c, float rad, int tes) {
  int tesVal = tes;
  float xVal= a-rad;
  float yVal = b-rad;
  float zVal = c-rad;
  beginShape(QUADS);
  texture(tex);
  vertex(-xVal, -yVal, c, (-xVal/(2*a))+0.5, (-yVal/(2*b))+0.5);
  vertex( xVal, -yVal, c, (xVal/(2*a))+0.5, (-yVal/(2*b))+0.5);
  vertex( xVal, yVal, c, (xVal/(2*a))+0.5, (yVal/(2*b))+0.5);
  vertex(-xVal, yVal, c, (-xVal/(2*a))+0.5, (yVal/(2*b))+0.5);
  endShape();

//half a round edge two times
  for (int i = 0;i<2;i++) {
    rotate(PI, 0, 0, 1);
    beginShape(QUAD_STRIP);
    texture(tex);
    for (int j=0;j<=tesVal;j++) {
      float angle =PI/4+ (PI/4)*(float(j)/tesVal);
      float xRot = rad*cos(angle);
      //float zRot = rad*sin(angle);
      vertex(xVal +xRot, yVal, zVal+rad*sin(angle), (xVal+xRot)/(2*a)+0.5, (yVal/b)+0.5);
      vertex(xVal +xRot, -yVal, zVal+rad*sin(angle), (xVal+xRot)/(2*a)+0.5, (-yVal/b)+0.5);
    }    
    endShape();
  }

//half a round edge two times again
  for (int i = 0;i<2;i++) {
    rotate(PI, 0, 0, 1);
    beginShape(QUAD_STRIP);
    texture(tex);
    for (int j=0;j<=tesVal;j++) {
      float angle =PI/4+ (PI/4)*(float(j)/tesVal);
      float yRot = rad*cos(angle);
      vertex(xVal, yVal+yRot, zVal+rad*sin(angle), (xVal/(2*a))+0.5, (yVal+yRot)/(2*b)+0.5 );
      vertex(-xVal, yVal+yRot, zVal+rad*sin(angle), (-xVal/(2*a))+0.5, (yVal+yRot)/(2*b)+0.5);
    }    
    endShape();
  }

//Round corners
  float xMul =1;
  float yMul = 1;
  for (int i = 0;i<4;i++) {

    if (i==1) {
      yMul=-1;
    }
    else if (i==2) {
      xMul = -1;
    }
    else if (i==3) {
      yMul = 1;
    }
    else {
    }

    for (int j=0;j<tesVal;j++) {
      beginShape(QUAD_STRIP);
      texture(tex);
      float angle =PI/4+ (PI/4)*(float(j)/tesVal);
      float angle3 =PI/4+ (PI/4)*(float(j+1)/tesVal);
      for (int k=0;k<=tesVal;k++) {
        float angle2 = (PI/2)*(float(k)/tesVal);
        float angle4 = (PI/2)*(float(k+1)/tesVal);
        float xRot = rad*cos(angle);
        float yRot = rad*sin(angle2);
        //I guess I am missing some thing at the z vertex
        vertex(xMul*xVal +xMul*rad*cos(angle)*cos(angle2), yMul*yVal+yMul*rad*sin(angle2)*cos(angle), zVal+rad*sin(angle), (xMul*xVal +xMul*rad*cos(angle)*cos(angle2))/(2*a)+0.5, (yMul*yVal+yMul*rad*sin(angle2)*cos(angle))/(2*b)+0.5);
        vertex(xMul*xVal +xMul*rad*cos(angle3)*cos(angle2), yMul*yVal+yMul* rad*sin(angle2)*cos(angle3), zVal+rad*sin(angle3), (xMul*xVal +xMul*rad*cos(angle3)*cos(angle2))/(2*a)+0.5, (yMul*yVal+yMul*rad*sin(angle2)*cos(angle3))/(2*b)+0.5);
      }
      endShape();
    }
  }
}

Replies(2)

AARGH come on, anybody :/
here is the code with navigation, just save, add texture called texture.jpg....

Copy code
  1. PImage tex;
    public boolean mouseNav = false, lockedCam = false, mouseLos = false, mouseIn = false, playBool =false, saveImage= false, combined = false, panning=false;
    public int ifPosX, ifPosY;
    public PVector tempVec;
    public float mouseZoom, orMouseX, orMouseY, mX, mY, centreX, centreY, centreZ;
    String folderPath;

    void setup() {
      size (600, 400, P3D );
      tex = loadImage("texture.jpg");
      textureMode(NORMAL);

      mX=170;
      mY=-200;
      mouseZoom = 60;
      centreX=0;
      centreY=0;
      centreZ=0;

      tempVec = new PVector(sin( mX/400)*cos( mY/400), cos( mX/400)*cos( mY/400), sin( mY/400));
    }

    void draw() {
      background(255);
      directionalLight(150, 150, 150, 0.7, -0.5, -1);
      directionalLight(55, 55, 55, -0.2, 0.4, 0.2);
      directionalLight(255, 255, 255, 0, 0, -1);

      camera(centreX- mouseZoom*tempVec.x, centreY- mouseZoom*tempVec.y, centreZ- mouseZoom*tempVec.z,
      centreX, centreY, centreZ,
      0.0, 0.0, -1.0);

      roundedCube(tex, 10, 12, 14, 4);

      if (mouseIn) {
        mouseNav();
      }
      camera();
      noLights();
      hint(DISABLE_DEPTH_TEST);
      textSize(20);
      text("text", 35, 125);
      hint(ENABLE_DEPTH_TEST);
      mouseLos = false;
    }

    void keyPressed()
    {
      if (key == CODED) {
        if (keyCode ==ALT) {
          panning= true;
        }
      }
    }

    void keyReleased() {
      if (key == CODED) {
        if (keyCode ==ALT) {
          panning= false;
        }
      }
    }

    void mouseNav() {
      if (lockedCam) {
      }
      else
      {
        if (!mouseNav) {
          orMouseX = ifPosX;
          orMouseY = ifPosY;
          mouseNav = true;
        }
        if (mouseButton==LEFT) { 
          if (panning) {
            PVector upPoint = new PVector(0, 0, -1);
            PVector crossVec = upPoint.cross(tempVec);
            PVector crossVecUp = tempVec.cross(crossVec);
            float tflo = (orMouseX - float(ifPosX));
            float tfloY = (orMouseY - float(ifPosY));
            centreX =centreX -tflo*crossVec.x -tfloY*crossVecUp.x;
            centreY =centreY -tflo*crossVec.y -tfloY*crossVecUp.y;
            centreZ =centreZ -tflo*crossVec.z -tfloY*crossVecUp.z;
          }
          else {
            float tflo = (orMouseX - float(ifPosX));
            mX =mX -tflo;
            float tfloY = (orMouseY - float(ifPosY));
            mY =mY -tfloY;
          }
        }
        if (mouseButton==RIGHT) {
          float tfloY = (orMouseY - float(ifPosY));
          mouseZoom =mouseZoom - (tfloY);
        }
        orMouseX = ifPosX;
        orMouseY = ifPosY;
        tempVec = new PVector(sin( mX/400)*cos( mY/400), cos( mX/400)*cos( mY/400), sin( mY/400));
        tempVec.normalize();
      }
    }

    void mousePressed() {
      mouseIn = true;
      mouseLos = false;
    }

    void mouseReleased() {
      mouseLos = true;
      mouseNav = false;
      mouseIn = false;
      lockedCam = false;
    }

    void mouseMoved() {
      ifPosX= mouseX;
      ifPosY=mouseY;
    }

    void mouseDragged() {
      ifPosX= mouseX;
      ifPosY=mouseY;
    }


    void roundedCube(PImage tex, float xSize, float ySize, float zSize, float radR) {
      int tesVal = 4;
      float rad = radR;

      pushMatrix();
      boxFace(xSize, ySize, zSize, radR, tesVal);
      rotate(PI, 1, 0, 0);
      boxFace(xSize, ySize, zSize, radR, tesVal);
      rotate(PI/2, 1, 0, 0);
      boxFace(xSize, zSize, ySize, radR, tesVal);
      rotate(PI, 1, 0, 0);
      boxFace(xSize, zSize, ySize, radR, tesVal);
      rotate(PI/2, 0, 1, 0);
      boxFace(ySize, zSize, xSize, radR, tesVal);
      rotate(PI, 1, 0, 0);
      boxFace(ySize, zSize, xSize, radR, tesVal);
      popMatrix();
    }

    void boxFace(float a, float b, float c, float rad, int tes) {
      int tesVal = tes;
      float xVal= a-rad;
      float yVal = b-rad;
      float zVal = c-rad;
      beginShape(QUADS);
      texture(tex);
      vertex(-xVal, -yVal, c, (-xVal/(2*a))+0.5, (-yVal/(2*b))+0.5);
      vertex( xVal, -yVal, c, (xVal/(2*a))+0.5, (-yVal/(2*b))+0.5);
      vertex( xVal, yVal, c, (xVal/(2*a))+0.5, (yVal/(2*b))+0.5);
      vertex(-xVal, yVal, c, (-xVal/(2*a))+0.5, (yVal/(2*b))+0.5);
      endShape();

    //half a round edge two times
    float mulFac = 1;
      for (int i = 0;i<2;i++) {
           if (i==1){
          mulFac = -1;
        }
       // rotate(PI, 0, 0, 1);
        beginShape(QUAD_STRIP);
        texture(tex);
        for (int j=0;j<=tesVal;j++) {
          float angle =PI/4+ (PI/4)*(float(j)/tesVal);
          float xRot = rad*mulFac*cos(angle);
          vertex(xVal*mulFac +xRot, yVal, zVal+rad*sin(angle), (xVal*mulFac+xRot)/(2*a)+0.5, (yVal/b)+0.5);
          vertex(xVal*mulFac +xRot, -yVal, zVal+rad*sin(angle), (xVal*mulFac+xRot)/(2*a)+0.5, (-yVal/b)+0.5);
        }    
        endShape();
      }

    //half a round edge two times again
    mulFac = 1;
      for (int i = 0;i<2;i++) {
        if (i==1){
          mulFac = -1;
        }
        beginShape(QUAD_STRIP);
        texture(tex);
        for (int j=0;j<=tesVal;j++) {
          float angle =PI/4+ (PI/4)*(float(j)/tesVal);
          float yRot = rad*mulFac*cos(angle);
          vertex(xVal, yVal*mulFac+yRot, zVal+rad*sin(angle), (xVal/(2*a))+0.5, (yVal*mulFac+yRot)/(2*b)+0.5 );
          vertex(-xVal, yVal*mulFac+yRot, zVal+rad*sin(angle), (-xVal/(2*a))+0.5, (yVal*mulFac+yRot)/(2*b)+0.5);
        }    
        endShape();
      }

    //Round corners
      float xMul =1;
      float yMul = 1;
      for (int i = 0;i<4;i++) {
        if (i==1) {
          yMul=-1;
        }
        else if (i==2) {
          xMul = -1;
        }
        else if (i==3) {
          yMul = 1;
        }
        else {
        }
        for (int j=0;j<tesVal;j++) {
          beginShape(QUAD_STRIP);
          texture(tex);
          float angle =PI/4+ (PI/4)*(float(j)/tesVal);
          float angle3 =PI/4+ (PI/4)*(float(j+1)/tesVal);
          for (int k=0;k<=tesVal;k++) {
            float angle2 = (PI/2)*(float(k)/tesVal);
            float angle4 = (PI/2)*(float(k+1)/tesVal);

             float zRot = cos((PI/2)*(float(k)/tesVal));
             if(k>1){
              zRot = sin((PI/2)*(float(k)/tesVal));
             }
            //I guess I am missing some thing at the z vertex
            vertex(xMul*xVal +xMul*rad*cos(angle)*cos(angle2), yMul*yVal+yMul*rad*sin(angle2)*cos(angle),
            zVal+rad*sin(angle)*zRot, (xMul*xVal +xMul*rad*cos(angle)*cos(angle2))/(2*a)+0.5, (yMul*yVal+yMul*rad*sin(angle2)*cos(angle))/(2*b)+0.5);
            vertex(xMul*xVal +xMul*rad*cos(angle3)*cos(angle2), yMul*yVal+yMul* rad*sin(angle2)*cos(angle3),
            zVal+rad*sin(angle3)*zRot, (xMul*xVal +xMul*rad*cos(angle3)*cos(angle2))/(2*a)+0.5, (yMul*yVal+yMul*rad*sin(angle2)*cos(angle3))/(2*b)+0.5);
          }
          endShape();
        }
      }
    }

Behold!!
well, anyway, solved it kind of, if you want to use, add texture called....tex and remember to add "textureMode(NORMAL);"
should work, is probably not overly fast and only even tesselations work.

Copy code

  1. void roundedCube(PImage tex, float xSize, float ySize, float zSize, float radR) {
  2. //tesVal should be an even number
      int tesVal = 4;
      float rad = radR;

      //pushMatrix();
      boxFace(xSize, ySize, zSize, radR, tesVal);
      rotate(PI, 1, 0, 0);
      boxFace(xSize, ySize, zSize, radR, tesVal);
      rotate(PI/2, 1, 0, 0);
      boxFace(xSize, zSize, ySize, radR, tesVal);
      rotate(PI, 1, 0, 0);
      boxFace(xSize, zSize, ySize, radR, tesVal);
      rotate(PI/2, 0, 1, 0);
      boxFace(ySize, zSize, xSize, radR, tesVal);
      rotate(PI, 1, 0, 0);
      boxFace(ySize, zSize, xSize, radR, tesVal);
      //popMatrix();
    }

    void boxFace(float a, float b, float c, float rad, int tes) {
      int tesVal = tes;
      float xVal= a-rad;
      float yVal = b-rad;
      float zVal = c-rad;
      beginShape(QUADS);
      texture(tex);
      vertex(-xVal, -yVal, c, (-xVal/(2*a))+0.5, (-yVal/(2*b))+0.5);
      vertex( xVal, -yVal, c, (xVal/(2*a))+0.5, (-yVal/(2*b))+0.5);
      vertex( xVal, yVal, c, (xVal/(2*a))+0.5, (yVal/(2*b))+0.5);
      vertex(-xVal, yVal, c, (-xVal/(2*a))+0.5, (yVal/(2*b))+0.5);
      endShape();

      //half a round edge two times
      float mulFac = 1;
      for (int i = 0;i<2;i++) {
        if (i==1) {
          mulFac = -1;
        }
        // rotate(PI, 0, 0, 1);
        beginShape(QUAD_STRIP);
        texture(tex);
        for (int j=0;j<=tesVal;j++) {
          float angle =PI/4+ (PI/4)*(float(j)/tesVal);
          float xRot = rad*mulFac*cos(angle);
          vertex(xVal*mulFac +xRot, yVal, zVal+rad*sin(angle), (xVal*mulFac+xRot)/(2*a)+0.5, (yVal/b)+0.5);
          vertex(xVal*mulFac +xRot, -yVal, zVal+rad*sin(angle), (xVal*mulFac+xRot)/(2*a)+0.5, (-yVal/b)+0.5);
        }    
        endShape();
      }

      //half a round edge two times again
      mulFac = 1;
      for (int i = 0;i<2;i++) {
        if (i==1) {
          mulFac = -1;
        }
        beginShape(QUAD_STRIP);
        texture(tex);
        for (int j=0;j<=tesVal;j++) {
          float angle =PI/4+ (PI/4)*(float(j)/tesVal);
          float yRot = rad*mulFac*cos(angle);
          vertex(xVal, yVal*mulFac+yRot, zVal+rad*sin(angle), (xVal/(2*a))+0.5, (yVal*mulFac+yRot)/(2*b)+0.5 );
          vertex(-xVal, yVal*mulFac+yRot, zVal+rad*sin(angle), (-xVal/(2*a))+0.5, (yVal*mulFac+yRot)/(2*b)+0.5);
        }    
        endShape();
      }

      //Round corners
      float xMul =1;
      float yMul = 1;
      for (int i = 0;i<4;i++) {
        if (i==1) {
          yMul=-1;
        }
        else if (i==2) {
          xMul = -1;
        }
        else if (i==3) {
          yMul = 1;
        }
        else {
        }

        for (int j=0;j<tesVal;j++) {
          beginShape(QUAD_STRIP);
          texture(tex);
          for (int k=0;k<=tesVal;k++) {
            float angle2 = (PI/2)*(float(k)/tesVal);
            float mFFac = (1-abs(cos(angle2*2)));
            float zRot = (PI/4+(PI/20*mFFac))*(float(j)/tesVal);
            float zRot2 = (PI/4+(PI/20*mFFac))*(float(j+1)/tesVal);
            vertex(xMul*xVal +xMul*rad*sin(zRot)*sin(angle2), yMul*yVal+yMul*rad*cos(angle2)*sin(zRot), zVal+rad*cos(zRot),
            (xMul*xVal +xMul*rad*sin(zRot)*sin(angle2))/(2*a)+0.5, (yMul*yVal+yMul*rad*cos(angle2)*sin(zRot))/(2*b)+0.5);
            vertex(xMul*xVal +xMul*rad*sin(zRot2)*sin(angle2), yMul*yVal+yMul* rad*cos(angle2)*sin(zRot2), zVal+rad*cos(zRot2),
            (xMul*xVal +xMul*rad*sin(zRot2)*sin(angle2))/(2*a)+0.5, (yMul*yVal+yMul*rad*cos(angle2)*sin(zRot2))/(2*b)+0.5);
          }
          endShape();
        }
      }
    }