当前位置: 首页 > 知识库问答 >
问题:

加工中的连续旋转

堵宏毅
2023-03-14

我在Procesisng中编写了一个程序,它以随机的颜色和旋转来呈现不透明的立方体,但我希望在程序运行的同时连续地旋转每个立方体。这是我目前的代码,

int boxval = 1;

void setup(){
size (640, 320, P3D);
frameRate(60);
}

void draw(){
  for (int i = 0; i < boxval; i++){
translate(random(0,640), random(0,320), 0); 
rotateY(random(0,360));
rotateX(random(0,360));
rotateZ(random(0,360));
fill(random(0,255),random(0,255),random(0,255),50);
noStroke();
box(64,64,64);
  }
}

共有1个答案

曾飞雨
2023-03-14

这是使用面向对象编程的大好时机!如果我正确理解这个问题,你希望每个立方体独立于其他立方体旋转。让我们做一个立方体类。将每个多维数据集视为一个我们将单独处理的对象。

class Cube {
  float x, y, z; // position of the cube
  float size; // size of cube
  color c; // color of cube
  float xAngle, yAngle, zAngle; // current rotation amount of cube's x, y, z axes
  float xSpeed, ySpeed, zSpeed; // how quickly the cube is rotated in the x, y, z axes 

  // Cube constructor - create the cube and all of its parameters
  Cube(float x_, float y_, float z_, float size_, color c_, float xSpeed_, float ySpeed_, float zSpeed_) {
    x = x_;
    y = y_;
    z = z_;
    size = size_;
    c = c_;
    xSpeed = xSpeed_;
    ySpeed = ySpeed_;
    zSpeed = zSpeed_;

    xAngle = yAngle = zAngle = 0; // starting position
  }

  // update the cube
  // all we're doing is rotating each axis
  void update() {
    xAngle += xSpeed;
    yAngle += ySpeed;
    zAngle += zSpeed;
  }

  // draw the cube to the screen
  void display() {
    pushMatrix(); // need this
    translate(x, y, z); // position on screen
    rotateX(xAngle); // rotation amounts
    rotateY(yAngle);
    rotateZ(zAngle);
    fill(c);
    noStroke(); 
    box(size);
    popMatrix(); // and this
    // push and pop matrix allows for individual cube rotation
    // otherwise you would rotate the whole draw window, which isn't what you're looking for
  }
}

如果希望每个多维数据集在屏幕上改变颜色和位置,但仍然独立旋转,则display()函数可以如下所示:

  void display() {
    pushMatrix(); 
    translate(random(0, width), random(0, height), random(-100, 100)); // random position on screen
    rotateX(xAngle);
    rotateY(yAngle);
    rotateZ(zAngle);
    fill(random(255), random(255), random(255), 50); // random color
    noStroke(); 
    box(size);
    popMatrix();
  }

在处理过程中理解元素的旋转和平移是非常关键的。我强烈推荐这篇来自处理网站的教程,如果你还没有读过的话。我在Cube类中融入了一些概念。

因为您希望在屏幕上绘制多个立方体,所以让我们创建一个立方体数组。我选择了25作为一个任意的数字。

多维数据集[]多维数据集=新多维数据集[25];

现在,在setup()中,我们需要实际创建每个多维数据集,并为其赋予某些参数,如屏幕上的位置、颜色等。

for (int i = 0; i < cube.length; i++) {
  cube[i] = new Cube(random(0, width), random(0, height), 0, // x, y, z position
  random(30, 80), color(random(255), random(255), random(255), 50), // size, color
  random(0.001, 0.020), random(0.001, 0.020), random(0.001, 0.020)); // xSpeed, ySpeed, zSpeed
}

现在我们只需要将立方体绘制到屏幕上,并更新每个立方体的旋转,这只需要在draw()循环中完成。

for (int i = 0; i < cube.length; i++) {
  cube[i].update();
  cube[i].display()      
}

这是整个程序。每次通过draw()循环调用background()非常重要,这样显示窗口将在每一帧中被清除。注释出来看看会发生什么,但我注意到上面提供的代码段中没有这一点。我想这可能是一种效果!

Cube[] cube = new Cube[25];

void setup() {
  size(640, 320, P3D);
  smooth();
  frameRate(60);

  for (int i = 0; i < cube.length; i++) {
    cube[i] = new Cube(random(0, width), random(0, height), 0, 
    random(30, 80), color(random(255), random(255), random(255), 50), 
    random(0.001, 0.020), random(0.001, 0.020), random(0.001, 0.020));
  }
}

void draw() {
  camera();
  lights();
  background(50);
  for (int i = 0; i < cube.length; i++) {
    cube[i].update();
    cube[i].display();
  }
}

我不确定您的编程背景是什么,但掌握面向对象编程对Processing(和其他OOP语言)确实很有帮助,所以如果您需要速成班,我会推荐Processing网站上的这篇OOP教程。当OOP终于有意义时,我的编程生活发生了改变。

 类似资料:
  • 问题内容: 我正在尝试使用PNG和CSS3动画复制Apple风格的活动指示器(日程加载图标)。我使图像旋转并连续进行,但是在动画完成之后似乎有延迟,然后再进行下一个旋转。 我尝试过更改动画的持续时间,但是没有什么区别,如果您将其放慢,请说5s,这更明显的是,在第一次旋转之后会有一个暂停,然后再次旋转。我想摆脱的是这个停顿。 非常感谢任何帮助,谢谢。 问题答案: 您的问题是您需要时提供了。您的0到3

  • 我在这个网站上看到过关于javafx中旋转的问题,但我似乎不太明白。下面是一些代码: 为什么当我改变角度时,矩形开始出现在随机位置?例如,当我将角度设置为 180 时,矩形出现在中间。我的理解是,矩形围绕 X:150 和 Y:225 以指定的角度移动。但是,当我将角度设置为180时,我完全错了。你们能帮帮我吗? 编辑:在阅读和看到回答这个问题的代码时,我想我发现了一个新问题。如何设置pivotX和

  • 问题内容: 感谢Mike提出的添加创建/插入语句的建议。 我想添加一个新列,即“当前条纹天数”,因此 结果 如下所示: 但我不知道如何将技巧与其他窗口功能结合使用以获取正确的结果。 问题答案: 在此表上构建(不使用SQL关键字“ date”作为列名。): 询问: 从另一个减去a得到一个。由于您一直在寻找连续的日子,因此下一行将增加 一 。如果从中减去,则整个条纹最终将归入同一组()。然后,很容易按

  • 问题内容: 我有一个sql表,用于存储股票的每日价格。收市后每天都会插入新的记录。我想找到价格连续上涨的股票。 该表有很多列,但这是相关的子集: 该列是主键。 在表中,股票编号1的收盘价每天都在增加。股票ID 3的波动很大,股票ID 2的价格在最后一天下跌。 我正在寻找这样的结果: 如果您可以获得带有连续条纹的日期的输出,那就更好了: 价格开始上涨的时间,牛市实际上结束的时间。 我认为这不是一个容

  • 我在这里试图实现的是,当用户选择ComboBox中的数据时,它会将其与我的HashMap匹配,并将其添加到ArrayList中。 代码有效。输出为: (用户从组合框中选择了 LOTR 1) 但是当我再次单击该按钮时,ArrayList会重置。我想要的是让ArrayList继续添加数据而不替换初始数据,即使它是重复的。例如: 基本上,用户可以从ComboBox中选择无数次,ArrayList不断添加

  • 本文向大家介绍C ++中的连续数字和,包括了C ++中的连续数字和的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个正整数N,我们必须找到多少种方法可以将其写为连续的正整数之和? 因此,如果输入像10,那么输出将是3,这是因为我们可以将10表示为5 + 5和7 + 3,所以有两种不同的方式。 为了解决这个问题,我们将遵循以下步骤- ret:= 1 对于初始化i:= 2,(将i增加1),请执行