Сетчатая анимация Three.js: добавление движения к 3D-объектам
Описание
Three.js позволяет новичкам легко создавать увлекательную 3D-графику и анимацию в Интернете. С помощью анимации сетки вы можете оживить свои 3D-объекты, добавив движение и изменив их внешний вид. Такие методы, как анимация по ключевым кадрам и цели преобразования, обеспечивают плавные переходы и интерактивный опыт. Three.js предоставляет удобный для начинающих API, учебные пособия и документацию, которые помогут вам. Исследуйте захватывающий мир анимации сетки с помощью Three.js и сделайте свои веб-проекты визуально ошеломляющими и интерактивными. Будьте готовы раскрыть свой творческий потенциал и вывести свои проекты на новый уровень с анимацией сетки Three.js.
1. Название
2. Описание
3. Фрагмент
4. Объяснение
5. Полный код
6. Вывод
7. Резюме
8. Следующий и предыдущий блог
3. Фрагмент
/*-------------box geometry-------------*/ const demoMeshGeometry = new THREE.BoxGeometry(10, 10, 10); const demoMeshMaterial = new THREE.MeshBasicMaterial({ color: '#ff0', }); demoMesh = new THREE.Mesh(demoMeshGeometry, demoMeshMaterial); demoMesh.position.set(0, 5, 0) scene.add(demoMesh)
4. Объяснение
Фрагмент кода создает коробчатую сетку с помощью Three.js. Вот упрощенное объяснение:
- `demoMeshGeometry` определяет геометрию меша, определяя его размер как 10 единиц ширины, высоты и глубины.
- `demoMeshMaterial` определяет материал, используемый для меша, устанавливая его цвет на желтый (`'# ff0'`).
— «demoMesh» — это фактический объект сетки, созданный путем объединения геометрии и материала.
— Позиция сетки устанавливается на «(0, 5, 0)», что означает он будет размещен в центре сцены, на высоте 5 единиц над землей.
- Наконец, сетка добавлена к сцене, что делает ее видимой в 3D-окружении.
Таким образом, этот код создает простую сетку желтого прямоугольника размером 10 единиц и размещает ее в центре сцены, немного над землей.
let time = Date.now() function animate() { const currentTime = Date.now() const deltaTime = currentTime - time time = currentTime demoMesh.rotation.y += 0.001 * deltaTime demoMesh.rotation.x += 0.001 * deltaTime requestAnimationFrame(animate) renderer.render(scene, camera); }In the given code snippet, we have the following lines:
Фрагмент кода устанавливает цикл анимации с использованием Three.js. Вот упрощенное объяснение:
- Переменная `time` инициализируется текущей отметкой времени с помощью `Date.now()`. Он будет использоваться для расчета разницы во времени между кадрами анимации.
— Определена функция `animate`, которая будет вызываться рекурсивно для обновления и рендеринга сцены.
– Внутри функции `animate` текущая метка времени сохраняется в переменной `currentTime`, и вычисляется разница во времени (`deltaTime`) между текущим и предыдущим кадрами.
- Поворот объекта `demoMesh` обновляется путем увеличения `y` и `x` углы поворота с небольшим значением, умноженным на `deltaTime`. Это создает эффект плавного вращения с течением времени.
– Функция requestAnimationFrame вызывается, чтобы запросить у браузера повторный вызов `animate` для следующего кадра, создавая цикл анимации.
– Наконец, средство визуализации используется для рендеринга обновленной сцены с точки зрения камеры.
Таким образом, этот код устанавливает непрерывный цикл анимации, который постепенно вращает объект demoMesh по осям y и x. Скорость вращения определяется временем, прошедшим между кадрами, что приводит к плавной и динамичной анимации.
5. Полный код
<!DOCTYPE html> <html lang="en"> <head> <title>three.js - Boilerplate</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> <link type="text/css" rel="stylesheet" href="/cdn/editor/css/main.css"> <style> body { background-color: grey } html, body { margin: 0; height: 100%; } #c { width: 100%; height: 100%; display: block; color: rgb(40, 63, 141); } </style> </head> <body> <canvas id="c"></canvas> <script type="importmap"> { "imports": { "three": "./threeJS/build/three.module.js" } } </script> <script type="module"> import * as THREE from 'three'; import { OrbitControls } from './threeJS/examples/jsm/controls/OrbitControls.js'; import * as DAT from './threeJS/newadded/DatGUI.js'; var canvas, renderer, scene, camera, controls, demoMesh; // var gui = new DAT.GUI(); function init() { canvas = document.querySelector('#c'); renderer = new THREE.WebGLRenderer({ canvas }); renderer.setSize(window.innerWidth, window.innerHeight); scene = new THREE.Scene(); scene.background = new THREE.Color('black'); const cubeTextureLoader = new THREE.CubeTextureLoader() scene.background = new THREE.Color('green'); const ambientLight = new THREE.AmbientLight(0xffffff, 0.7) scene.add(ambientLight) const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5); scene.add(directionalLight); camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1000); camera.position.y = 10; camera.position.z = 25; controls = new OrbitControls(camera, renderer.domElement); controls.enableDamping = true; controls.dampingFactor = 0.6; controls.screenSpacePanning = false; controls.update(); /*-----------------texture-------------------*/ var map = new THREE.TextureLoader().load('./static/image/land.jpg'); const floorGeometry = new THREE.PlaneGeometry(50, 50, 128, 128); const floorMaterial = new THREE.MeshStandardMaterial({ color: '#777777', metalness: 0.2, roughness: 0.6, envMapIntensity: 0.5, side: THREE.DoubleSide, map: map }); const floor = new THREE.Mesh(floorGeometry, floorMaterial) floor.receiveShadow = true; floor.rotation.x = - Math.PI * 0.5; floor.position.set(0, 0, 0); scene.add(floor); /*-------------box geometry-------------*/ const demoMeshGeometry = new THREE.BoxGeometry(10, 10, 10); const demoMeshMaterial = new THREE.MeshBasicMaterial({ color: '#ff0', }); demoMesh = new THREE.Mesh(demoMeshGeometry, demoMeshMaterial); demoMesh.position.set(0, 5, 0) scene.add(demoMesh) } let time = Date.now() function animate() { const currentTime = Date.now() const deltaTime = currentTime - time time = currentTime demoMesh.rotation.y += 0.001 * deltaTime demoMesh.rotation.x += 0.001 * deltaTime requestAnimationFrame(animate) renderer.render(scene, camera); } init() animate(); </script> </body> </html>
6. Вывод
7. Резюме
что мы узнали из этого блога
В сегодняшнем блоге мы узнали об анимации сетки Three.js. Мы рассмотрели, как создать базовую сцену с вращающейся сеткой, используя BoxGeometry и MeshBasicMaterial. Мы также реализовали простой цикл анимации с помощью requestAnimationFrame и рассчитали разницу во времени между кадрами для достижения плавной анимации. Регулируя углы поворота сетки с течением времени, мы создали привлекательный и динамичный эффект анимации. Этот блог послужил введением в анимацию сетки в Three.js, предоставив новичкам основу для экспериментов и создания собственных интерактивных 3D-анимаций.
8. Следующий и предыдущий блог
предыдущий блог : Создание потрясающих 3D-визуализаций с помощью Three.js: руководство для начинающих
следующий блог : Пример текстуры THREEJS