【问题标题】:Drawing "point-like" shapes in OpenGL, indifferent to zoom在OpenGL中绘制“点状”形状,对缩放无所谓
【发布时间】:2009-05-12 03:04:02
【问题描述】:

我正在使用 Qt 和 QWt3D 绘图工具,并扩展它们以提供我需要的一些 3-D 和 2-D 绘图功能,因此我正在学习一些 OpenGL。

我目前能够使用 OpenGL 绘制点,但只能绘制为圆形(或通过关闭抗锯齿功能来绘制“正方形”)。这些点以我喜欢的方式运行 - 即它们不会在我放大时改变大小,尽管它们的 x/y/z 位置会在我缩放、平移等时适当移动。

我想做的是使用无数形状(^、、*、. 等)绘制点。根据我对 OpenGL 的理解(不是很多),这并非易事,因为 OpenGL 将所有内容都视为“真实”的 3-D 对象,因此放大任何 openGL 形状,但“点”会改变对象的投影大小。

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

  1. 使用 OpenGL 纹理。这似乎并不难,但我相信纹理图像会随着我的放大而变得越来越小——对吗?

  2. 使用 OpenGL 多边形、线条等并绘制 *、三角形或其他任何东西。但是在这里我又遇到了同样的问题——如何防止 OpenGL 在缩放时重新调整“点”的大小?

解决方案是在每次用户缩放或平移时简单地硬着头皮重新绘制整个数据集以确保点的大小保持不变?有没有办法告诉openGL不要重新计算对象的大小?

对不起,如果这在某个地方的 OpenGL 文档中 - 我找不到它。

【问题讨论】:

    标签: opengl graphics graph


    【解决方案1】:

    您想要的称为“点精灵”。 OpenGL1.4 通过ARB_point_sprite 扩展支持这些。

    试试这个教程

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

    看看是不是你要找的。​​p>

    【讨论】:

      【解决方案2】:

      无论如何,每次用户缩放或平移时都会重新绘制场景,因此您不妨重新计算大小。

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

      除了调整大小之外,您还希望保持绘图点朝向相机,因此billboarding 是您的解决方案。

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

      祝你好运!

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多