Фоновое изображение обычной карты для веб-сайта с фиксированным источником света

Я хотел бы иметь возможность использовать карты нормалей в фоновых изображениях моего сайта. Этот пример CodePen кажется лучшим из всех реализаций, которые я видел до сих пор. Для достижения эффекта он использует Three.js. Я новичок в Three.js, поэтому, пожалуйста, простите мне недостаток знаний и большие амбиции.

Все еще желательные функции:

① Хотелось бы, чтобы источник света был неподвижным, а не следовал за курсором.

Первая причина в том, что мышь неактуальна для мобильных устройств. Вторая причина заключается в том, что эффекты, следующие за курсором, обычно больше отвлекают, чем улучшают. Вместо этого лучшим подходом кажется размещение источника света в фиксированном положении (например, в центре страницы) и взаимодействие света с фоном при его прокрутке.

② Хотелось бы иметь возможность размещать фоновое изображение внутри меньшего div, чтобы включать случаи, когда ему не нужно покрывать всю страницу.

Наверное, это не так уж и сложно. В настоящее время он назначен либо элементу body, либо всему window(?). Продолжаем изучать код...

③ Хотелось бы иметь возможность определять несколько фоновых изображений с включенной картой нормалей, освещенных общим освещением (для непрерывности сцены).

Если положение света всегда относительно окна width и height %, возможно, это не так уж и сложно.

④ Хотелось бы иметь возможность указать, чтобы текстуры изображения были мозаичными.

Обычно это делается с помощью свойства CSS background-repeat. В Three.js может быть по-другому. Глядя на это...


Note: Points 5 and 6 that follow are not essential, but I'll mention them anyway in case anyone knows how to implement them.

⑤ Возможность освещать «сцену» (то есть любые/все фоновые изображения на странице с включенной картой нормалей) с помощью изображения вместо точечных источников света. Другими словами, освещение на основе изображения HDR. Изображения должны быть с низким разрешением, чтобы не раздувать страницу, но они все равно могут выглядеть значительно лучше, чем точечное освещение. Похоже, что Three.js поддерживает IBL, но я все еще исследую.

⑥ Незначительный наклон положения фонового изображения (или положения источника света) в ответ на движения, обнаруженные акселерометром мобильного устройства, было бы здорово, но, вероятно, сложно реализовать, поскольку данные акселерометра больше недоступны по умолчанию на iOS. Так что этого, вероятно, никогда не произойдет, но... упомяну об этом для полноты картины. В качестве альтернативы, возможно, параллаксное движение, реагирующее на прокрутку, могло бы обеспечить аналогичное улучшение.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

…поэтому, пожалуйста, простите мне мой недостаток знаний и высокие амбиции.

Во-первых, обратите внимание на дату создания этого CodePen, он был создан в версии R71. С тех пор многое изменилось. Во-вторых, судя по вашим словам, вы начинаете с Three.js, я не уверен, что начинать с пользовательского света, реализованного в специальном шейдере, — лучший способ начать свое путешествие с WebGL... 😉

Ваши требования могут быть созданы разными способами, более простыми и сложными. Представленный вами CodePen — один из (гораздо) более сложных.

Введите «несколько» в примерах, и вы получите серию результатов, показывающих, как можно достичь того, чего вы ожидаете.

https://threejs.org/examples/?q=multiple#webgl_multiple_elements

Но вернемся к вашим пунктам...

① Хотелось бы, чтобы источник света был стационарным, а не следуя за курсором.

Здесь нет какой-то особой методики, просто отключите прослушивание движения мыши и расположите выбранный источник света статически.

② Хотелось бы иметь возможность размещать фоновое изображение внутри меньший div, чтобы включить случаи, когда ему не нужно покрывать весь страница.

Измените размер холста по своему усмотрению, поместите его в другой div по своему усмотрению. Если вы хотите, чтобы размеры реагировали динамически (что желательно в большинстве случаев), создайте прослушиватель изменения размера экрана. Посмотрите пример ниже, как вставить текстуру…

③ Хотелось бы иметь возможность включать несколько карт нормалей. фоновые изображения, освещенные общим освещением (для непрерывности сцены).

Вы можете установить свет как общий или индивидуализировать его для конкретного холста. В примере, которым вы поделились.

④ Хотелось бы иметь возможность указать, чтобы текстуры изображения были мозаичными.

В примере у вас есть 4 плитки. Конечно, вы можете разделить область просмотра как хотите, но стоит потратить немного больше времени, чтобы поближе взглянуть на производительность. Пожалуй, самое адекватное решение – это рендерные ножницы. https://threejs.org/docs/#api/en/renderers/WebGLRenderer.setScissor

Как правило, если вас волнует множественность, вы можете иметь, например, один холст и несколько сцен на нем, или вы можете иметь отдельный холст для каждой сцены. Все будет сводиться к индивидуальному проекту и адаптации соотношения эффективности и ожидаемого эффекта.

⑤ …Другими словами, освещение на основе изображения HDR…

Посмотрите здесь…

⑥ Незначительный наклон положения фонового изображения (или источника света). положение) в ответ на движения, обнаруженные мобильным устройством акселерометр было бы круто...

О датчиках и параллаксе смотрите здесь и здесь.

Пример

body { margin: 0; overflow: hidden; }
.background-div { position: absolute; width: 50vw; height: 50vh; }
#background1 { top: 0; left: 0; }
#background2 { top: 0; left: 50vw; }
#background3 { top: 50vh; left: 0; }
#background4 { top: 50vh; left: 50vw; }
<div class = "background-div" id = "background1"></div>
<div class = "background-div" id = "background2"></div>
<div class = "background-div" id = "background3"></div>
<div class = "background-div" id = "background4"></div>

<script type = "importmap">
  {
"imports": {
  "three": "https://unpkg.com/[email protected]/build/three.module.js",
  "three/addons/": "https://unpkg.com/[email protected]/examples/jsm/"
}
  }
</script>

<script type = "module">
import * as THREE from "three";
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

function fourPlanes(container) {
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, container.clientWidth / container.clientHeight, 0.1, 1000);
camera.position.z = 20;

const renderer = new THREE.WebGLRenderer();
renderer.setSize(container.clientWidth, container.clientHeight);
container.appendChild(renderer.domElement);

const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.enabled = true;

const light = new THREE.PointLight(0xFFFF00, 777, 100);
light.position.set(40, 0, 10);
scene.add(light);

function createTexturedPlane(textureURL, normalMapURL, position, scene) {
    const textureLoader = new THREE.TextureLoader();
    const texture = textureLoader.load(textureURL);
    const normalMap = textureLoader.load(normalMapURL);
    texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
    normalMap.wrapS = normalMap.wrapT = THREE.RepeatWrapping;
    texture.repeat.set(4, 4);
    normalMap.repeat.set(4, 4);

const material = new THREE.MeshStandardMaterial({
        map: texture,
        normalMap: normalMap,
    });

    const geometry = new THREE.PlaneGeometry(10, 10);
    const plane = new THREE.Mesh(geometry, material);
    plane.position.copy(position);

    scene.add(plane);
    
}
createTexturedPlane('https://raw.githubusercontent.com/mrdoob/three.js/dev/examples/textures/water.jpg', 'https://raw.githubusercontent.com/mrdoob/three.js/dev/examples/textures/waternormals.jpg', new THREE.Vector3(0, 0, 0), scene);

function animate() {
    requestAnimationFrame(animate);
    controls.update();
    renderer.render(scene, camera);
}
animate();

window.addEventListener('resize', () => {
    camera.aspect = container.clientWidth / container.clientHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(container.clientWidth, container.clientHeight);
});
}

const background1 = document.getElementById('background1');
const background2 = document.getElementById('background2');
const background3 = document.getElementById('background3');
const background4 = document.getElementById('background4');

fourPlanes(background1);
fourPlanes(background2);
fourPlanes(background3);
fourPlanes(background4);

</script>

Спасибо. Я вижу, что этот небольшой проект потребует больше времени для изучения Three.js, чем я изначально ожидал. Но, похоже, в этом есть и отдача. Я ценю, что вы разбили то, что я хочу сделать, на организованные разделы со справочными ссылками. Это похоже на программу обучения, на которой следует сосредоточиться.

Mentalist 17.07.2024 09:15

Другие вопросы по теме