在OpenGL中绘制“点状”形状,不受缩放影响

3
我正在使用Qt和QWt3D绘图工具,并对它们进行扩展以提供我需要的一些三维和二维绘图功能,因此在这个过程中我正在学习一些OpenGL。
目前我能够使用OpenGL绘制点,但仅限于圆形(或通过关闭抗锯齿来绘制“正方形”)。这些点的表现方式很好 - 即它们不会随着缩放而改变大小,尽管它们的x / y / z位置会随着我缩放、平移等操作相应地移动。
我想要做的是使用各种形状(^,<,>,*,.等)绘制点。根据我对OpenGL的理解(并不是很多),这不是一件容易的事情,因为OpenGL将所有东西都视为“真实”的三维对象,因此缩放除了“点”之外的任何OpenGL形状都会改变对象的投影大小。
经过一些阅读,我认为有(至少)两种可能的解决方法:
1. 使用OpenGL纹理。这似乎并不困难,但我相信随着缩放,纹理图像会变大和变小 - 这是正确的吗?
2. 使用OpenGL多边形、线条等,并绘制*、三角形或其他形状。但是这里我又遇到了同样的问题 - 如何防止OpenGL随着缩放重新调整“点”的大小?
解决方法是直接重新绘制整个数据集,以确保点的大小保持不变吗?是否有某种方法只告诉OpenGL不重新计算对象的大小?
如果这些信息在OpenGL文档中,请原谅我没有找到。
3个回答

8

2
每次用户缩放或平移时,场景都会重新绘制,因此最好重新计算大小。您建议使用纹理多边形或直接使用多边形,这听起来对我来说是个好主意。看起来您希望在相机移动时保持绘图点在图表中的正确位置,但希望在用户缩放时防止它们改变大小。为此,请调整绘图点多边形的大小,使多边形大小与到相机的距离之比保持不变。如果您有很多绘图点,则由于涉及平方根,计算到相机的距离可能会变得昂贵,但查找表可能会解决该问题。
除了调整大小外,您还需要让绘图点面向相机,因此billboarding是您的解决方案。
一种替代方案是将每个3D图形点的位置投影到二维屏幕坐标上,然后在那些屏幕坐标处渲染多边形。不需要重新缩放。然而,gluProject很慢,所以我会非常惊讶地发现这种方法不比我最初建议的重新缩放图形点多边形快几个数量级。
祝你好运!

0

想要实现你想要的功能并不容易。你需要根据相机当前的缩放比例动态调整你正在绘制的基本图形的大小。你可以使用一种称为billboarding的技术,确保你的对象始终面向相机。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接