Я использую PerspectiveCamera и модель, включающую несколько точек с использованием PointsMaterial. Я использую настроенную версию OrbitControls.js, чтобы можно было просматривать большие и сложные модели. Одно из изменений заключается в том, что функция масштабирования изменяет FOV камеры вместо того, чтобы приближать ее. Камера перемещается, чтобы показать определенную часть моделей. Я заметил, что затухание PointsMaterial меняет размеры, когда камера приближается к модели, но не при изменении FOV.
Я предполагаю, что алгоритм размера использует расстояние до камеры, но не FOV? Я никогда раньше не размещал сообщения в этом репо, так что извините, если я что-то пропущу. Я попытался протестировать IE, но в данный момент не могу заставить его загрузить страницу. Точно так же не уверен, какая именно версия Three это, но в прошлом году.
Код, создающий PointsMaterial:
var texFlame = new THREE.TextureLoader().load("textures/flame.png");
mtlFlame = new THREE.PointsMaterial ({size: 2, sizeAttenuation: true, color: 0xffffff, transparent: true, blending: THREE.AdditiveBlending, depthWrite: false, map: texFlame});
Код, изменяющий FOV, также неинтересен:
this.camera.fov = fov;
this.camera.updateProjectionMatrix ();
Не знаю, зависит ли это от оборудования, но это кажется маловероятным. Я использую GeForce GTX950 в Windows 10.
PointsMaterial.size
имеет единицы пикселей, а не мировые единицы. Размер придется отрегулировать самостоятельно.
Этот связанный пост может быть информативным: https://github.com/mrdoob/three.js/issues/10385#issuecomment -267789138.
Помните, что gl_PointSize
может быть ограничено, поэтому размер, который вы запрашиваете, может не совпадать с размером, который вы получаете.
@WestLangley. Итак, мне нужно изменить свойство размера PointsMaterial, когда я изменяю FOV?
Я нашел этот пост перед тем, как спросить, но не совсем понимаю, почему он так работает. Я понимаю, что размер указан в пикселях, но затухание уже делает его не связанным с пикселями устройства, и этот процесс, безусловно, должен относиться к перспективе, которая должна иметь отношение к FOV в некотором смысле?
Однако это просто объясняет мое непонимание. Я полностью доволен предложенным вами решением. Спасибо.
Я ожидаю, что PointsMaterial.size
останется в пикселях, поэтому для справки я опубликую здесь этот обходной путь.
Основываясь на этом ответе stackoverflow , вы можете масштабировать свои точки, используя следующий шаблон, который должен работать для разумных значений camera.fov
.
var defaultSize = 10;
points.material.size = defaultSize / Math.tan( ( Math.PI / 180 ) * camera.fov / 2 );