SkeletonHelper.js 2.1 KB
Newer Older
1 2 3
/**
 * @author Sean Griffin / http://twitter.com/sgrif
 * @author Michael Guerrero / http://realitymeltdown.com
4
 * @author mrdoob / http://mrdoob.com/
5
 * @author ikerr / http://verold.com
6 7
 */

8 9
THREE.SkeletonHelper = function ( object ) {

10
	this.bones = this.getBoneList( object );
11

12
	var geometry = new THREE.Geometry();
13

14
	for ( var i = 0; i < this.bones.length; i ++ ) {
15

16
		var bone = this.bones[ i ];
17

M
Mr.doob 已提交
18
		if ( bone.parent instanceof THREE.Bone ) {
19

20 21 22 23
			geometry.vertices.push( new THREE.Vector3() );
			geometry.vertices.push( new THREE.Vector3() );
			geometry.colors.push( new THREE.Color( 0, 0, 1 ) );
			geometry.colors.push( new THREE.Color( 0, 1, 0 ) );
24

M
Mr.doob 已提交
25
		}
26

M
Mr.doob 已提交
27
	}
28

M
Mr.doob 已提交
29 30
	geometry.dynamic = true;

M
Mr.doob 已提交
31
	var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors, depthTest: false, depthWrite: false, transparent: true } );
32

33
	THREE.LineSegments.call( this, geometry, material );
34

35
	this.root = object;
36

37
	this.matrix = object.matrixWorld;
38 39
	this.matrixAutoUpdate = false;

M
Mr.doob 已提交
40
	this.update();
M
Mr.doob 已提交
41

42 43 44
};


45
THREE.SkeletonHelper.prototype = Object.create( THREE.LineSegments.prototype );
46
THREE.SkeletonHelper.prototype.constructor = THREE.SkeletonHelper;
47

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
THREE.SkeletonHelper.prototype.getBoneList = function( object ) {

	var boneList = [];

	if ( object instanceof THREE.Bone ) {

		boneList.push( object );

	}

	for ( var i = 0; i < object.children.length; i ++ ) {

		boneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );

	}

	return boneList;

};

68 69
THREE.SkeletonHelper.prototype.update = function () {

70
	var geometry = this.geometry;
71

72
	var matrixWorldInv = new THREE.Matrix4().getInverse( this.root.matrixWorld );
73

74
	var boneMatrix = new THREE.Matrix4();
75

76
	var j = 0;
77

78
	for ( var i = 0; i < this.bones.length; i ++ ) {
79

80
		var bone = this.bones[ i ];
81

82
		if ( bone.parent instanceof THREE.Bone ) {
83

84 85 86 87
			boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );
			geometry.vertices[ j ].setFromMatrixPosition( boneMatrix );

			boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );
88
			geometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix );
89

90
			j += 2;
91

M
Mr.doob 已提交
92
		}
93

M
Mr.doob 已提交
94
	}
95

96
	geometry.verticesNeedUpdate = true;
97

98
	geometry.computeBoundingSphere();
99

100
};