threlte-spline is a simple utility that lets you use your Spline scene with Threlte, via the Spline react-three-fiber code export.
This library is heavily inspired by r3f-spline
While this library is written to be used in Threlte, it can be used in applications that aren't powered by Threlte. That's because this library simply loads, and returns the Spline scene as Three.js objects.
yarn add threlte-spline @splinetool/loader
or
npm install threlte-spline @splinetool/loader
or
pnpm add threlte-spline @splinetool/loader
@types/three is required for Typescript support
Please be aware that this library is simply an extension of @splinetool/loader, and is intended to be used with @threlte/core. Both of these libraries were built with a specific version of three in mind. So please be mindful that your installed version of three may need to be very specific in order for these libraries to work harmoniously together.
A common error that you may encounter if your version of three is not compatible with your version of @splinetool/loader is: Uncaught TypeError: Cannot read property 'x' of undefined
Typically, you can use the latest version of @splinetool/loader that is available at the time of exporting the Spline scene, you can then find roughly the version of three required here. These are scraped from @splinetool/loader package.json files.
<script lang="ts">
import { Canvas, T, OrbitControls } from '@threlte/core';
import { loadSpline } from 'threlte-spline';
let scene;
loadSpline('https://prod.spline.design/HwAUoybfBaBCLzwO/scene.spline').then((_scene) => {
scene = _scene;
});
</script>
{#if scene}
<Canvas>
<T.PerspectiveCamera
makeDefault
position={scene.nodes['Camera 1'].position}
fov={scene.nodes['Camera 1'].fov}
zoom={scene.nodes['Camera 1'].zoom}
>
<OrbitControls />
</T.PerspectiveCamera>
<T.Group>
<T.Mesh
name="Rectangle"
geometry={scene.nodes.Rectangle.geometry}
material={scene.materials['Rectangle Material']}
/>
</T.Group>
</Canvas>
{/if}
Type information should be fairly complete as this package extends @types/three, however there may be certain properties which are missing. Feel free to contribute any missing types if you find any.
In the interim, you can extend the types by doing the following
<script lang="ts">
import { Canvas, T, OrbitControls } from '@threlte/core';
import { loadSpline } from 'threlte-spline';
type MissingProperties = {
prop1: number;
}
let scene: ObjectMap<MissingProperties>;
loadSpline<MissingProperties>('https://prod.spline.design/HwAUoybfBaBCLzwO/scene.spline').then((_scene) => {
scene = _scene;
});
</script>
{#if scene}
<Canvas>
...
</Canvas>
{/if}
This will add the missing props to SceneNode
Register this Vite plugin to fetch more accurate types for your Spline scene
e.g.
import { threlteSplineTypesPlugin } from 'threlte-spline/dist/types-plugin';
const viteConfig = {
...,
plugins: [..., threlteSplineTypesPlugin()],
};
Without plugin
scene.nodes
// ^= { [x: string]: SceneNode }
With plugin
scene.nodes
// ^= { rectangle: SceneNode, camera: SceneNode }