react-globe.gl
react-globe.gl copied to clipboard
GIF/Video as backgroundImageUrl
Is your feature request related to a problem? Please describe.
To achieve twinkling stars, I tried setting up a video as a background and setting Globe's backgroundImageUrl as transparent. But, that doesn't rotate with the Globe. Then, I tried converting the video to a GIF and setting it to backgroundImageUrl. But the GIF doesn't animate in that case.
Describe the solution you'd like
Either provision videos to be used as backgrounds or let GIFs animate if specified as backgroundImageUrl.
@TheAksh you can access the scene directly via the component method .scene() (accessible via a ref), which will allow you to extend the scene with additional objects you'd like to have. For this case, you can add your own background, using a wide sphere representing the sky with a video texture.
const globeEl = useRef();
const video = useRef();
useEffect(() => {
//Get your video element:
video.current.onloadeddata = function () {
video.current.play();
};
//Create your video texture:
const videoTexture = new THREE.VideoTexture(video.current);
videoTexture.needsUpdate = true;
const videoMaterial = new THREE.MeshBasicMaterial({
map: videoTexture,
side: THREE.FrontSide,
toneMapped: false,
});
videoMaterial.needsUpdate = true;
//Create screen
const screen = new THREE.SphereGeometry(500, 32, 16);
const videoScreen = new THREE.Mesh(screen, videoMaterial);
let currentScene = globeEl.current.scene();
currentScene.add(videoScreen);
}, []);
return (
<div className='col-6'>
<video
ref={video} autoPlay loop muted className='position-fixed w-100'>
<source src={backgroundVideo} type='video/mp4' />
</video>
<Globe
ref={globeEl}
// backgroundColor='#0000'
globeImageUrl='//unpkg.com/three-globe/example/img/earth-blue-marble.jpg'
bumpImageUrl='//unpkg.com/three-globe/example/img/earth-topology.png'
// backgroundImageUrl='//unpkg.com/three-globe/example/img/night-sky.png'
pointsData={gData}
pointAltitude='size'
pointColor='color'
/>
</div>
);
I'm actually a little new to Three.js and this is what I've tried. I think I should do side: THREE.BackSide,. I'll spend some more time figuring out why it isn't working, but just wanted to share my approach.