Для того, чтобы 3D объект крутился на 180 градусов с анимацией каждый раз при нажатии, вам нужно внести несколько изменений в вашу реализацию с использованием React. Вот шаги, которые вы можете выполнить:
1. Установите библиотеку react-three-fiber
, которая предоставляет React-обертку для библиотеки Three.js, используемой для создания 3D-графики в браузере. Вы можете установить ее с помощью npm или yarn, выполнив команду npm install react-three-fiber
.
2. Создайте компонент ThreeScene
, который будет отвечать за отображение 3D сцены в вашем приложении. В этом компоненте вы можете создать экземпляр THREE.Scene
, добавить объекты, свет и камеру.
3. Внутри ThreeScene
создайте компонент Cube
, который представляет собой 3D-объект, который нам нужно анимировать. Внутри Cube
вы можете создать экземпляр THREE.Mesh
, добавить геометрию и текстуру, а также установить начальное положение объекта.
4. В компоненте Cube
добавьте состояние isRotated
, которое будет отслеживать, находится ли объект в состоянии вращения или нет. По умолчанию он должен быть установлен как false
.
5. Добавьте обработчик события нажатия кнопки в методе handleClick
в компоненте Cube
. В этом обработчике вы можете изменить состояние isRotated
на противоположное значение каждый раз, когда кнопка нажимается.
6. Чтобы добавить анимацию вращения к объекту, вы можете использовать react-spring
- библиотеку, которая предоставляет декларативные API для анимации в React. Установите ее с помощью команды npm install react-spring
.
7. Создайте компонент RotatingCube
и импортируйте из react-spring
необходимые хуки - useSpring
, animated
и config
. Внутри этого компонента вы можете создать анимацию вращения с помощью useSpring
, задав начальное и конечное значение поворота from
и to
, а также задавая промежуточные состояния config
.
8. В компоненте RotatingCube
используйте animated.mesh
для обертки своего Cube
и доступа к анимированным свойствам. Здесь вы можете использовать animated
версии position
, rotation
и любых других свойств, к которым вы хотите применить анимацию.
9. Наконец, в компоненте ThreeScene
отрисуйте RotatingCube
, завернув его в group
. Это позволит вам контролировать положение и вращение всей группы объектов.
10. Теперь, при каждом нажатии кнопки, ваш Cube
будет вращаться на 180 градусов с анимацией, созданной с помощью react-spring
.
Вот пример кода, демонстрирующий реализацию описанных шагов:
import React, { useState } from 'react'; import { Canvas } from 'react-three-fiber'; import { animated, useSpring, config } from 'react-spring'; const ThreeScene = () => { return ( <Canvas> <RotatingCube /> </Canvas> ); }; const Cube = () => { const [isRotated, setIsRotated] = useState(false); const handleClick = () => { setIsRotated(!isRotated); }; return ( <mesh onClick={handleClick}> <boxGeometry args={[1, 1, 1]} /> <meshStandardMaterial color="red" /> <animated.mesh rotation-x={isRotated ? Math.PI : 0}> <boxGeometry args={[1, 1, 1]} /> <meshStandardMaterial color="red" /> </animated.mesh> </mesh> ); }; const RotatingCube = () => { const { rotation } = useSpring({ from: { rotation: [0, 0, 0] }, to: { rotation: [Math.PI, 0, 0] }, config: config.default, }); return ( <group rotation={rotation}> <Cube /> </group> ); }; export default ThreeScene;
В этом примере при каждом нажатии на Cube
он будет вращаться на 180 градусов вокруг оси X с анимацией. Вы можете доработать этот код, добавив свои собственные стили и настройки для достижения требуемого визуального эффекта.