вместе сThree.js
Реализовать панорамный просмотр VR в Интернете больше не сложно (с поддержкой ПК и мобильных телефонов). Далее приступимReact
практиковаться. Автор использует последнюю версиюThree.js - v0.120.1
и объединитьReact
а такжеNext.js
Разработка может быть лучше интегрирована с производственными проектами.
Онлайн-рендерингМожно использовать как ПК, так и мобильный телефон, или мобильный телефон может сканировать QR-код под кодом.
Хотя в сети есть
Web VR
Однако большинство статей по тем или иным причинам не могут быть запущены напрямую или не могут быть напрямую применены к проекту. Например: некоторыеThree.js
Версия относительно старая, и некоторые из них находятся вHTML
Представлено через CDNThree.js
.
Анализ спроса и демонтаж
-
React
среда разработки -
Three.js
плагин -
VR
просмотр дома
среда разработки
Инициализация проекта
Next.js
использоватьNext.js
Строительный проект строительных лесов:
--example blog-starter-typescript
указать шаблон проекта,полный адрес шаблона
npx create-next-app --example blog-starter-typescript vr-demo
cd vr-demo
УстановитьThree.js
three.js
Пакет старой версии и заброшен, всем нужно его установитьthree
npm i three
Код
Выше мы подготовили среду разработки и установили соответствующие зависимости. Следующим пунктом является осознаниеVR
Панорамные просмотры.
панорамный
Причина создания панорамы в том, что мы прощаемся с традиционной двухмерной плоской формой изображения и используем трехмерный эффект, чтобы поместить в нее наблюдателя для достижения подобного эффекта.
- Преимущества: Захватывающий, более реалистичный и лучший.
- Недостатки: Подготовка материалов и разработка сложны.
подготовка материала
3D-эффект на самом деле трехмерный эффект, квадратное тело имеет 6 граней, предположим, мы углубляем комнату глубоко, помещаем 6 граней комнаты с фотографиями, так что мы находимся в комнате, это фактически прикреплено к каждой фотографии стены.
Поэтому выбираем куб, а затем наклеиваем фотографии соответствующие 6 граням комнаты на 6 граней куба, а потом представляем, что мы в кубе.В это время, когда мы в кубе поворачиваемся, или посмотрите вверх или поклонитесь, мы увидим эффект панорамы.
Далее реализуем это в коде:
Three.js
Основные знания указывают на то, что нужно знать
использоватьThree.js
создавать3d
Мир, который мы можем понять как съемку спектакля, требует сцены-сцены (scene
),камера(camera
), режиссер-рендерер (renderer
), Сетка задач (mesh
) и источник света -(light
).
- Сцены
scene
: Это можно понимать как сцену.Все нужно поставить на сцену перед съемкой. - камера(
camera
): Эквивалент камеры или человеческого глаза, он может записывать все. - Рендерер(
renderer
): Эквивалентно директору или контроллеру, все команды должны контролироваться им. - сетка(
mesh
): В компьютере 3D-мир состоит из точек, а бесчисленные лица склеены в объекты различной формы. Эта модель называется моделью сетки. Линия состоит из двух точек, поверхность состоит из трех точек, а объект состоит из нескольких поверхностей, состоящих из трех точек. - источник света(
light
): Вы ничего не увидите без света, и вы можете увидеть эффект, добавив источник света.
Coding
- Создать сцену -
Scene
import * as THREE from 'three';
scene = new THREE.Scene();
- Создать камеру -
Camera
Камера эквивалентна человеческому глазу, только с камерой можно увидеть все объекты и источники света в сцене. Обычно используемые камеры - это ортогональные камеры и перспективные камеры.
-
Орфографическая камера представляет собой прямоугольную область просмотра, и объекты видны только в пределах этой области.Объекты визуализируются в одном размере независимо от того, насколько далеко или близко находится камера. Общий сценарий применения — 2.5d игры, такие как прыжки, механические модели
-
Перспективные камеры являются наиболее часто используемыми типами камер, имитирующих зрение человеческого глаза, вблизи большого и дальнего малого (перспектива). Fov представляет собой угол зрения.Чем больше Fov, тем шире глаза, чем дальше они находятся и тем больше они могут видеть. Если вам нужно имитировать реальность, в основном используйте эту камеру
// 创建相机
const w = window.innerWidth
const h = window.innerHeight
camera = new THREE.PerspectiveCamera(75, w / h, 0.1, 1000); // 透视相机
camera.position.set(0, -0, 0); // 设置相机位置
camera.lookPoint = {}; // 观察点
camera.lookPoint.x = 0;
camera.lookPoint.y = 0;
camera.lookPoint.z = -1;
camera.lookAt(camera.lookPoint.x, camera.lookPoint.y, camera.lookPoint.z);
- Создать визуализатор -
Renderer
// 创造渲染器
renderer = new THREE.WebGLRenderer();
renderer.setSize(w, h);
app.appendChild(renderer.domElement);
- Создать сетку -
Mesh
Сетка (mesh) по геометрии (geometry
) и материальный (material
) составляют
const baseUrl = '/static/images/vr/';
// 立方纹理
const textureLoader = new THREE.CubeTextureLoader().setPath(baseUrl);
const arr = ['f.jpg', 'b.jpg', 'u.jpg', 'd.jpg', 'l.jpg', 'r.jpg']; // 6张纹理图依次贴在立方体的前、后、上、下、左、右的顺序放置的
const texture = textureLoader.load(arr); // 新版API
// 几何体
const geometry = new THREE.BoxGeometry(50, 50, 50);
// 材质
const material = new THREE.MeshPhongMaterial({
envMap: texture,
side: THREE.DoubleSide,
});
// 创建网格
const cube = new THREE.Mesh(geometry, material);
cube.position.set(-0, -0, -0);
scene.add(cube); // 加入场景
- Создайте источник света
//环境光
const ambient = new THREE.AmbientLight(0xffffff);
scene.add(ambient);
- Расчет положения и ориентации камеры
const update = () => {
lat = Math.max(-85, Math.min(85, lat));
phi = THREE.Math.degToRad(90 - lat);
theta = THREE.Math.degToRad(lon);
target.x = 500 * Math.sin(phi) * Math.cos(theta);
target.y = 500 * Math.cos(phi);
target.z = 500 * Math.sin(phi) * Math.sin(theta);
camera.lookAt(target);
renderer.render(scene, camera);
};
- функция рендеринга анимации
использоватьrequestAnimationFrame
Реализовать эффект анимации, преимущества:
- можно включить
GPU
Ускорение рендеринга - Рендеринг без задержек
const animate = () => {
renderer.render(scene, camera);
requestAnimationFrame(animate);
update();
};
- Обработка взаимодействия с мышью или пальцем
const handleTouchStart = (e) => {
e.preventDefault();
interactiveFlag = true;
startX = e.touches[0].pageX;
startY = e.touches[0].pageY;
startLon = lon;
startLat = lat;
};
const handleTouchMove = (e) => {
e.preventDefault();
lon = (startX - e.touches[0].pageX) * 0.2 + startLon;
lat = (e.touches[0].pageY - startY) * 0.2 + startLat;
update();
};
const handleTouchEnd = (e) => {
e.preventDefault();
interactiveFlag = false;
};
Суммировать
На самом деле, с точки зрения количества кода, вreact
китайское использованиеThree.js
выполнитьWeb VR
Панорамный просмотр не сложен, главное иметь определенное трехмерное мышление.
болееThree.jsа такжеNext.jsДля использования, пожалуйста, обратитесь к официальной документации веб-сайта,
Исходный код проекта
Полный код проекта опубликован на github для отладки и запуска всеми желающими: