В Three.js объект CubeCamera используется для создания динамических отражений, генерируя кубическую карту окружающей сцены, которая затем может применяться к материалам с отражающими свойствами. Это особенно полезно для создания зеркальных поверхностей, металлов и водной глади с реалистичными отражениями.
CubeCamera представляет собой виртуальную камеру,
которая рендерит сцену с точки зрения шести направлений: +X, -X, +Y, -Y,
+Z, -Z. Результатом является текстура типа
WebGLCubeRenderTarget, которая содержит все шесть
изображений и может использоваться как environment map
для материалов.
Порядок действий следующий:
.update(renderer, scene) для рендера сцены
во все шесть направлений.// Создание кубической камеры
const cubeRenderTarget = new THREE.WebGLCubeRenderTarget(256, {
format: THREE.RGBAFormat,
generateMipmaps: true,
minFilter: THREE.LinearMipmapLinearFilter,
encoding: THREE.sRGBEncoding
});
const cubeCamera = new THREE.CubeCamera(0.1, 1000, cubeRenderTarget);
scene.add(cubeCamera);
THREE.RGBAFormat).sRGBEncoding обеспечивает корректные цвета для
PBR-материалов).Для применения отражений к материалу используется
material.envMap:
const reflectiveMaterial = new THREE.MeshStandardMaterial({
metalness: 1,
roughness: 0,
envMap: cubeRenderTarget.texture
});
const reflectiveSphere = new THREE.Mesh(
new THREE.SphereGeometry(1, 32, 32),
reflectiveMaterial
);
scene.add(reflectiveSphere);
Чтобы отражения реагировали на изменения сцены, необходимо обновлять CubeCamera каждый кадр или в моменты изменения сцены:
function animate() {
requestAnimationFrame(animate);
// Скрываем объект, чтобы он не появился в собственном отражении
reflectiveSphere.visible = false;
// Обновление кубической карты
cubeCamera.update(renderer, scene);
// Отображаем объект снова
reflectiveSphere.visible = true;
renderer.render(scene, mainCamera);
}
animate();
Ключевой момент: объект, для которого создаются отражения, должен быть временно скрыт во время рендеринга CubeCamera, чтобы избежать самоотражения.
WebGLCubeRenderTarget) — влияет на четкость
отражений. Для динамичных объектов обычно достаточно 256–512, для
статичных сцен можно использовать 1024 и выше.LinearMipmapLinearFilter улучшает качество при
отдалении.CubeCamera часто применяется для имитации зеркальной поверхности воды. В сочетании с шейдерами и нормалями воды можно получить эффект отражений окружающей сцены, движущейся воды и динамичных бликов.
Пример использования в сочетании с MeshStandardMaterial
для плоской поверхности воды:
const waterMaterial = new THREE.MeshStandardMaterial({
color: 0x001e0f,
metalness: 0.6,
roughness: 0.1,
envMap: cubeRenderTarget.texture
});
const waterPlane = new THREE.Mesh(
new THREE.PlaneGeometry(10, 10),
waterMaterial
);
waterPlane.rotation.x = - Math.PI / 2;
scene.add(waterPlane);
Производительность: рендеринг сцены шесть раз на каждый кадр может быть тяжелым. Для оптимизации:
Самоотражение: необходимо скрывать объект при рендере CubeCamera.
Поддержка PBR: CubeCamera отлично работает с
PBR-материалами (MeshStandardMaterial,
MeshPhysicalMaterial), позволяя использовать динамическое
освещение.
.update(renderer, scene) для генерации
кубической карты.envMap объекту.CubeCamera предоставляет мощный инструмент для реализации реалистичных отражений и динамических environment maps. Правильная организация рендеринга, использование оптимальных размеров текстуры и фильтров позволяет сочетать визуальное качество с производительностью. Эта техника является основой для создания металлических поверхностей, зеркал и водных эффектов в 3D-сценах на базе Three.js.