diff --git a/docs/examples/en/animations/CCDIKSolver.html b/docs/examples/en/animations/CCDIKSolver.html index 8c8cb02bec31ea..b111450da22d7d 100644 --- a/docs/examples/en/animations/CCDIKSolver.html +++ b/docs/examples/en/animations/CCDIKSolver.html @@ -11,31 +11,94 @@

[name]

A solver for IK with CCD Algorithm.

[name] solves Inverse Kinematics Problem with CCD Algorithm. - [name] is designed to work with [page:SkinnedMesh] loaded by [page:MMDLoader] but also can be used for generic [page:SkinnedMesh]. + [name] is designed to work with [page:SkinnedMesh] but also can be used with [page:MMDLoader] or [page:GLTFLoader] skeleton.

+ +

Code Example

let ikSolver; - // Load MMD resources and instantiate CCDIKSolver - new MMDLoader().load( - 'models/mmd/miku.pmd', - function ( mesh ) { + // + // Bones hierarchy: + // + // root + // ├── bone0 + // │ └── bone1 + // │ └── bone2 + // │ └── bone3 + // └── target + // + // Positioned as follow on the cylinder: + // + // o <- target (y = 20) + // + // +----o----+ <- bone3 (y = 12) + // | | + // | o | <- bone2 (y = 4) + // | | + // | o | <- bone1 (y = -4) + // | | + // +----oo---+ <- root, bone0 (y = -12) + // + + let bones = [] + + // "root" + let rootBone = new Bone(); + rootBone.position.y = -12; + bones.push( rootBone ); + + // "bone0" + let prevBone = new Bone(); + prevBone.position.y = 0; + rootBone.add( prevBone ); + bones.push( prevBone ); + + // "bone1", "bone2", "bone3" + for ( let i = 1; i <= 3; i ++ ) { + const bone = new Bone(); + bone.position.y = 8; + bones.push( bone ); + + prevBone.add( bone ); + prevBone = bone; + } + + // "target" + const targetBone = new Bone(); + targetBone.position.y = 24 + 8 + rootBone.add( targetBone ); + bones.push( targetBone ); + + // + // skinned mesh + // - ikSolver = new CCDIKSolver( mesh, mesh.geometry.iks ); - scene.add( mesh ); + const mesh = new SkinnedMesh( geometry, material ); + const skeleton = new Skeleton( bones ); + mesh.add( bones[ 0 ] ); // "root" bone + mesh.bind( skeleton ); + + // + // ikSolver + // + + const iks = [ + { + target: 5, // "target" + effector: 4, // "bone3" + links: [ { index: 3 }, { index: 2 }, { index: 1 } ] // "bone2", "bone1", "bone0" } - ); + ]; + ikSolver = new CCDIKSolver( mesh, iks ); function render() { - - animate(); // update bones - if ( ikSolver !== undefined ) ikSolver.update(); + ikSolver?.update(); renderer.render( scene, camera ); - } diff --git a/docs/examples/zh/animations/CCDIKSolver.html b/docs/examples/zh/animations/CCDIKSolver.html index ad6ee2fadfaf8e..567dc32094eaf6 100644 --- a/docs/examples/zh/animations/CCDIKSolver.html +++ b/docs/examples/zh/animations/CCDIKSolver.html @@ -11,31 +11,94 @@

[name]

A solver for IK with CCD Algorithm.

[name] solves Inverse Kinematics Problem with CCD Algorithm. - [name] is designed to work with [page:SkinnedMesh] loaded by [page:MMDLoader] but also can be used for generic [page:SkinnedMesh]. + [name] is designed to work with [page:SkinnedMesh] but also can be used with [page:MMDLoader] or [page:GLTFLoader] skeleton.

+ +

代码示例

- const ikSolver; + let ikSolver; + + // + // Bones hierarchy: + // + // root + // ├── bone0 + // │ └── bone1 + // │ └── bone2 + // │ └── bone3 + // └── target + // + // Positioned as follow on the cylinder: + // + // o <- target (y = 20) + // + // +----o----+ <- bone3 (y = 12) + // | | + // | o | <- bone2 (y = 4) + // | | + // | o | <- bone1 (y = -4) + // | | + // +----oo---+ <- root, bone0 (y = -12) + // + + let bones = [] + + // "root" + let rootBone = new Bone(); + rootBone.position.y = -12; + bones.push( rootBone ); + + // "bone0" + let prevBone = new Bone(); + prevBone.position.y = 0; + rootBone.add( prevBone ); + bones.push( prevBone ); + + // "bone1", "bone2", "bone3" + for ( let i = 1; i <= 3; i ++ ) { + const bone = new Bone(); + bone.position.y = 8; + bones.push( bone ); + + prevBone.add( bone ); + prevBone = bone; + } + + // "target" + const targetBone = new Bone(); + targetBone.position.y = 24 + 8 + rootBone.add( targetBone ); + bones.push( targetBone ); + + // + // skinned mesh + // - // Load MMD resources and instantiate CCDIKSolver - new MMDLoader().load( - 'models/mmd/miku.pmd', - function ( mesh ) { + const mesh = new SkinnedMesh( geometry, material ); + const skeleton = new Skeleton( bones ); - ikSolver = new CCDIKSolver( mesh, mesh.geometry.iks ); - scene.add( mesh ); + mesh.add( bones[ 0 ] ); // "root" bone + mesh.bind( skeleton ); + // + // ikSolver + // + + const iks = [ + { + target: 5, // "target" + effector: 4, // "bone3" + links: [ { index: 3 }, { index: 2 }, { index: 1 } ] // "bone2", "bone1", "bone0" } - ); + ]; + ikSolver = new CCDIKSolver( mesh, iks ); function render() { - - animate(); // update bones - if ( ikSolver !== undefined ) ikSolver.update(); + ikSolver?.update(); renderer.render( scene, camera ); - } @@ -92,7 +155,7 @@

[method:CCDIKHelper createHelper]()

[method:this update]()

- Update bones quaternion by solving CCD algorithm. + Update IK bones quaternion by solving CCD algorithm.

[method:this updateOne]( [param:Object ikParam] )

diff --git a/docs/scenes/ccdiksolver-browser.html b/docs/scenes/ccdiksolver-browser.html new file mode 100644 index 00000000000000..97900ef38168ae --- /dev/null +++ b/docs/scenes/ccdiksolver-browser.html @@ -0,0 +1,286 @@ + + + + + Three.js CCDIKSolver Browser + + + + + + + + + + + + + Open in New Window + + + +