【问题标题】:mousePressed creates 3D cube in ProcessingmousePressed 在处理中创建 3D 立方体
【发布时间】:2014-12-12 18:55:27
【问题描述】:

我对处理有点陌生,我正在尝试制作一个 mousePressed 事件,该事件会在屏幕上创建旋转立方体。下一阶段将是在它们之间创建碰撞事件,但现在我遇到了另一个问题:它可以工作,但前提是按下鼠标,而我希望它们持续存在,即使没有按下鼠标。

这是代码,我尝试了一种解决方法,以无限循环循环,它产生了一个奇怪的故障,所有这些旋转的立方体一直旋转直到进入 0,0... 实际上 void draw 是空的,因为一切都在不断被抹去。

int pointmousex;
int pointmousey;
float a=0;
float r=0;
float co=100;
float Cubox[]= {
};
float Cuboy[]= {
};
float Cuboz[]= {
};
boolean bgON=true;

void setup() {
  size(800, 640, P3D);
  colorMode(HSB);
  background(0);
  smooth();
}

void draw_box(float x, float y, float box_size, float rot) {
  float z=box_size;
  translate(x, y, z);
  rotateX(rot);
  rotateY(rot);
  fill(map(co, 0, 255, 100, 255));
  box(box_size, box_size, box_size);
}

void draw() {
  if (bgON==true) {
    fill(255, 230, 200);
    rect(0, 0, width, height);
  }

  r=r+0.1;
}

void mousePressed() {
  int pointmousex = mouseX;
  int pointmousey = mouseY;
  lights();
  draw_box(pointmousex, pointmousey, 100, r*0.2);
}

void keyPressed() {
  if (key=='b' || key=='B') {
    if (bgON==true) {
      bgON = false;
    } else {
      bgON = true;
    }
  }
}

【问题讨论】:

    标签: 3d rotation processing


    【解决方案1】:

    如果你想用盒子做更复杂的事情,我建议你创建类:

    class Box{
      float x,y,z, box_size, rot;
    
      //create instance of box with specific position and starting rotation
      Box(float x, float y, float box_size, float rot){
        this.z = box_size;
        this.x = x;
        this.y = y;
        this.box_size = box_size;
        this.rot = rot;
      }
    
      void draw_box(){
        pushMatrix();
        translate(x, y, z);
        //adding R will rotate all boxes
        rotateX(r + rot);
        rotateY(r + rot);
        fill(map(co, 0, 255, 100, 255));
        box(box_size);
        popMatrix();
      }
    
      //here you can add more complex methods like colision ...
    }
    

    那么你必须创建一个全局数组来存储这些盒子

    final static ArrayList<Box> boxes = new ArrayList();
    

    在鼠标事件中只需创建新框并将其添加到boxes

    void mousePressed() {
      boxes.add( new Box(mouseX, mouseY, 100, r*0.5));
    }
    

    您需要做的最后一件事是每次调用draw() 时重绘场景(每个框):

    void draw() {
      background(255,230,200);
      for(Box box: boxes){
        box.draw_box();
      }
      r=r+0.01;
    }
    

    【讨论】:

    • 非常感谢 Majlik :) 在尝试了解您为什么使用数组列表时,我发现您也可以将数组列表更改为数组并尝试使用 for 循环和注册 x-y-z 位置,但不幸的是没有成功...我刚刚到达屏幕边界上的碰撞系统,而不是立方体之间,可悲的是...谢谢您的建议,无论如何,这太好了!
    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多