can someone please let me how to animate the camera on scroll in react-three-fibre?
I searched for an example project and found this one
At the moment I am not sure if I understand the way we need make the camera move on page scroll. I think that as soon there is a scroll happening then we need to change the x,y,z achses in order to make the camera move, but how can I set the position for the camera when someone scrolls for example 50vh?
the sandbox you linked is more specific, that’s a camera keyframe animation that was made in blender, and it’s linked to scroll offset. scroll controls would make that box easier as well as it takes care of all the nasty css hacks that are needed in order for both canvas and the dom to receive events.
I already studied the react-three-drei scrollcontrolls component, but I got confused by the function Foo in the example:
function Foo(props) {
const ref = useRef()
const data = useScroll()
useFrame(() => {
// data.offset = current scroll position, between 0 and 1, dampened
// data.delta = current delta, between 0 and 1, dampened
// Will be 0 when the scrollbar is at the starting position,
// then increase to 1 until 1 / 3 of the scroll distance is reached
const a = data.range(0, 1 / 3)
// Will start increasing when 1 / 3 of the scroll distance is reached,
// and reach 1 when it reaches 2 / 3rds.
const b = data.range(1 / 3, 1 / 3)
// Same as above but with a margin of 0.1 on both ends
const c = data.range(1 / 3, 1 / 3, 0.1)
// Will move between 0-1-0 for the selected range
const d = data.curve(1 / 3, 1 / 3)
// Same as above, but with a margin of 0.1 on both ends
const d = data.curve(1 / 3, 1 / 3, 0.1)
// Returns true if the offset is in range and false if it isn't
const e = data.visible(2 / 3, 1 / 3)
// The visible function can also receive a margin
const f = data.visible(2 / 3, 1 / 3, 0.1)
})
return <mesh ref={ref} {...props} />
What do I need to specify in the function Foo and what props I need to pass into function Foo?
that’s just a component named foo. you can name your component however you like it shows a couple of raw usecases. start with the examples, it’ll become much clearer.
for instance
const scroll = useScroll()
useFrame((state, delta) => {
// scroll.offset will be between 0 (start) and 1 (end)
with the range functions you can get 0 and 1 between ranges, say 0 starts at 1/4 and 1 at 3/4. but you might not need that at all, so just use the offset.