【问题标题】:Changing color of sphere with time (processing)随时间改变球体颜色(处理)
【发布时间】:2020-04-30 21:54:36
【问题描述】:

我是一个新的处理编码员,因此请温柔。 通常我的代码更长更复杂,但我为你写了一个简单的代码,我可以在我的代码上进行调整:

int speed = 1;
int x, z = 50;

void setup() {
  size(400, 400, P3D);
}

void draw() {
  background(0);
  noStroke();
  lights();
  translate(x, height/2, z);
  fill(255,0,0);
  sphere(25);

  if (x > width -50)
    noLoop();

  x += speed;
}

因此,如您所见,球体以红色开始,并到达窗口的末端。我想将它的颜色从红色变为白色,这需要 30 秒。到达窗口的尽头。但是我不知道怎么做。如果你帮助我,我会很高兴。 注意:我尝试了 lerpColor 功能,但没有帮助。

【问题讨论】:

    标签: java 3d processing


    【解决方案1】:

    数学是秘密。经常是。

    您需要跟踪几件事来完成此操作:穿过屏幕所需的时间(您说 30 秒)、球体的速度、颜色变化的速度。

    在我们开始之前,我建议您使用float 作为您的变量,即位置和速度。整数可以完成这项工作,但在某些时候,当您需要精度时,您可能会后悔没有使用浮点数或类似类型。

    有两种方法可以处理随时间发生的变化:您可以计算时间并将需要绘制的内容绘制到应该在的位置,或者计算在一定时间内将绘制多少帧并相应地移动内容。第一种技术的优点是即使系统滞后也能够在它们应该在的地方绘制东西(如果处理不能够遵守它,处理会降低帧速率),而第二种技术通常更容易使用。我们将使用帧率技术,因为这不应该很复杂,而且大多数程序不需要太多资源,它会降低帧率。

    处理中的帧速率也是主循环(draw() 循环)运行的速率。所以我们将选择一个帧速率,它可以让我们计算球体的速度和颜色变化的速度。其余的只是看着它移动。

    这是您的示例,但经过修改后大致如您所说:

    float speed;
    float x, z = 50;
    float greenBlueStrength = 0;
    float colorFadeRate = 1;
    int fadeTimeInFrames;
    
    void setup() {
      size(400, 400, P3D);
      frameRate(60); // 60 is the default framerate per second
      // so 30 seconds == (30*60) == 1800 frames
      // so you must have the speed to match
      fadeTimeInFrames = 60 * 30;
      speed = (width - 50) / (float)fadeTimeInFrames;
      colorFadeRate = 255 / (float)fadeTimeInFrames;
      println(colorFadeRate);
    }
    
    void draw() {
      background(0);
      textSize(30);
      text((millis()/1000) + " s. // color: " + (int)greenBlueStrength, 20, 50);
      // this is just to keep track of changes while they happen
    
      noStroke();
      lights();
      translate(x, height/2, z);
      fill(255, greenBlueStrength, greenBlueStrength);
      sphere(25);
    
      if (x > width -50) {
        noLoop();
      } // no actual change, but use brackets anyway, it's easier to read
    
      // updating what needs to be updated
      x += speed;
      greenBlueStrength += colorFadeRate;
    }
    

    如果您有任何问题,请不要犹豫。

    玩得开心!

    【讨论】:

    • 首先非常感谢您的帮助和支持@Iaancelot。我试过你的代码,它有很大帮助。所以,我想再问一个问题。如果 shpere 颜色将填充(255,153,8);和大小 (1200,800,P3D) 也是时间 120 秒。会发生什么变化?
    • 是的,它会的。我硬编码fadeTimeInFrames = 60 * 30; 以跟踪“动画”将持续多少帧,而实际上等式将是seconds * framerate == total amount of frames。所以你必须改变这个数字。对于距离,我已经使用了width 属性,它会自动更新。这就是速度和帧数。
    • 不过,颜色会有所不同。如果您开始使用特定颜色,我建议使用color 结构。或者您可以使用 Safir 的策略并为 R、G 和 B 保留不同的值。我所做的不同之处主要是将它们保持为浮点数,以便我可以逐渐添加到它们(当我将它们用于颜色时它们会转换为整数,所以尾随数字只是为了更精确地跟踪它的变化速度)。
    • 最终都是简单的数学运算,更准确地说是分数:您必须将所需的更改除以您将填充的帧数。如果要在 Y 帧中移动 X 像素,则对象移动的速度为每帧 X/Y 像素。您可以量化的任何其他变化也是如此,在这种情况下,例如颜色变化。
    • 非常感谢@Iaancelot,我完全明白你在说什么,它甚至对我的其他问题也有很大帮助。你是英雄! :)
    【解决方案2】:

    我认为这样的事情会起作用:

    int r=255,b=255,g=255;
    
    ...
    
    void draw(){
    ...
    
      int percent=x/width*100;
      fill(r,b*percent,g*percent)
      sphere(25)
    
    ...
    }
    

    所以球体只会在屏幕左侧为红色,右侧为白色

    【讨论】:

    • 首先感谢您的帮助和支持。我试过你的想法,但它没有改变球体的颜色。也许,您的代码看起来更明亮。但是我想逐步改变颜色。红到白。
    • 为了让它按我的意思工作,让它像这样:int percent=x/width 使 255*percent 介于 0 和 255 之间(而不是 25500 :x)。如果你只想迈出一步,你可以这样做 if(xfill(255,0,0) else ->fill(255,255,255) (在 draw() 中)
    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多