Geometría de buffer circular longitud theta animada con GSAP y react-three-fiber.
Me gustaría animar mi ringBufferGeometry como en el ejemplo a continuación, pero me gustaría usar GSAP para animar esta ringBufferGeometry durante cierta cantidad de tiempo y luego detenerla cuando thetaLength sea igual a algún valor. Algo como en el ejemplo a continuación pero sin el uso de Math.sin().
https://stackoverflow.com/questions/44751130/three-js-ringbuffergeometry-update-thetalength
Esto es lo que quiero lograr (link a continuación), pero quiero detener la animación cuando llegue a la forma de triángulo completa.
https://jsfiddle.net/02oyunbj/1/
Mi código
importar React desde ‘react’
import ReactDOM from ‘react-dom’
import App from ‘./App’
function Container(props) {
return
}
ReactDOM.render(
document.getElementById(‘root’)
)
“ `
“ `
importar {useRef, useEffect} desde ‘react’
importar {Lienzo} de ‘@react-three/fiber’
importar {OrbitControls} de ‘@react-three/drei’
importar * como THREE desde ‘three’
import gsap desde ‘gsap’
export default function App() {
volver (
<trianglering></trianglering>
</lienzo>
)
}
const TriangleRing = () => {
const triangleRingRef = useRef()
const parametersObj = {
innerRadius: 4,
outerRadius: 8,
thetaSegments: 1,
phiSegments: 30,
thetaStart: 1.55,
thetaLength: 0,
}
const parameters = [
parametersObj.innerRadius,
parametersObj.outerRadius,
parametersObj.thetaSegments,
parametersObj.phiSegments,
parametersObj.thetaStart,
parametersObj.thetaLength,
]
useEffect(() => {
console.log(triangleRingRef.current)
const triangleGeometry = triangleRingRef.current.geometry
gsap.set(triangleGeometry, {
parameters: {...parametersObj, thetaLength: 0},
})
const tl = gsap.timeline({defaults: {ease: 'power3.inOut'}})
tl.to(triangleGeometry, {
parameters: {...parametersObj, thetaLength: 6.3},
duration: 4,
})
})
volver (
)
}
“ `
Enlace a sandbox:
davy.ai
Para lograr esto, puedes modificar la función
tl.to()
para que tenga un callback que detenga la animación una vez quethetaLength
sea igual al valor deseado. Aquí tienes un ejemplo de código que logra esto:En el callback
onComplete
degsap.timeline()
, puedes verificar sithetaLength
es igual al valor deseado, y si lo es, puedes pausar el timeline para detener la animación.Ten en cuenta que como el valor
thetaLength
se actualiza dentro del objetoparametersObj
, debes verificar el valor deparametersObj.thetaLength
dentro del callback.