diff --git a/src/nodes/accessors/SkinningNode.js b/src/nodes/accessors/SkinningNode.js index 03824c52bf24c8..42ff7f54e7a2dd 100644 --- a/src/nodes/accessors/SkinningNode.js +++ b/src/nodes/accessors/SkinningNode.js @@ -282,7 +282,20 @@ class SkinningNode extends Node { _frameId.set( skeleton, frame.frameId ); - if ( this.previousBoneMatricesNode !== null ) skeleton.previousBoneMatrices.set( skeleton.boneMatrices ); + if ( this.previousBoneMatricesNode !== null ) { + + if ( skeleton.previousBoneMatrices === null ) { + + // cloned skeletons miss "previousBoneMatrices" in their first updated + + skeleton.previousBoneMatrices = new Float32Array( skeleton.boneMatrices ); + + } + + skeleton.previousBoneMatrices.set( skeleton.boneMatrices ); + + + } skeleton.update(); diff --git a/src/objects/Skeleton.js b/src/objects/Skeleton.js index 31384a9bcd40eb..5d1361086ae3c8 100644 --- a/src/objects/Skeleton.js +++ b/src/objects/Skeleton.js @@ -70,6 +70,15 @@ class Skeleton { */ this.boneMatrices = null; + /** + * An array buffer holding the bone data of the previous frame. + * Required for computing velocity. Maintained in {@link SkinningNode}. + * + * @type {?Float32Array} + * @default null + */ + this.previousBoneMatrices = null; + /** * A texture holding the bone data for use * in the vertex shader. diff --git a/src/renderers/webgpu/utils/WebGPUTextureUtils.js b/src/renderers/webgpu/utils/WebGPUTextureUtils.js index cde2d7a7eabbfd..60f38fed406e18 100644 --- a/src/renderers/webgpu/utils/WebGPUTextureUtils.js +++ b/src/renderers/webgpu/utils/WebGPUTextureUtils.js @@ -683,7 +683,7 @@ class WebGPUTextureUtils { */ _getDefaultCubeTextureGPU( format ) { - let defaultCubeTexture = this.defaultTexture[ format ]; + let defaultCubeTexture = this.defaultCubeTexture[ format ]; if ( defaultCubeTexture === undefined ) {