My favorites
|
Sign in
papervision3d
Open Source realtime 3D engine for Flash
Project Home
Downloads
Wiki
Issues
Source
Checkout
|
Browse
|
Changes
|
r708
r911›
Source path:
svn
/
trunk
/
as3
/
trunk
/
src
/
org
/
papervision3d
/
core
/
controller
/
SkinController.as
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
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;
/**
* 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
r708
by neoriley on Aug 25, 2008
Diff
Updating Trunk to 2.0 Beta
Go to:
/trunk/as3/trunk/src
/trunk/as3/trunk/src/nochump/util
...src/nochump/util/zip/Deflater.as
...src/nochump/util/zip/Inflater.as
...src/nochump/util/zip/ZipError.as
...k/src/org/ascollada/ASCollada.as
...collada/core/DaeAnimationClip.as
...ollada/core/DaeAnimationCurve.as
.../org/ascollada/core/DaeCamera.as
...ascollada/core/DaeContributor.as
.../org/ascollada/core/DaeEntity.as
...rg/ascollada/core/DaeGeometry.as
...c/org/ascollada/core/DaeImage.as
...scollada/core/DaeInstanceNode.as
...rc/org/ascollada/core/DaeNode.as
...g/ascollada/core/DaePrimitive.as
...collada/core/DaeVertexWeights.as
...rg/ascollada/core/DaeVertices.as
...collada/fx/DaeBindVertexInput.as
...src/org/ascollada/fx/DaeBlinn.as
...c/org/ascollada/fx/DaeLambert.as
.../org/ascollada/fx/DaeMaterial.as
...org/ascollada/fx/DaeSampler2D.as
...c/org/ascollada/fx/DaeSurface.as
...rc/org/ascollada/io/DaeReader.as
...rc/org/ascollada/io/DaeWriter.as
.../org/ascollada/physics/DaeBox.as
.../ascollada/physics/DaeCapsule.as
...ascollada/physics/DaeCylinder.as
...cs/DaeInstancePhysicsMaterial.as
...ysics/DaeInstancePhysicsModel.as
...llada/physics/DaePhysicsScene.as
...rg/ascollada/physics/DaePlane.as
...da/physics/DaeRigidConstraint.as
...rg/ascollada/physics/DaeShape.as
...g/ascollada/physics/DaeSphere.as
...ada/physics/DaeTaperedCapsule.as
...s3/trunk/src/org/ascollada/types
...ollada/types/DaeAddressSyntax.as
...s3/trunk/src/org/ascollada/utils
...rc/org/ascollada/utils/Logger.as
...rg/ascollada/utils/StringUtil.as
...g/papervision3d/Papervision3D.as
...ision3d/cameras/DebugCamera3D.as
...trunk/src/org/papervision3d/core
...animation/AnimationKeyFrame3D.as
...mation/IAnimationDataProvider.as
...ion/channel/AbstractChannel3D.as
...ation/channel/MatrixChannel3D.as
.../channel/MatrixStackChannel3D.as
Project members,
sign in
to write a code review
Older revisions
All revisions of this file
File info
Size: 2918 bytes, 126 lines
View raw file
Hosted by