2011-07-10 42 views
4

我想使用OpenGL作为我的项目的图形。但我真的很想做得很好。我如何为每个类声明一个成员函数“draw()”来在OpenGL显示函数中调用它?面向对象编程和OpenGL

例如,我想是这样的:

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

问题是? –

+0

问题从“我怎么能......”开始! :D上面的行不起作用。 –

+1

你是什么意思的“没有工作”? – Arafangion

回答

0

啊,好老的直接模式的OpenGL。 :)那个例程看起来很好。

我可能会做出“画”的方法虚,不过,从指定的方法,这些类具有“可绘制”基地类型继承。

+0

我不想从任何东西继承,这是一个简单的问题。 draw()的定义对我有用吗?(我是初学者,直到现在我才知道这些线条)。我测试了我上面写的那些,但它不起作用。 –

2

嗯,这也取决于你有多少时间和需要什么。尽管如此,你的方法并不坏,有点过时。现代OpenGL使用着色器,但我猜这不是你的(学校?)项目所涵盖的。为此目的,对于初学者,你的方法应该是完全OK

除了着色器,如果你想进一步改进,你也可以沿着使用更通用的对象的方向,简单地存储顶点列表并将它与一个单独的“Renderer”类组合起来渲染多边形,由三角形组成。该代码是这样的:

renderer.draw(triangle); 

当然,多边形可以有喜欢的颜色,质地,透明度等一些附加的属性,你可以有一些更具体的多边形类,如TriangleStripTriangleFan等,也。然后,你需要做的就是在你的OpenGL Renderer中编写一个通用的draw()方法,它可以设置所有的状态并将顶点推送到渲染管线。

+0

非常感谢!你猜对了。 OpenGL基本上在我们的编程课程中介绍过,这对我的项目来说是一个奖励。其实我上周开始OpenGL!并阅读一些关于“GLUT”库的教程。我认为它可以帮助我不去思考顶点,而是去思考我需要的形状。我应该在今年夏天彻底学习OpenGL! –

1

当我工作在我的博士,我写了一个模拟器做你想做的事。请记住,即使您的代码看起来像面向对象,但OpenGL引擎仍然会按顺序渲染事物。另外,在OpenGL中,矩阵algrebra的顺序本质有时与您逻辑思考的顺序不同(我何时翻译,何时绘制,何时旋转等)。

记住LOGO回到过去?它有一只乌龟,这是一支钢笔,你将乌龟移动,它会画线。如果笔落下,它画了起来,如果笔是起来的,它没有。这就是我从事这个项目时的心态。我会在熟悉的坐标(0,0,0)处开始“龟”,并使用数学将其转换(将其移动到我要绘制的对象的中心),然后调用draw()方法正试图写出来绘制我的形状根据“龟”的相对坐标系,而不是绝对的(0,0,0)。然后我会移动,龟,画等希望帮助...

+0

非常感谢。我尝试了错误,直到我用他们的draw()函数编写我的类时,才达到了一个好的方案。这只是一个开始,我应该学习更多。 –

1

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

所以如上建议,去一个专门的渲染器类。这个类将知道应用程序中的所有可绘制对象。然后

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

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

你的GLUT显示功能将是一个静态函数调用(全局与否)渲染对象drawAllObjects()。