A mesh that has a Skeleton with bones that can then be used to animate the vertices of the geometry.

SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.

Code Example

const geometry = new v3d.CylinderGeometry(5, 5, 5, 5, 15, 5, 30); // create the skin indices and skin weights manually // (typically a loader would read this data from a 3D model for you) const position = geometry.attributes.position; const vertex = new v3d.Vector3(); const skinIndices = []; const skinWeights = []; for (let i = 0; i < position.count; i++) { vertex.fromBufferAttribute(position, i); // compute skinIndex and skinWeight based on some configuration data const y = (vertex.y + sizing.halfHeight); const skinIndex = Math.floor(y / sizing.segmentHeight); const skinWeight = (y % sizing.segmentHeight) / sizing.segmentHeight; skinIndices.push(skinIndex, skinIndex + 1, 0, 0); skinWeights.push(1 - skinWeight, skinWeight, 0, 0); } geometry.setAttribute('skinIndex', new v3d.Uint16BufferAttribute(skinIndices, 4)); geometry.setAttribute('skinWeight', new v3d.Float32BufferAttribute(skinWeights, 4)); // create skinned mesh and skeleton const mesh = new v3d.SkinnedMesh(geometry, material); const skeleton = new v3d.Skeleton(bones); // see example from v3d.Skeleton const rootBone = skeleton.bones[0]; mesh.add(rootBone); // bind the skeleton to the mesh mesh.bind(skeleton); // move the bones and manipulate the model skeleton.bones[0].rotation.x = -0.1; skeleton.bones[1].rotation.x = 0.2;


SkinnedMesh(geometry : BufferGeometry, material : Material)

geometry — an instance of BufferGeometry.
material — (optional) an instance of Material. Default is a new MeshBasicMaterial.


See the base Mesh class for common properties.

.bindMode : String

Either 'attached' or 'detached'. 'attached' uses the SkinnedMesh.matrixWorld property for the base transform matrix of the bones. 'detached' uses the SkinnedMesh.bindMatrix. Default is 'attached'.

.bindMatrix : Matrix4

The base matrix that is used for the bound bone transforms.

.bindMatrixInverse : Matrix4

The base matrix that is used for resetting the bound bone transforms.

.isSkinnedMesh : Boolean

Read-only flag to check if a given object is of type SkinnedMesh.

.skeleton : Skeleton

Skeleton representing the bone hierarchy of the skinned mesh.


See the base Mesh class for common methods.

.bind(skeleton : Skeleton, bindMatrix : Matrix4)

skeletonSkeleton created from a Bones tree.
bindMatrixMatrix4 that represents the base transform of the skeleton.

Bind a skeleton to the skinned mesh. The bindMatrix gets saved to .bindMatrix property and the .bindMatrixInverse gets calculated.

.clone() → SkinnedMesh

This method does currently not clone an instance of SkinnedMesh correctly. Please use SkeletonUtils.clone() in the meanwhile.


Normalizes the skin weights.


This method sets the skinned mesh in the rest pose (resets the pose).

.boneTransform(index : Integer, target : Vector3) → Vector3

Calculates the position of the vertex at the given index relative to the current bone transformations. Target vector must be initialized with the vetrex coordinates prior to the transformation:

const target = new v3d.Vector3(); target.fromBufferAttribute(mesh.geometry.attributes.position, index); mesh.boneTransform(index, target);


For more info on how to obtain the source code of this module see this page.