Исправленный ответ:
Размер спрайта измеряется в мировых единицах. Преобразование мировых единиц в пиксельные единицы может потребовать большого количества вычислений, поскольку оно варьируется в зависимости от поля зрения камеры, расстояния от камеры, высоты окна, плотности пикселей и т. Д. *
Чтобы использовать пиксельные единицы, Я рекомендую переключиться с THREE.Sprite
на THREE.Points
. Это материал THREE.PointsMaterial
имеет свойство размера , которое измеряется в пикселях, если sizeAttenuation
установлено на false
. Просто имейте в виду, что он имеет ограничение максимального размера в зависимости от аппаратного обеспечения устройства, определенного gl.ALIASED_POINT_SIZE_RANGE.
Мой первоначальный ответ продолжается ниже :
Однако " 1 px "является субъективным измерением в настоящее время, потому что если вы используете renderer.setPixelRatio(window.devicePixelRatio);
, то вы получите разные размеры спрайтов на разных устройствах. Например, MacBook имеют соотношение пикселей 2 и выше, некоторые сотовые телефоны имеют соотношение пикселей 3, а настольные мониторы обычно имеют коэффициент 1. Этого можно избежать, если не использовать setPixelRatio
, или если вы его используете, вам нужно будет использовать умножение:
const s = 5;
points.size = s * window.devicePixelRatio;
Еще одна вещь, которую нужно иметь в виду, это то, что спрайтов THREE.Points
имеют размеры в пикселях, тогда как сетки имеют размеры в мировых единицах. Поэтому иногда, когда вы уменьшаете окно браузера по вертикали, размер sprite Point
остается прежним, но сетки уменьшаются, чтобы поместиться в окне просмотра. Это означает, что спрайт 5px Point
займет больше места в маленьком окне, чем в большом мониторе. Если это проблема, убедитесь, что вы используете значение window.innerHeight
при расчете sprite Point
size.