[solved] Problem porting SkinnedMesh from old Geometry to BufferGeometry

Instead of trying to port something, it is often easier to programme it from scratch. Otherwise, one sticks too much to the template and overlooks essential differences.

That is why I have simplified the official example from the docs Three.js Bones Browser so that I can experiment on this basis. Maybe that will lead to the goal.

SkinnedMeshTest_01


UPDATE
SkinnedMeshTest_02

Another, even more simplified variant for tests. Some terms changed. The term
segmentCount at sizing = { } in the original is the bone count ( constant 4 ) and not to be confused with the segments of the geometry.

In the original
sizing.segmentCount * 3, // heightSegments
( 4*3 height segments of the cylinder!)

By the way, in SkinnedMesh Docs: three.js docs

Code Example
const geometry = new THREE.CylinderGeometry( 5, 5, 5, 15, 5, 30 );
no matching definition for example: ( 5, 5, 32, 8, 12, true)


SkinnedMeshTest_01


<!DOCTYPE html>
<!-- adapted from	https://threejs.org/docs/scenes/bones-browser.html  -->
<!-- https://discourse.threejs.org/t/problem-porting-skinnedmesh-from-old-geometry-to-buffergeometry/33748 -->
	<head>
		<meta charset="utf-8">
		<title> SkinnedMeshTest_01 </title>
	</head>
	<body> </body> 
	
	<script type="module">
	
	import { Bone,Color,CylinderGeometry,DoubleSide,Float32BufferAttribute,MeshBasicMaterial,PerspectiveCamera,
			 PointLight,Scene,SkinnedMesh,Skeleton,SkeletonHelper,Vector3,Uint16BufferAttribute,WebGLRenderer
	} from '../jsm/three.module.136.js';	
	import { OrbitControls } from '../jsm/OrbitControls.136.js';

	let  mesh, bones, skeletonHelper;

	const scene = new Scene();
	scene.background = new Color( 0xdedede );
	const camera = new PerspectiveCamera( 65, window.innerWidth / window.innerHeight, 0.1, 200 );
	camera.position.set( 0,40,40 );
	const renderer = new WebGLRenderer( { antialias: true } );
	renderer.setPixelRatio( window.devicePixelRatio );
	renderer.setSize( window.innerWidth, window.innerHeight );
	document.body.appendChild( renderer.domElement );
	new OrbitControls( camera, renderer.domElement );
 
	initBones();

	function createGeometry( sizing ) {

		const geometry = new CylinderGeometry(
			5, // radiusTop
			5, // radiusBottom
			sizing.height,
			8, // radiusSegments
			sizing.segmentCount * 3, // heightSegments
			true // openEnded
		);

		const position = geometry.attributes.position;

		const vertex = new Vector3();

		const skinIndices = [];
		const skinWeights = [];

		for ( let i = 0; i < position.count; i ++ ) {

			vertex.fromBufferAttribute( position, i );

			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 Uint16BufferAttribute( skinIndices, 4 ) );
		geometry.setAttribute( 'skinWeight', new Float32BufferAttribute( skinWeights, 4 ) );

		return geometry;

	}

	function createBones( sizing ) {

		bones = [];

		let prevBone = new Bone();
		bones.push( prevBone );
		prevBone.position.y = -sizing.halfHeight;

		for ( let i = 0; i < sizing.segmentCount; i ++ ) {

			const bone = new Bone();
			bone.position.y = sizing.segmentHeight;;
			bones.push( bone );
			prevBone.add( bone );
			prevBone = bone;

		}

		return bones;

	}

	function createMesh( geometry, bones ) {

		const material = new MeshBasicMaterial( { color: 0xff44ee, side: DoubleSide, wireframe: true } );

		const mesh = new SkinnedMesh( geometry,	material );
		const skeleton = new Skeleton( bones );

		mesh.add( bones[ 0 ] );

		mesh.bind( skeleton );

		skeletonHelper = new SkeletonHelper( mesh );
		skeletonHelper.material.linewidth = 2;
		scene.add( skeletonHelper );

		return mesh;

	}
	
	function initBones() {

		const segmentHeight = 8;
		const segmentCount = 4;
		const height = segmentHeight * segmentCount;
		const halfHeight = height * 0.5;

		const sizing = {
			segmentHeight: segmentHeight,
			segmentCount: segmentCount,
			height: height,
			halfHeight: halfHeight
		};

		const geometry = createGeometry( sizing );
		const bones = createBones( sizing );
		mesh = createMesh( geometry, bones );

		scene.add( mesh );

	}

	function render( ) {

		requestAnimationFrame( render );

		const time = Date.now() * 0.001;
		
			for ( let i = 0; i < mesh.skeleton.bones.length; i ++ ) {

				mesh.skeleton.bones[ i ].rotation.x = 0.6 * Math.cos( 1.2 * time ) / mesh.skeleton.bones.length;
				mesh.skeleton.bones[ i ].rotation.z = 0.6 * Math.sin( 1.2 * time ) / mesh.skeleton.bones.length;
			}

		renderer.render( scene, camera );

	}

	render( );

</script>
</html>

SkinnedMeshTest_02

<!DOCTYPE html>
<!-- adapted from    https://threejs.org/docs/scenes/bones-browser.html  -->
<!-- https://discourse.threejs.org/t/problem-porting-skinnedmesh-from-old-geometry-to-buffergeometry/33748 -->
    <head>
        <meta charset="utf-8">
        <title> SkinnedMeshTest_02 </title>
    </head>
    <body> </body> 

    <script type="module">

    import * as THREE from '../jsm/three.module.136.js';    
    import { OrbitControls } from '../jsm/OrbitControls.136.js';

    const scene = new THREE.Scene();
    const camera = new THREE.PerspectiveCamera( 65, window.innerWidth / window.innerHeight, 0.001, 1000 );
    camera.position.set( 2, 7, 7 );
    const renderer = new THREE.WebGLRenderer( { antialias: true } );
    renderer.setPixelRatio( window.devicePixelRatio );
    renderer.setSize( window.innerWidth, window.innerHeight );
    renderer.setClearColor( 0xdedede, 1 );
    document.body.appendChild( renderer.domElement );
    new OrbitControls( camera, renderer.domElement );
    scene.add( new THREE.AxesHelper( 2 ) );

    const material = new THREE.MeshBasicMaterial( { color: 0xff44ee, side: THREE.DoubleSide, wireframe: true } );

    // inputs
    const radius = 0.5;
    const radiusSegments = 6;
    const boneHeight = 0.75;
    const boneCount = 4;
    const segmentsBone = 5;

    const height = boneHeight * boneCount;

    const geometry = new THREE.CylinderGeometry( radius, radius, height, radiusSegments, boneCount * segmentsBone, true );

    const bones = [];
    let prevBone = new THREE.Bone();
    bones.push( prevBone );
    prevBone.position.y = -height / 2 

    for ( let i = 0; i < boneCount; i ++ ) {

        const bone = new THREE.Bone();
        bone.position.y = boneHeight;
        bones.push( bone );
        prevBone.add( bone );
        prevBone = bone;

    }

    const pos = geometry.attributes.position;
    const vertex = new THREE.Vector3( );
    const skinIndices = [];
    const skinWeights = [];

    for ( let i = 0; i < pos.count; i ++ ) {

        vertex.fromBufferAttribute( pos, i );

        const y = ( vertex.y + height / 2 ); 
        
        const skinIndex = Math.floor( y / boneHeight );
        const skinWeight = ( y % boneHeight ) / boneHeight;

        skinIndices.push( skinIndex, skinIndex + 1, 0, 0 );
        skinWeights.push( 1 - skinWeight, skinWeight, 0, 0 );

    }

    geometry.setAttribute( 'skinIndex',  new THREE.Uint16BufferAttribute( skinIndices, 4 ) );
    geometry.setAttribute( 'skinWeight', new THREE.Float32BufferAttribute( skinWeights, 4 ) );

    const mesh = new THREE.SkinnedMesh( geometry, material );
    const skeleton = new THREE.Skeleton( bones );
    mesh.add( bones[ 0 ] );
    mesh.bind( skeleton );
    scene.add( mesh );
    mesh.position.y = height / 2;
    
    scene.add( new THREE.SkeletonHelper( mesh ) );
    
    let time;

    bones[ 0 ].position.z = -0.5;   bones[ 2 ].rotation.y = 0.7;  bones[ 4 ].rotation.y = -0.7;     // tests 

    animate( );

    function animate( ) {

        requestAnimationFrame( animate );

        time = Date.now() * 0.001;
        
        for ( let i = 0; i < mesh.skeleton.bones.length; i ++ ) {  // shorter:  bones.length

            mesh.skeleton.bones[ i ].rotation.x = 0.1 * Math.cos( 1.3 * time );      // tests 
            mesh.skeleton.bones[ i ].rotation.z = 0.1 * Math.sin( 1.3 * time );

        }

        renderer.render( scene, camera );

    }

</script>
</html>