2013-05-09 114 views
1

我在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); 
    } 
} 

下面是截圖,如果它有助於在所有, Here's a screenshot if it helps.

回答

5

這是一個偉大的時刻使用面向對象的編程!如果我正確地理解了這個問題,您希望每個立方體獨立於其他立方體旋轉。我們來創建一個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最終有意義時,我的編程生活發生了變化。

+0

我唯一的編程經驗是Max/MSP和編程微控制器,從來沒有真正完全理解OOP,但我現在明白了。謝謝! – snarehanger 2013-05-12 20:59:47