Морф-анимация позволяет плавно трансформировать одну геометрию в
другую, создавая эффект «живого» изменения формы объекта. В
Three.js для этого используется свойство
morphTargetInfluences объекта Mesh, которое
управляет степенью влияния каждого морф-таргета на исходную
геометрию.
Для морф-анимации необходима геометрия с заранее подготовленными морф-таргетами. Морф-таргеты — это альтернативные версии вершин исходного объекта. Каждая вершина морф-таргета соответствует вершине исходной геометрии, но с изменённой позицией, нормалью или цветом.
const geometry = new THREE.BoxGeometry(1, 1, 1);
// Добавление морф-таргета
geometry.morphAttributes.position = [];
const morphTarget = new Float32Array(geometry.attributes.position.count * 3);
for (let i = 0; i < geometry.attributes.position.count; i++) {
morphTarget[i*3] = geometry.attributes.position.getX(i) + Math.random() * 0.2;
morphTarget[i*3+1] = geometry.attributes.position.getY(i) + Math.random() * 0.2;
morphTarget[i*3+2] = geometry.attributes.position.getZ(i) + Math.random() * 0.2;
}
geometry.morphAttributes.position.push(new THREE.BufferAttribute(morphTarget, 3));
morphTargetInfluencesКаждый Mesh с морф-таргетами имеет массив
morphTargetInfluences. Его длина соответствует количеству
морф-таргетов, а значения варьируются от 0 до 1:
0 — морф-таргет не влияет на геометрию.1 — морф-таргет полностью применён.Пример управления морф-таргетом:
const mesh = new THREE.Mesh(geometry, material);
mesh.morphTargetInfluences[0] = 0.5; // Половинное влияние первого морф-таргета
Для плавного изменения формы используют цикл рендеринга
(requestAnimationFrame) и интерполяцию значений
морф-таргета. Часто применяют синусоидальные или линейные функции для
циклических эффектов:
let time = 0;
function animate() {
requestAnimationFrame(animate);
time += 0.01;
mesh.morphTargetInfluences[0] = (Math.sin(time) + 1) / 2; // Влияние от 0 до 1
renderer.render(scene, camera);
}
animate();
В одной геометрии может быть несколько морф-таргетов. Их влияния складываются, что позволяет создавать сложные формы и комбинации движений:
mesh.morphTargetInfluences[0] = 0.3;
mesh.morphTargetInfluences[1] = 0.7;
Важно следить за суммой влияний, так как слишком высокие значения могут привести к искажениям.
Не все материалы Three.js поддерживают морф-анимацию. Основные, которые работают с морф-таргетами:
MeshStandardMaterialMeshPhongMaterialMeshLambertMaterialДля включения поддержки необходимо установить флаг
morphTargets в материал:
const material = new THREE.MeshStandardMaterial({
color: 0x00ff00,
morphTargets: true
});
AnimationMixer:
морф-анимацию можно интегрировать с системой анимаций Three.js,
используя THREE.NumberKeyframeTrack и ключевые кадры для
автоматического управления morphTargetInfluences.MeshStandardMaterial.Морф-анимация через morphTargetInfluences — мощный
инструмент Three.js, позволяющий создавать плавные трансформации формы
объектов, обеспечивая богатые визуальные эффекты и динамику сцены.