处理中的平滑旋转

时间:2016-09-08 20:33:33

标签: processing

我正在查看教室中的Processing参考资料,并在动画中汇总了几个示例。我的教授没有在课堂上教这些材料,并告诉我,我可能会在Stack Overflow上找到更好的运气从社区获得帮助。我的问题如下。

ry达到70时,旋转停止。我在我的代码中对问题所在的位置发表评论。

我正在尝试制作连续流畅的动画。

 
int x = 200;
int y = 350;
int cubeWidth = 300;
int cubeHeight = 2;
float rY = 0.1; 
float rX = 0.1;

void setup() {
  size(640, 360, P3D);
}

void draw() { 

  background(3);
  lights();

  fill(247, 7, 12);

  rY = constrain(rY, 0, 70);
  rX = constrain(rX, 0, 70); 
  pushMatrix();
  translate(441, height/cubeHeight, 0);
  rY = rY + .005;
  println(rY);
  rotateY(rY);  // <--- here, when rY hits 70, it stops
  rX += rX;
  rotateX(rX);
  noStroke();
  box(69); 
  popMatrix();

  pushMatrix();
  translate(470, height*0.49, -221);
   rY = rY + .005;
  println(rY);
  rotateY(rY); 
  rX += rX;
  rotateX(rX);
  noFill();
  stroke(238);
  sphere(282);
  popMatrix();
}

2 个答案:

答案 0 :(得分:0)

这正是你在这行代码中告诉它的事情:

 
rY = constrain(rY, 0, 70);

constrain()函数将值限制为最小值和最大值,在本例中为070

如果你拿出那条线,你的草图会继续旋转。更多信息可以在the reference找到。

请注意,您使用rX变量做了一些奇怪的事情。由于某种原因,你似乎每次都加倍。如果你不限制它,这很快就会变得太大。但由于您只将.005添加到rY,因此您无需限制它。

答案 1 :(得分:0)

正如Kevin Workman所说,rY = constrain(rY, 0, 70);就是问题所在。你刚刚给了旋转一个终点。我稍微更改了代码,因为存在一些逻辑错误,因此它一直在向无穷大添加值。

rX += rX;增加加速度,所以一段时间后你会得到一个大的物体速度,例如(0.1 + 0.1 = 0.2;下一帧0.2 + 0.2 = 0.4 ......等等)。如果你能想象每秒有100帧,那么它很快就会变得非常快。因此,您只需要添加速度,而不是加速度rX += 1,每个帧将更新旋转一个角度。

并且您编写了两次代码,因此在一个帧中它变得更大。我分享了我更新的代码,也许会更清楚地看到它的变化。

float rY = 0.1; 
float rX = 0.1;

void setup() {
  size(640, 360, P3D);
}

void draw() { 

  background(3);
  lights();

  fill(125, 175, 225,175);

  pushMatrix();
  translate(width/2, height/2); // you do not need to write translate twice

  //box
  rY += 0.01; // you need only once to add the rotation value per frame
  rotateY(-rY); // negative rotation for the difference from sphere
  rX += 0.01;
  rotateX(-rX);
  noStroke();
  box(50); 

  //sphere
  rotateY(rY); 
  rotateX(rX);
  noFill();
  stroke(125, 175, 225,125);
  sphere(125);

  popMatrix();

  println(rY);
}