Обработка: вращающиеся кубы остаются в одном месте при движении - PullRequest
0 голосов
/ 20 марта 2019

В программе «Обработка» мне нужно сделать так, чтобы куб двигался в том месте, где куб перемещается при нажатии строчной буквы x для против часовой стрелки оси x или нажатии заглавной буквы X для часовой стрелки оси x и нажатии строчной буквы y для против часовой стрелки y оси, или нажмите заглавную Y для часовой стрелки по оси y, и нажмите строчную букву z для против часовой стрелки оси z, и нажмите заглавную Z для часовой стрелки для оси z. Проблема в том, что куб перемещается не на своем месте, но вращается. Как мне вращаться, но не двигаться с места? Пожалуйста, помогите проверить этот код. Код работает, однако он перемещается не к месту. Кроме того, он вращается при первом нажатии кнопки. Как мне это исправить?

float theta = 0;
void setup() {
  size(600, 600, P3D);
}

void draw() {
  background(255);
  fill(127, 127);
  String s1 = "Press x for counterclockwise of x axis, X for clockwise of x axis"; 
  String s2 = "Press y for counterclockwise of y axis, Y for clockwise of y axis ";
  String s3 = "Press z for counterclockwise of z axis, Z for for clockwise for z axis";
  text(s1, 0, width/2 + 100);
  text(s2, 0, width/2 + 125);
  text(s3, 0, width/2 + 150);
  // if(pressLowX() == true) 
  // cubeBox(.5, .5, .5);
  pressButtons();
  pushMatrix();
  translate(width/2, height/2);
  cubeBox(.5, .5, .5);
  popMatrix();
}


void cubeBox(float x, float y, float z) {
  translate(x, y, z);
  rotate(theta);
  beginShape(QUADS);

  fill(255, 0, 0);
  vertex(100, 100, 100);
  vertex(-100, 100, 100);
  vertex(-100, -100, 100);
  vertex(100, -100, 100);

  fill(255, 255, 0);
  vertex(-100, -100, -100);
  vertex(100, -100, -100);
  vertex(100, 100, -100);
  vertex(-100, 100, -100);

  fill(0, 255, 0);
  vertex(100, 100, 100);
  vertex(100, -100, 100);
  vertex(100, -100, -100);
  vertex(100, 100, -100);

  fill(0, 255, 255);
  vertex(-100, -100, 100);
  vertex(-100, -100, -100);
  vertex(-100, 100, -100);
  vertex(-100, 100, 100);

  fill(0, 0, 255);
  vertex(-100, -100, 100);
  vertex(-100, -100, -100);
  vertex(100, -100, -100);
  vertex(100, -100, 100);

  fill(255, 0, 255);
  vertex(100, 100, 100);
  vertex(-100, 100, 100);
  vertex(-100, 100, -100);
  vertex(100, 100, -100);
  // rotate(-theta);
  // translate(-x, -y, -z); 
  endShape(CLOSE);
}

void pressButtons() {
  if (key == 'x') { 
    theta = theta - .05;
    rotateX(radians(0));
  } else if (key == 'X') {
    theta = theta + .05;
    rotateX(radians(0));
  } else if (key == 'y') {
    theta = theta - .05;
    rotateY(radians(90));
  } else if (key == 'Y') {
    theta = theta + .05;
    rotateY(radians(90));
  } else if (key == 'z') {
    theta = theta - .05;
    rotateZ(radians(60));
  } else if (key == 'Z') {
    theta = theta + .05;
    rotateZ(radians(60));
  }
}

1 Ответ

1 голос
/ 20 марта 2019

Чтобы повернуть геометрию на месте, вращение должно быть применено к геометрии перед переводом:

P' = translation * rotation * P

Это означает, что вы должны выполнить инструкции в следующем порядке:

, например

  translate(x, y, z);
  rotateX(theta);

Проблема в том, что поворот на угол theta выполняется до translate, в функции pressButtons.

Чтобы решить вашу проблему, создайте глобальную переменную, которая заметит последнюю нажатую клавишу, и измените состояние переменной в функции pressButtons

char actKey = 0;
void pressButtons() {
    if (key == 'x' || key == 'X' || key == 'y' || key == 'Y' || key == 'z' || key == 'Z')
        actKey= key;
}

Создать новую функцию, которая выполняет вращение, в зависимости от состояния actKey

void addRotation() {
    if (actKey == 'x') { 
        theta = theta - .05;
        rotateX(theta);
    } else if (actKey == 'X') {
        theta = theta + .05;
        rotateX(theta);
    } else if (actKey == 'y') {
        theta = theta - .05;
        rotateY(theta);
    } else if (actKey == 'Y') {
        theta = theta + .05;
        rotateY(theta);
    } else if (actKey == 'z') {
        theta = theta - .05;
        rotateZ(theta);
    } else if (actKey == 'Z') {
        theta = theta + .05;
        rotateZ(theta);
    }
}

Выполните перевод с последующим вращением в начале cubeBox:

void cubeBox(float x, float y, float z) {

    translate(x, y, z);
    addRotation();

    // [...]

}

...