three.js CCDIKSolver
使用 CCD 算法的 IK 求解器。
CCDIKSolver 使用 CCD 算法解决逆运动学问题。 CCDIKSolver 旨在与 SkinnedMesh 一起使用,但也可以与 MMDLoader 或 GLTFLoader 骨架一起使用。
代码示例
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
//
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() {
ikSolver?.update();
renderer.render( scene, camera );
}
例子
webgl_loader_mmd
webgl_loader_mmd_pose
webgl_loader_mmd_audio
构造函数
CCDIKSolver( mesh : SkinnedMesh, iks : Array )
mesh — CCDIKSolver 为其解决 IK 问题的 SkinnedMesh。
iks — 指定 IK 参数的对象数组。 target、effector 和 link-index 是 .skeleton.bones 中的索引整数。骨骼关系应该是“links[ n ], links[ n - 1 ], ..., links[ 0 ], effector”,从父到子的顺序。
- target — 目标骨骼。
- effector — 效应骨。
- links — 指定链接骨骼的对象数组
- index — 链接骨骼。
- limitation — (可选)旋转轴。默认是未定义的。
- rotationMin — (可选)旋转最小限制。默认是未定义的。
- rotationMax — (可选)旋转最大限制。默认是未定义的。
- enabled — (可选)默认为真。
- iteration — (可选)计算的迭代次数。越小越快但精度越低。默认值为 1。
- minAngle — (可选)步骤中的最小旋转角度。默认是未定义的。
- maxAngle — (可选)一步中的最大旋转角度。默认是未定义的。
创建一个新的 CCDIKSolver。
属性
.iks : Array
传递给构造函数的 IK 参数数组。
.mesh : SkinnedMesh
SkinnedMesh 传递给构造函数。
方法
.createHelper () : CCDIKHelper
返回 CCDIKHelper。您可以通过将助手添加到场景来可视化 IK 骨骼。
.update () : this
通过求解CCD算法更新IK骨骼四元数。
.updateOne ( ikParam : Object ) : this
通过求解 CCD 算法更新 IK 骨骼四元数。
源码
examples/jsm/animation/CCDIKSolver.js
更多建议: