渲染高度细化和 "放大 "的数据。

问题描述 投票:0回答:1

网上有一个gif,有人用某种CAD在里面画了多张矢量图。在第一帧,他们放大了一个小点,揭示了一个全新的不同的矢量图片,只是在一个不同的规模,然后他们继续进一步放大另一个小点,揭示了另一个详细的图片,重复几次。这里是链接到gif 或者另一个类似的例子:想象一下,你有一个时间序列,每个样本的粒度是一毫秒,你放大后可以看到多年的数据。

我的问题是:当大量的数据最终被异化成一个像素的时候,这样一个细化的数据,最后是如何被渲染的。你是否必须通过整个数据集来渲染这个像素(例如,在时间序列的情况下:通过百万条记录来将它们平均成一条线,或者在CAD的情况下,渲染整个矢量图并将其模糊成一个小点),或者有某些细节级别的优化可以应用,这样你就不必这样做?如果有,它们是如何工作的,在哪里可以了解到?

plot time-series rendering cad
1个回答
1
投票

这在游戏开发中是一个非常著名的问题。在下面的内容中,我假设你使用的是一个场景图,一个基于节点的对象树。

典型的解决方案涉及这些技术的混合。

  • 细节级(LOD):同一模型的多个分辨率,它们被显示或隐藏,以便在任何时候只有一个是 "可见 "的。何时隐藏和显示通常由相机和对象之间的距离决定,但你也可以将对象的比例作为一个因素。现代3dCAD软件有时会给你提供自动 "简化 "的模型,它可以作为低分辨率的LOD模型。

    在最底层,你甚至可以只使用对象的boundingbox。检查边界框是否在视图中,根据你的检查方式,只有1-7点左右的检查。而且你可以利用对象的父代来处理转折性的边界框。

  • 剪裁:如果一个多边形在视图端口根本没有渲染,就不需要渲染。在你发的GIF中,当摄像机放大新的场景时,从大模型中留下的是背景中的一个多边形。

  • 世界坐标的重新缩放:当你放大时,顶点的坐标变成了次零的浮点数。鉴于你希望所有坐标尽可能精确,而且考虑到现代CPU只能处理精度为64位的浮点数(通常只使用32位以获得更好的性能),重新设置可见对象的缩放比例是个好主意。我的意思是,当你的相机放大到比如说前一个视图的11000时,你可以将较大的物体放大1000倍,同时调整相机的位置。任何新附加的小模型都会使用它原来的比例,从而保持它的精度。这种过渡对观看者来说将是不可见的,但可以让你保持在定义良好的三维坐标内,同时可以无限放大。


0
投票

首先,你可以使用缓存。用磁贴,就像在制图中做的那样。你仍然需要翻阅所有的点,但之后你就能相当迅速地放大-缩小。

但如果你没有多余的内存来缓存(其实也没那么多,比数据本身少得多),或者没有时间去看所有的点,你可以使用概率方法。

它可以简单到每隔一个点(或每10个点或任何适合你的点)才偷看一次。它可以产生不错的结果,对于 一些数据. 同样,在制图中,它对海岸线相当有效,但对房屋或行政边界--任何有大量直线的东西--就不那么好用了。

或者你可以采取更强硬的概率方法:随机地偷看一些点,如果,例如,有100个数据点击中了 pixel one 而只有50个打 pixel two那么你可以或多或少地安全地假设,如果你将继续窥视点仍然是 pixel one 将有两倍的可能性被击中, pixel two. 所以你可以放弃,画 pixel one 再加一倍 沉重 颜色。

还要考虑你可以和想要在一个像素中放多少数据。如果你要用黑白画一个像素,那么只有256种颜色的变体。而且你不需要更精确。或者说,如果你要用全彩画一个像素,那么你还需要问自己:会有人注意到这样的区别吗?rgb(123,12,54)rgb(123,11,54)?

© www.soinside.com 2019 - 2024. All rights reserved.