Three.js: Похоже, что затухание размера материала не учитывает FOV

Созданный на 7 сент. 2017  ·  3Комментарии  ·  Источник: mrdoob/three.js

Я использую 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 ();
Версия Three.js
  • [] Dev
  • [] r87
  • [Икс] ...
Браузер
  • [ ] Все они
  • [x] Chrome
  • [x] Firefox
  • [] Internet Explorer
Операционные системы
  • [ ] Все они
  • [x] Windows
  • [] macOS
  • [] Linux
  • [] Android
  • [] iOS
Требования к оборудованию (видеокарта, устройство VR, ...)

Не знаю, зависит ли это от оборудования, но это кажется маловероятным. Я использую GeForce GTX950 в Windows 10.

Question

Все 3 Комментарий

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 );
Была ли эта страница полезной?
0 / 5 - 0 рейтинги