在OpenGL中绘制“点状”形状,对缩放无动于衷

时间:2009-05-12 03:04:02

标签: opengl graphics graph

我正在使用Qt和QWt3D绘图工具,并将它们扩展为提供我需要的一些3D和2D绘图功能,所以我在这个过程中学习了一些OpenGL。

我目前能够使用OpenGL绘制点,但仅通过关闭反锯齿来绘制圆圈(或“正方形”)。这些点按照我喜欢的方式运行 - 也就是说,当我放大时它们不会改变大小,尽管它们在缩放,平移等时它们的x / y / z位置会相应地移动。

我希望能够做的是使用无数形状(^,<,>,* ,.等)绘制点。根据我对OpenGL的了解(这不是很多),因为OpenGL将所有内容视为“真正的”三维对象,因此放大任何openGL形状,但“点”会改变对象的投影大小

在做了一些阅读之后,我认为(至少)有两种可能的解决方案可以解决这个问题:

  1. 使用OpenGL纹理。这似乎并不困难,但我相信随着我的放大,纹理图像会变得越来越大 - 这是正确的吗?

  2. 使用OpenGL多边形,线条等绘制*,三角形或其他内容。但是我又遇到了同样的问题 - 当我缩放时,如何防止OpenGL重新调整“点”的大小?

  3. 每次用户缩放或平移以确保点数保持相同时,解决方案是简单地咬住子弹并重新绘制整个数据集吗?有没有办法告诉openGL不重新计算对象的大小?

    很抱歉,如果这是在某个地方的OpenGL文档中 - 我找不到它。

3 个答案:

答案 0 :(得分:8)

你想要的是一个“点精灵”。 OpenGL1.4通过ARB_point_sprite扩展名支持这些。

试用本教程

http://www.ploksoftware.org/ExNihilo/pages/Tutorialpointsprite.htm

看看它是不是你要找的东西。

答案 1 :(得分:2)

无论如何,每次用户缩放或平移时都会重新绘制场景,因此您可以重新计算尺寸。

你建议使用纹理多边形,或直接使用多边形,这对我来说听起来不错。听起来您希望绘图点在摄像机移动时保持在图形中的正确位置,但是您希望防止它们在用户缩放时改变大小。要执行此操作,只需调整绘图点多边形的大小,以使多边形的大小与到摄像机的距离之间的比率保持不变。如果你有很多绘图点,计算与相机的距离可能会因为涉及到平方根而变得昂贵,但查找表可能会解决这个问题。

除了调整大小外,您还需要保持绘图点面向摄影机,因此billboarding是您的解决方案。

另一种方法是project每个3D绘图点位置找出他们的2D屏幕坐标。然后只需在那些屏幕坐标处渲染多边形。无需重新扩展。然而,gluProject非常慢,所以如果不像我最初建议的那样简单地重新缩放绘图点多边形,我会感到非常惊讶。

祝你好运!

答案 2 :(得分:0)

没有简单的方法可以做你想做的事。您必须动态调整您正在绘制的图元的大小,具体取决于相机的当前缩放。您可以使用称为billboarding的技术来确保您的对象始终面向相机。