Для того, чтобы 3D объект крутился на 180 градусов с анимацией каждый раз при нажатии, вам нужно внести несколько изменений в вашу реализацию с использованием React. Вот шаги, которые вы можете выполнить:
- Установите библиотеку
react-three-fiber
, которая предоставляет React-обертку для библиотеки Three.js, используемой для создания 3D-графики в браузере. Вы можете установить ее с помощью npm или yarn, выполнив командуnpm install react-three-fiber
.
- Создайте компонент
ThreeScene
, который будет отвечать за отображение 3D сцены в вашем приложении. В этом компоненте вы можете создать экземплярTHREE.Scene
, добавить объекты, свет и камеру.
- Внутри
ThreeScene
создайте компонентCube
, который представляет собой 3D-объект, который нам нужно анимировать. ВнутриCube
вы можете создать экземплярTHREE.Mesh
, добавить геометрию и текстуру, а также установить начальное положение объекта.
- В компоненте
Cube
добавьте состояниеisRotated
, которое будет отслеживать, находится ли объект в состоянии вращения или нет. По умолчанию он должен быть установлен какfalse
.
- Добавьте обработчик события нажатия кнопки в методе
handleClick
в компонентеCube
. В этом обработчике вы можете изменить состояниеisRotated
на противоположное значение каждый раз, когда кнопка нажимается.
- Чтобы добавить анимацию вращения к объекту, вы можете использовать
react-spring
- библиотеку, которая предоставляет декларативные API для анимации в React. Установите ее с помощью командыnpm install react-spring
.
- Создайте компонент
RotatingCube
и импортируйте изreact-spring
необходимые хуки -useSpring
,animated
иconfig
. Внутри этого компонента вы можете создать анимацию вращения с помощьюuseSpring
, задав начальное и конечное значение поворотаfrom
иto
, а также задавая промежуточные состоянияconfig
.
- В компоненте
RotatingCube
используйтеanimated.mesh
для обертки своегоCube
и доступа к анимированным свойствам. Здесь вы можете использоватьanimated
версииposition
,rotation
и любых других свойств, к которым вы хотите применить анимацию.
- Наконец, в компоненте
ThreeScene
отрисуйтеRotatingCube
, завернув его вgroup
. Это позволит вам контролировать положение и вращение всей группы объектов.
- Теперь, при каждом нажатии кнопки, ваш
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 с анимацией. Вы можете доработать этот код, добавив свои собственные стили и настройки для достижения требуемого визуального эффекта.