c++ - 将 Opengl 模型加载到容器中并依次调用它们

标签 c++ opengl stl

我是编程新手,我想为 OpenGL 模型编写条件语句,这样当我单击一个按钮时,它会在 STL vector 容器中加载一个三角形模型。当我再次单击同一个按钮时,它会在容器中加载另一个模型,比如 Quad,如果进一步单击按钮,它会加载更多模型,例如 Cube、Toroid 等等…… 我还将包括一个“撤消”按钮以删除上次加载的模型。

谁能指导我编写这样的条件语句,说明如何在每次单击按钮时将大约 4 个模型加载到 STL vector 容器中,并撤消加载

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从中派生类 Box , Sphere , Torus等等。 Model定义一个虚拟方法 draw .然后你做一个std::list<Model*> models ,您可以通过 for(std::list<Model*> I = models.begin(); I != models.end(); I++){(*I)->draw();} 对其进行迭代

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

关于c++ - 将 Opengl 模型加载到容器中并依次调用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8877284/

相关文章:

c++ - 如何将结构 vector 传递给 C++ 中的函数?

c++ - 这是一个糟糕的设计吗?

c++ - 为什么我的三角形对象没有被绘制?

c++ - 需要帮助理解 GCC 给出的 "within a nested template argument list"错误的含义

c++ - STLPort 和 SGI STL 的区别

c++ - 在运行时从列表中添加和删除

c++ - Qt pro 文件中的 LDFLAGS

c++ - 如何使用 C++ TMP 实现 MultiUnitValue 类

c++ - 手动检索和存储指向 OpenGL 函数的指针时出现问题

c++ - 在不安装的情况下运行 OpenGL?