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

Loading Opengl models into a container and calling them one after the other

本文关键字:一个 调用 加载 模型 Opengl      更新时间:2023-10-16

我是编程新手,我想为OpenGL模型编写条件语句,这样当我单击按钮时,它会将三角形模型加载到stl向量容器中。当我再次点击同一个按钮时,它会在容器中加载另一个模型,比如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();
     }
}

首先要理解的是,OpenGL不维护场景或模型。它所做的只是根据你的要求在屏幕上画出漂亮的小点、线或三角形。一旦你在心理上消化了这些,事情就会变得显而易见:

存储一个列表,每个元素在其中对要绘制的内容进行编码。然后,您需要一些方法来遍历列表(或数组),并将每个元素分派到正确的函数(也是由您编写的)中,以根据元素的数据绘制几何图形。

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

然后,被覆盖的虚拟draw方法负责正确地渲染每种模型。