3

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

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

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

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

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

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

每次用户缩放或平移以确保点保持相同大小时,是否只是硬着头皮重新绘制整个数据集?有没有办法告诉openGL不要重新计算对象的大小?

抱歉,如果这在某处的 OpenGL 文档中 - 我找不到它。

4

3 回答 3

8

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

试试这个教程

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

看看它是否是你要找的。

于 2009-05-12T03:18:52.297 回答
2

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

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

除了调整大小之外,您还希望保持情节点朝向相机,因此广告牌是您的解决方案。

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

祝你好运!

于 2009-05-12T04:29:24.287 回答
0

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

于 2009-05-12T03:11:18.020 回答