@dannadori/three-ik
Version:
inverse kinematics for three.js
148 lines (105 loc) • 4.63 kB
Markdown
This is revised version of THREE.IK. Original is [here](https://github.com/jsantell/THREE.IK)
<img src="https://jsantell.github.io/THREE.IK/assets/three-ik-graphic-with-text.png" width="400" />
[](https://www.npmjs.org/package/three-ik)
# THREE.IK
Inverse kinematics for [three.js].
A work in progress, THREE.IK supports multiple chains with multiple effectors, solved via [FABRIK] iterative solver, and a ball-joint constraint. Best way to see how this works for now is to check out the [demo], [examples], and the [docs].
:warning: **work in progress/request for feedback** :warning:
There are many [open issues] regarding axis alignment, new constraints, alternative solvers, and an API overhaul. Discussion and solutions are welcome! There will be **breaking changes** between versions as an API is settled on.
## Installation
`$ npm install --save three three-ik`
or include the build at [build/three-ik.js](build/three-ik.js):
```html
<script src="build/three-ik.js"></script>
```
## Usage
You can use ES6 importing like so:
```js
import { IK, IKChain, IKJoint, IKBallConstraint, IKHelper } from "three-ik";
```
And here's a full example if included via script tag, with THREE.IK classes
defined on `THREE`.
```js
// Set up scene, camera, renderer
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
45,
window.innerWidth / window.innerHeight,
0.01,
100
);
camera.position.z = 5;
const renderer = new THREE.WebGLRenderer();
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
const ik = new THREE.IK();
const chain = new THREE.IKChain();
const constraints = [new THREE.IKBallConstraint(90)];
const bones = [];
// Create a target that the IK's effector will reach
// for.
const movingTarget = new THREE.Mesh(
new THREE.SphereGeometry(0.1),
new THREE.MeshBasicMaterial({ color: 0xff0000 })
);
movingTarget.position.z = 2;
const pivot = new THREE.Object3D();
pivot.add(movingTarget);
scene.add(pivot);
// Create a chain of THREE.Bone's, each wrapped as an IKJoint
// and added to the IKChain
for (let i = 0; i < 10; i++) {
const bone = new THREE.Bone();
bone.position.y = i === 0 ? 0 : 0.5;
if (bones[i - 1]) {
bones[i - 1].add(bone);
}
bones.push(bone);
// The last IKJoint must be added with a `target` as an end effector.
const target = i === 9 ? movingTarget : null;
chain.add(new THREE.IKJoint(bone, { constraints }), { target });
}
// Add the chain to the IK system
ik.add(chain);
// Ensure the root bone is added somewhere in the scene
scene.add(ik.getRootBone());
// Create a helper and add to the scene so we can visualize
// the bones
const helper = new THREE.IKHelper(ik);
scene.add(helper);
function animate() {
pivot.rotation.x += 0.01;
pivot.rotation.y += 0.01;
pivot.rotation.z += 0.01;
ik.solve();
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
animate();
```
## Documentation
Full API documentation can be found at https://jsantell.github.io/THREE.IK/docs.
## Build
`$ npm run build`
## Logo
The logo and artwork was created by [Caitlyn Crites](http://www.caitlyncrites.com).
<img src="https://jsantell.github.io/THREE.IK/assets/three-ik-graphic.png" width="100" />
## IK Resources
- [FABRIK: a fast, iterative solver for the inverse kinematics problem](http://www.andreasaristidou.com/FABRIK.html)
- [Roblox Inverse Kinematics FABRIK](http://wiki.roblox.com/index.php?title=Inverse_kinematics#FABRIK)
- [Create your own IK in Unity - Luis Bermudez](https://medium.com/unity3danimation/create-your-own-ik-in-unity3d-989debd86770)
- [CCD Algorithm](https://sites.google.com/site/auraliusproject/ccd-algorithm)
- [Inverse Kinematics with Quaternion Joint Limits - Jonathan Blow](http://number-none.com/product/IK%20with%20Quaternion%20Joint%20Limits/index.html)
- [fullik: JS port of Caliko, Java implementation of FABRIK](https://github.com/lo-th/fullik)
- [webIK: JS port of VRIK](https://github.com/etiennepinchon/webIK)
- [fabrik-2d: JS 2D FABRIK](https://github.com/RGBboy/fabrik-2d)
- [fabrik: Unity component](https://github.com/Tannz0rz/FABRIK)
## License
MIT License, Copyright © 2018 Jordan Santell
[three.js]: https://threejs.org
[fabrik]: http://www.andreasaristidou.com/FABRIK.html
[open issues]: https://github.com/jsantell/THREE.IK/issues
[demo]: https://jsantell.github.io/THREE.IK
[examples]: https://jsantell.github.io/THREE.IK/examples
[docs]: https://jsantell.github.io/THREE.IK/docs