繁体   English   中英

Object 面向编程和 OpenGL

[英]Object Oriented Programming and OpenGL

我想使用 OpenGL 作为我项目的图形。 但我真的很想以一种好的风格来做这件事。 如何为每个 class 声明一个成员 function "draw()" 以在 OpenGL 显示 ZC1C425267E17A945D 中调用它

例如,我想要这样的东西:

class Triangle
{
    public:
        void draw()
        {
           glBegin(GL_TRIANGLES);
              ...
           glEnd();
        }
};

好吧,这还取决于您有多少时间以及需要什么。 你的方法还不错,虽然有点过时。 现代 OpenGL 使用着色器,但我猜这不在您的(学校?)项目中。 为此,对于初学者来说,您的方法应该完全没问题

除了着色器,如果你想更进一步,你还可以 go 使用更通用的多边形对象,只需存储一个顶点列表并将其与一个单独的“渲染器”class 结合,它能够渲染多边形,由三角形组成。 代码如下所示:

renderer.draw(triangle);

当然,多边形可以有一些额外的属性,比如颜色、纹理、透明度等。你也可以有一些更具体的多边形类,比如TriangleStripTriangleFan等。 然后您需要做的就是在您的 OpenGL Renderer中编写一个通用的draw()方法,该方法将能够设置所有状态并将顶点推送到渲染管道。

当我在攻读博士学位时,我编写了一个模拟器来完成你想做的事情。 请记住,即使您的代码可能看起来面向 object,OpenGL 引擎仍会按顺序呈现事物。 此外,在 OpenGL 中隐藏的矩阵代数的顺序性有时与您在逻辑上认为的顺序不同(我什么时候平移,什么时候绘制,什么时候旋转,等等?)。

还记得以前的LOGO吗? 它有一只乌龟,它是一支笔,你移动乌龟,它就会画线。 如果笔是向下的,它会画画,如果笔是向上的,它不会。 这就是我在做这个项目时的心态。 我会在熟悉的坐标 (0, 0, 0) 开始“乌龟”,然后使用数学来翻译它(将它移动到我要绘制的 object 的中心),然后调用 draw() 方法正在尝试根据“乌龟”所在的相对坐标系而不是绝对坐标系(0、0、0)来绘制我的形状。 然后我会移动,乌龟,画画等。希望有帮助......

不,它不会像这样工作。 问题是 GLUT 显示器 function 正好是一个function。 所以如果你想画一堆三角形,你仍然可以只注册一个 draw() 函数作为 GLUT 显示 function。 (此外,指向 C++ 中的成员函数的指针也是一个难题)。

因此,如上所述,go 用于专用渲染器 class。 这个 class 将知道您的应用程序中的所有可绘制对象。

class Renderer {
   std::list<Drawable> _objects;

   public:
      drawAllObjects() {
         // iterate through _objects and call the respective draw() functions
      }
};

Your GLUT display function would then be a static function that calls drawAllObjects() on a (global or not) renderer object.

啊,好旧的即时模式 OpenGL。 :) 那里的例程看起来不错。

不过,我可能会将“draw”方法设为虚拟,并从指定此类具有的方法的“Drawable”基类型继承。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM