Three.js предоставляет два основных типа тумана для сцен: Fog и FogExp2. Оба позволяют создавать эффект атмосферной перспективы, когда дальние объекты становятся менее различимыми и окрашиваются в цвет тумана. Это повышает реализм 3D-сцен, особенно при больших пространствах или открытых ландшафтах.
Fog создаёт линейное изменение плотности тумана в зависимости от расстояния от камеры.
const scene = new THREE.Scene();
scene.fog = new THREE.Fog(0xcccccc, 10, 50);
Параметры конструктора:
color — цвет тумана в шестнадцатеричном формате.near — расстояние от камеры, с которого начинается
эффект тумана.far — расстояние, на котором туман становится полностью
непрозрачным.Особенности Fog:
Пример визуализации: объекты, находящиеся ближе к near,
практически не затуманены; объекты у far полностью окрашены
цветом тумана. Между этими границами создаётся плавный переход.
FogExp2 создаёт экспоненциальное увеличение плотности тумана, что делает дальние объекты более мягко растворяющимися в воздухе.
const scene = new THREE.Scene();
scene.fog = new THREE.FogExp2(0xcccccc, 0.02);
Параметры конструктора:
color — цвет тумана.density — коэффициент плотности. Чем выше значение, тем
быстрее объекты исчезают в тумане.Особенности FogExp2:
Формула изменения плотности: [ f(d) = 1 - e^{- d^2}] где
d — расстояние до объекта. Этот подход позволяет создать
ощущение глубины и пространства без резких границ.
| Характеристика | Fog (линейный) | FogExp2 (экспоненциальный) |
|---|---|---|
| Распределение | Линейное | Экспоненциальное |
| Настройка дальности | near и far |
density |
| Визуальный эффект | Чёткий переход | Мягкое постепенное исчезновение |
| Подходит для | Малых и средних сцен | Больших открытых пространств |
MeshStandardMaterial, MeshLambertMaterial,
MeshPhongMaterial) автоматически реагируют на туман.scene.background = new THREE.Color(0xcccccc);
Туман особенно заметен при движении камеры. Можно динамически изменять параметры тумана:
function animate() {
requestAnimationFrame(animate);
// Динамическое изменение плотности FogExp2
scene.fog.density = 0.01 + 0.01 * Math.sin(Date.now() * 0.001);
renderer.render(scene, camera);
}
Такой подход позволяет создавать эффекты, имитирующие утренний туман или туман в движении.
Хотите, я могу подготовить полный пример сцены с обоими типами тумана, где наглядно видно разницу между ними?