2010-10-04 38 views
1

我是OpenGL和C++的新手。假設我從一個2D廣場開始(如左圖所示),如下圖所示。我想讓它與glutKeyboardFunc()互動,所以當我按下一個數字時,一個新框將畫在相應的邊緣旁邊。如何將C++中的OpenGL元素存儲在樹形數據結構中?

alt text

圖做到這一點的最好辦法是有一個樹結構,保持所有的箱子。但我不確定我如何將基本的基本元素保存到數據結構中,例如樹。

我知道,我只能叫glutDisplayFunc(myDisplay)一次,其餘應由glutKeyboardFunc()

處理任何幫助,將不勝感激:)

更新:感謝您指出glutPostRedisplay()但如果我想使盒子可選,並且使用glutMouseFunc()跟蹤當前選擇的盒子,並且從那裏添加更多盒子時,我需要知道它創建了多少個子盒子,所以我可以在新盒子提供正確的位置時畫了。似乎現在使用樹數據結構更有意義?只是不知道如何將我需要的信息存儲到樹中。

+1

您只能調用一次glutDisplayFunc(myDisplay),但可以根據需要多次調用glutPostRedisplay()。 – 2010-10-04 01:09:28

回答

1

如果我理解你的問題,你可以做一個類,代表了中,如:

class Box { 
public: 
    void Move(int newx, int newy) { 
    x = newx; 
    y = newy; 
    } 
    void Resize(int newx, int newy) { 
    w = newx; 
    h = newy; 
    } 
    int getX() { return x; } 
    int getY() { return y; } 
    int getW() { return w; } 
    int getH() { return h; } 
private: 
    int x, y, w, h; 
}; 

然後,你可以有一個全球性的載體來存儲所有的盒子:

#include <vector> 

vector<Box> box; 

然後,您可以添加一個盒子這樣的:

Box newbox; 
newbox.Move(40,50); 
newbox.Resize(10,10); 
box.push_back(newbox); 

並移動現有的一個是這樣的:

box[3].Move(70,20); 

對不起,我不能完全回答你的問題,但我希望你知道如何完成你的項目有一個想法。

編輯:爲了實現一個樹狀結構,你可以將這些變量添加到Box類:

private: 
    Box* parent; 
    vector<Box*> child; 

這將允許您跟蹤樹結構。然後執行如下操作:

myBox->getChild(0)->getChild(1) 

將檢索myBox的第一個子項的第二個子項。我希望這對你有意義。

+0

沒關係,謝謝你的幫助。我不清楚矢量在這種情況下會起作用嗎?嗯,我正在考慮製作一個盒子課,但不知道應該包括什麼。你認爲我應該把所有的glVertex和其他opengl函數放在課堂上嗎?或者我應該保留它 – Jonathan 2010-10-04 02:04:32

+0

離開它。 Box類應該自己管理,而glKeyboard()等應該處理openGL的東西。 – 2010-10-04 02:10:48

+0

幾年前,我在C++中爲我的光線跟蹤器實現了一個邊界框層次結構。這個鏈接可能會幫助你,它有工作代碼的例子。作爲免責聲明,這是學術(扔掉)代碼。現在我已經專業地編寫軟件幾年了,回頭清理所有內容將會很好。 http://brian-stinar.blogspot.com/2008/04/acceleration-data-structure-bounding.html – 2010-10-04 19:14:47