My favorites | Sign in
Logo
                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package org.papervision3d.core.controller
{
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.core.math.Matrix3D;
import org.papervision3d.core.math.Number3D;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.special.Skin3D;

public class SkinController implements IObjectController
{
/** */
public var poseMatrix:Matrix3D;

/** */
public var bindShapeMatrix:Matrix3D;

/** */
public var target:Skin3D;

/** */
public var joints:Array;

/** */
public var invBindMatrices:Array;

/** */
public var vertexWeights:Array;

/** */
public var input : MorphController;

/**
* Constructor.
*
* @param target
*/
public function SkinController(target:Skin3D)
{
this.target = target;
this.joints = new Array();
this.invBindMatrices = new Array();
this.vertexWeights = new Array();
}

/**
* Update.
*/
public function update():void
{
if(!joints.length || !bindShapeMatrix)
return;

if(!_cached)
cacheVertices();

if(invBindMatrices.length != this.joints.length)
return;

var vertices:Array = target.geometry.vertices;
var i:int;

// reset mesh's vertices to 0
for(i = 0; i < vertices.length; i++)
vertices[i].x = vertices[i].y = vertices[i].z = 0;

// skin the mesh!
for(i = 0; i < joints.length; i++)
skinMesh(joints[i], this.vertexWeights[i], invBindMatrices[i], _cached, vertices);
}

/**
* Cache original vertices.
*/
private function cacheVertices():void
{
this.target.transformVertices(this.bindShapeMatrix);
this.target.geometry.ready = true;

var vertices:Array = this.target.geometry.vertices;

_cached = new Array(vertices.length);

for(var i:int = 0; i < vertices.length; i++)
_cached[i] = new Number3D(vertices[i].x, vertices[i].y, vertices[i].z);
}

/**
* Skins a mesh.
*
* @param joint
* @param meshVerts
* @param skinnedVerts
*/
private function skinMesh(joint:DisplayObject3D, weights:Array, inverseBindMatrix:Matrix3D, meshVerts:Array, skinnedVerts:Array):void
{
var i:int;
var pos:Number3D = new Number3D();
var original:Number3D;
var skinned:Vertex3D;

var matrix:Matrix3D = Matrix3D.multiply(joint.world, inverseBindMatrix);

for( i = 0; i < weights.length; i++ )
{
var weight:Number = weights[i].weight;
var vertexIndex:int = weights[i].vertexIndex;

if( weight <= 0.0001 || weight >= 1.0001) continue;

original = meshVerts[ vertexIndex ];
skinned = skinnedVerts[ vertexIndex ];

pos.x = original.x;
pos.y = original.y;
pos.z = original.z;

// joint transform
Matrix3D.multiplyVector(matrix, pos);

//update the vertex
skinned.x += (pos.x * weight);
skinned.y += (pos.y * weight);
skinned.z += (pos.z * weight);
}
}

private var _cached:Array;
}
}
Show details Hide details

Change log

r911 by tim.knip on May 26, 2009   Diff
Papervision3D 2.1 - initial commit.
- DAE : morphing, vertex-animation, lots
of fixes
- Animation : total revamp of the
animation system
- MD2 : adapted to match new animation
system
Go to: 
Project members, sign in to write a code review

Older revisions

r708 by neoriley on Aug 25, 2008   Diff
Updating Trunk to 2.0 Beta
All revisions of this file

File info

Size: 2966 bytes, 129 lines
Hosted by Google Code