這是一個偉大的時刻使用面向對象的編程!如果我正確地理解了這個問題,您希望每個立方體獨立於其他立方體旋轉。我們來創建一個Cube類。將每個立方體視爲我們將單獨處理的對象。
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();
}
理解旋轉和平移元素真的很關鍵。如果您還沒有閱讀,我強烈建議您從Processing網站獲得this tutorial。我將一些概念引入了Cube類。
由於您希望在屏幕上繪製多個立方體,因此我們創建一個立方體數組。我選擇了25作爲任意數字。
Cube[] cube = new Cube[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();
}
}
我不知道你的編程背景是什麼,但要面向對象編程的掛在處理(和其他OOP語言)非常有幫助,所以我建議this OOP tutorial從處理的網站,如果你需要一個速成課程。當OOP最終有意義時,我的編程生活發生了變化。
我唯一的編程經驗是Max/MSP和編程微控制器,從來沒有真正完全理解OOP,但我現在明白了。謝謝! – snarehanger 2013-05-12 20:59:47