将Opengl模型加载到容器中并一个接一个地调用它们

时间:2012-01-16 08:24:03

标签: c++ opengl stl

我是编程新手,我想为OpenGL模型编写条件语句,这样当我点击一个按钮时,它会在stl矢量容器中加载一个Triangle模型。当我再次单击相同的按钮时,它会在容器中加载另一个模型,例如Quad,并且对于进一步的按钮点击,它会加载更多模型,如Cube,Toroid等等.... 我还要包含一个撤消按钮来删除最后加载的模型。

有人可以指导我编写这样的条件声明,了解如何在每个按钮点击时将4个模型加载到STL矢量容器中,还可以撤消加载

class Shapes {
public:
    Shapes(){}
    ~Shapes(){}
    virtual void draw() 
    { 
        std::cout << "Base function called" << std::endl; 
    }

};

class Models : public Shapes 
{    
  public: Models() 
    {

    }

    ~Models() {}

    virtual void draw() 
    {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
            glLoadIdentity(); 
            glTranslatef(-1.5f, 0.0f, -6.0f); 
            glBegin(GL_TRIANGLES); 
               glColor3f(1.0f, 0.0f, 0.0f); // Red color
               glVertex3f( 0.0f,  1.0f, 0.0f); // Top
               glColor3f(0.0f, 1.0f, 0.0f); // Green color
               glVertex3f(-1.0f, -1.0f, 0.0f); // Bottom Left
               glColor3f(0.0f, 0.0f, 1.0f); // Blue color
               glVertex3f( 1.0f, -1.0f, 0.0f); // Bottom Right
            glEnd(); // End drawing the triangle


    }

};

Draw_All_models{

  std::vector<Shapes*> myObjects;

  myObjects.push_back(new Triangle());
  myObjects.push_back(new Quad());
  //more models...

  void RenderScene() 
  {
    std::vector<Shapes*>::iterator it;
    for(it = myObjects.begin() ; it != myObjects.end; ++it) (*it)->draw();
     }
}

1 个答案:

答案 0 :(得分:1)

首先要了解的是,OpenGL不维护场景或模型。所有这一切都是根据您的要求在屏幕上绘制漂亮的小点,线或三角形。一旦你精神消化了,事情就会变得明显:

存储一个列表,其中每个元素编码要在哪里绘制的内容。然后你需要一些遍历列表(或数组)的方法,并为每个元素调度到右边的函数(也是由你编写)来根据元素的数据绘制几何。

例如,在C ++中,您可能有一些基类Model,您可以从中派生类BoxSphereTorus等等。 Model定义了虚拟方法draw。然后你制作一个std::list<Model*> models,你可以按for(std::list<Model*> I = models.begin(); I != models.end(); I++){(*I)->draw();}

进行迭代

重写的虚拟draw方法然后负责正确渲染每种模型。