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 @@
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.
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 @@ 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 @@ - Update bones quaternion by solving CCD algorithm. + Update IK bones quaternion by solving CCD algorithm.