面向对象编程和OpenGL
Posted
技术标签:
【中文标题】面向对象编程和OpenGL【英文标题】:Object Oriented Programming and OpenGL 【发布时间】:2011-07-10 13:56:54 【问题描述】:我想使用 OpenGL 作为我项目的图形。但我真的很想以一种好的风格来做这件事。如何为每个类声明一个成员函数“draw()”以在 OpenGL 显示函数中调用它?
例如,我想要这样的东西:
class Triangle
public:
void draw()
glBegin(GL_TRIANGLES);
...
glEnd();
;
【问题讨论】:
问题从“我怎么能……”开始! :D 上面的行不起作用。 “没用”是什么意思? 【参考方案1】:嗯,这还取决于您有多少时间以及需要什么。你的方法还不错,不过有点过时了。现代 OpenGL 使用着色器,但我猜这不在您的(学校?)项目中。为此,对于初学者来说,您的方法应该完全没问题。
除了着色器之外,如果您想更进一步,您还可以使用更通用的polygon 对象,只需存储顶点列表并将其与单独的“渲染器”类结合起来能够渲染多边形,由三角形组成。代码如下所示:
renderer.draw(triangle);
当然,多边形可以有一些额外的属性,如颜色、纹理、透明度等。你也可以有一些更具体的多边形类,如TriangleStrip
、TriangleFan
等。然后你需要做的就是在你的 OpenGL Renderer
中编写一个通用的 draw()
方法,它将能够设置所有状态并将顶点推送到渲染管道。
【讨论】:
非常感谢!你猜对了。 OpenGL 基本上涵盖在我们的编程课程中,我的项目使用它是一个奖励。实际上我上周开始使用 OpenGL!并阅读一些关于“GLUT”库的教程。我认为它可以帮助我不去思考顶点,而是去思考我需要的形状。今年夏天我应该彻底学习OpenGL!【参考方案2】:当我攻读博士学位时,我编写了一个模拟器来完成你想做的事情。请记住,即使您的代码看起来是面向对象的,OpenGL 引擎仍然会按顺序渲染。此外,OpenGL 底层的矩阵代数的顺序性有时与您在逻辑上认为的顺序不同(我什么时候平移,什么时候绘制,什么时候旋转,等等?)。
还记得以前的LOGO吗?它有一只乌龟,它是一支笔,你移动乌龟,它就会画线。如果笔是向下的,它会画画,如果笔是向上的,它不会。这就是我在做这个项目时的心态。我会在熟悉的坐标 (0, 0, 0) 处启动“乌龟”,然后使用数学来翻译它(将它移动到我要绘制的对象的中心),然后调用 draw() 方法正在尝试根据“乌龟”所在的相对坐标系而不是绝对坐标系(0、0、0)来绘制我的形状。然后我会移动,乌龟,画画等。希望有帮助......
【讨论】:
非常感谢。我尝试了错误,直到我找到了一个用他们的 draw() 函数编写我的类的好方案。这只是一个开始,我应该了解更多。【参考方案3】:不,它不会像这样工作。问题是 GLUT Display 函数正是 one 函数。所以如果你想画一堆三角形,你仍然可以只注册它们的一个 draw() 函数作为 GLUT 显示函数。 (此外,指向 C++ 中的成员函数的指针也是一个难题)。
因此,如上所述,请使用专用的 Renderer 类。此类将了解您的应用程序中的所有可绘制对象。
class Renderer
std::list<Drawable> _objects;
public:
drawAllObjects()
// iterate through _objects and call the respective draw() functions
;
您的 GLUT 显示函数将是一个静态函数,它在(全局或非全局)渲染器对象上调用 drawAllObjects()。
【讨论】:
【参考方案4】:啊,好旧的即时模式 OpenGL。 :) 那里的例程看起来不错。
不过,我可能会将“draw”方法设为虚拟方法,并从指定此类具有的方法的“Drawable”基类型继承。
【讨论】:
我不想继承任何东西,这是一个简单的问题。 draw() 的定义对我有用吗?(我是初学者,到目前为止我只知道这些行)。我测试了上面写的那些,但是没有用。以上是关于面向对象编程和OpenGL的主要内容,如果未能解决你的问题,请参考以下文章