THREE.Sprite 大小以 px 为单位,sizeAttenuation 为 false

THREE.Sprite size in px with sizeAttenuation false

我正在尝试缩放精灵以使其具有以像素为单位定义的大小。无论相机 FOV 等如何。我将 sizeAttenuation 设置为 false,因为我不希望它们根据与相机的距离进行缩放,但我很难设置比例。真的不知道转换公式,当我用一些在一台设备上没问题的数字对比例进行硬编码时,在另一台设备上是错误的。任何建议或帮助如何让精灵在多个设备上具有正确的大小?谢谢

正确答案:

精灵大小以世界单位衡量。将世界单位转换为像素单位可能需要大量计算,因为它会根据相机的 FOV、与相机的距离、window 高度、像素密度等而变化...

要使用基于像素的单位,如果 sizeAttenuation 设置为 false,我建议从 THREE.Sprite 切换到以像素为单位的 THREE.Points. It's material THREE.PointsMaterial has a size property。请记住,它有一个基于设备硬件的最大大小限制,由 gl.ALIASED_POINT_SIZE_RANGE.

定义

下面继续我原来的回答:

然而,“1 像素”现在是一种主观测量,因为如果您使用 renderer.setPixelRatio(window.devicePixelRatio);,那么您将在不同的设备上获得不同的精灵尺寸。例如,MacBooks 的像素比为 2 及以上,一些手机的像素比为 3,而桌面显示器通常为 1。这可以通过不使用 setPixelRatio 来避免,或者如果您使用它,你必须使用乘法:

const s = 5;
points.size = s * window.devicePixelRatio;

要记住的另一件事是 sprites THREE.Points 的大小以像素为单位,而网格的大小以世界单位为单位。因此,有时当您垂直缩小浏览器 window 时,sprite Point 大小将保持不变,但网格会缩小以适合视口。这意味着 5px sprite Point 在小型 window 中将比在大型显示器中占用更多空间。如果这是问题所在,请确保在计算 sprite Point 大小时使用 window.innerHeight 值。