three.js CCDIKSolver

2023-02-16 17:49 更新

使用 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


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号