在运动物体的轴上旋转

时间:2019-08-24 11:44:20

标签: java processing

我正在学习如何使用推式和弹出式矩阵。我希望汽车(物体)绕其轴旋转,而不要与平移坐标的0,0一起旋转。 {初级编程爱好者}

当我使用rotate()时尝试重新转换轴。

PImage c = new PImage();

Car forza = new Car();
Trees tr = new Trees();

float wrap = 100;

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

void draw(){
  background(0);
  forza.update();
  forza.display();
  tr.road();
}

class Car {

  float posX;
  float posY;
  float speed;
  float accel;
  float angle;

  Car(){
    posX = 0;
    posY = 0;
    speed = .9;
    angle = sin(0);
    accel = 0;
  }


  void update(){
    pushMatrix();
    translate(posX,posY);
    if (keyPressed) {
      if (key == 'd') {
        angle += 1;
      }else if (key == 'a'){
        angle -= 1;
        rotate(radians(angle));
      } else if (key == 'w'){
        posX += speed;
      } else if (key == 's'){
        posX -= speed;
      }
    }  
    popMatrix();
  }

  void display(){
    pushMatrix();
    translate(width/2,height/2);
    rotate(radians(angle));
    c = loadImage("car.jpg");
    fill(255);
    stroke(255);
    imageMode(CENTER);
    image(c,posX,posY,wrap,wrap);
    line(0,0,posX,posY);
    print(posX);
    println(posY);
    popMatrix();
  }

}

class Trees {
  float x;
  float y;

  Trees(){
    //x = random(0,);
  }

  void trash(){

  }
  void road(){
    fill(250,50);
    rectMode(CENTER);
    rect(width/2,height/2, width/2, height);
  }

  void show(){

  }
}

我只是想知道它的算法,以及是否有其他方法可以提高效率和美观度。 ^^

1 个答案:

答案 0 :(得分:1)

如果对象应绕其原点旋转,则必须在平移之前完成旋转。由于rotate()translate()之类的操作会设置一个矩阵并将当前矩阵乘以新矩阵,因此这意味着rotate()必须在绘制对象之前完成。即使在某个位置绘制对象(例如posXposY),其行为也像翻译一样。

您必须在位置(0,0)上绘制汽车。然后,您必须旋转它。最后将其翻译成最终位置:

void display(){
    pushMatrix();
    translate(width/2,height/2);

    pushMatrix();
    translate(posX,posY);
    rotate(radians(angle));

    fill(255);
    stroke(255);
    imageMode(CENTER);
    image(c,0,0,wrap,wrap);
    popMatrix();

    line(0,0,posX,posY);
    popMatrix();
}

矩阵操作操作,更改矩阵。矩阵被应用于绘图操作中的坐标。 update中的矩阵运算是无用的,因为开头是pushMatrix(),结尾是popMatrix(),但是什么也没画。

在每个帧中加载图像,然后在Car的构造函数中执行一次,这是一种浪费性能。

请参见示例:

Car forza;
Trees tr;
float wrap = 100;

void setup(){
    size(800,800);
    forza = new Car();
    tr = new Trees();
}

void draw(){
    background(0);
    forza.update();
    forza.display();
    tr.road();
}

class Car {

    float posX;
    float posY;
    float speed;
    float accel;
    float angle;
    PImage c;

    Car(){
        posX = 0;
        posY = 0;
        speed = .9;
        angle = sin(0);
        accel = 0;
        c = loadImage("car.jpg");
    }

    void update(){
        if (keyPressed) {
          if (key == 'd') {
            angle += 1;
          }else if (key == 'a'){
            angle -= 1;
          } else if (key == 'w'){
            posX += speed;
          } else if (key == 's'){
            posX -= speed;
          }
        }  
    }

    void display(){
        pushMatrix();
        translate(width/2,height/2);

        pushMatrix();
        translate(posX,posY);
        rotate(radians(angle));

        fill(255);
        stroke(255);
        imageMode(CENTER);
        image(c,0,0,wrap,wrap);
        popMatrix();

        line(0,0,posX,posY);
        popMatrix();
    }
}

class Trees {
    float x;
    float y;

    Trees(){
      //x = random(0,);
    }

    void trash(){

    }
    void road(){
      fill(250,50);
      rectMode(CENTER);
      rect(width/2,height/2, width/2, height);
    }

    void show(){

    }
}