2010-10-04 92 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