Envelope.Weights

Description

Returns a ClusterElementCollection containing the deformer weights for the envelope. The ClusterElementCollection.Array property provides access to a 2-dimensional Array, where the first dimension maps to the Envelope.Deformers and the second dimension maps to the cluster elements.

C# Syntax

// get accessor
ClusterElementCollection Envelope.get_Weights( Object );

Parameters

Parameter Type Description
Time Double Time (in frames) at which to get property

Default Value: Current time in frames

Examples

1. VBScript Example

' 
'	This example demonstrates how to access the
'	Weights information from a skeleton's envelope
'
NewScene , false
' Create the Skeleton
Dim oRoot, aRootPos, aEffPos1, aEffPos2, oChain1, oChain2
Set oRoot = Application.ActiveProject.ActiveScene.Root
aRootPos = Array(0.254, 3.998, 0.045)
aEffPos1 = Array(-0.01, -0.056, -2.972)
aEffPos2 = Array(0.183, -3.999, 0.115)
Set oChain1 = oRoot.Add2DChain( aRootPos, aEffPos1, , siViewTop )
Set oChain2 = oChain1.AddBone( aEffPos2 )
' Create the Envelope
Dim oSphere, oGeometry
Set oSphere = oRoot.AddGeometry( "Sphere", "MeshSurface")
oSphere.Parameters("subdivu").Value = 2
oSphere.Parameters("subdivv").Value = 2
Set oGeometry = oSphere.ActivePrimitive.Geometry
' Apply the Envelope to the Skeleton
Dim oEnvelope
Set oEnvelope = oSphere.ApplyEnvelope( oChain1, siBranch, siBranch )
' Get 2D array of element/deformer weights
Dim aWeights
aWeights = oEnvelope.Weights.Array
' Log weights
Dim iElement, strElementWeights, iDeformer, lString
For iElement = LBound(aWeights,2) to UBound(aWeights,2)
	strElementWeights = ""
	For iDeformer = LBound(aWeights,1) to UBound(aWeights,1)
		strElementWeights = strElementWeights & Round(aWeights(iDeformer,iElement)) & ","
	Next
	' Trim the final comma from the string
	lString = Len(strElementWeights) - 1
	strElementWeights = Left( strElementWeights, lString )
	LogMessage "weight(" & iElement & ") = " & strElementWeights
Next
'Output of the script is this:
'INFO : "weight(0) = 0,0,100,0"
'INFO : "weight(1) = 0,100,0,0"
'INFO : "weight(2) = 0,50,50,0"
'INFO : "weight(3) = 0,50,50,0"
'INFO : "weight(4) = 0,50,50,0"

2. JScript Example

/*
	JScript version of the previous example, demonstrating 
	how to access the weights on each vertex
*/
NewScene( null, false ) ;
var oRoot = Application.ActiveProject.ActiveScene.Root ;
var aRootPos = new Array( 0.254, 3.998, 0.045 ) ;
var aEffPos1 = new Array( -0.01, -0.056,-2.972 ) ;
var aEffPos2 = new Array( 0.183,-3.999, 0.115 ) ;
// Create the Skeleton
var oChain1 = oRoot.Add2DChain( aRootPos, aEffPos1 ) ;
var oChain2 = oChain1.AddBone( aEffPos2 ) ;
// Create the Envelope
var oSphere = oRoot.AddGeometry( "Sphere", "MeshSurface" ) ;
oSphere.Parameters( "subdivu" ).Value = 2 ;
oSphere.Parameters( "subdivv" ).Value = 2 ;
var oGeometry = oSphere.ActivePrimitive.Geometry ;
// Apply the Envelope to the Skeleton
var oEnvelope = oSphere.ApplyEnvelope( oChain1, siBranch, siBranch ) ;
// Weights are represented as a 2-dimensional array,
// but it will be collapsed down to a 1-D array
// because JScript does not support multi-dimensional arrays
// (with each component listed one after another)
var aWeights = oEnvelope.Weights.Array.toArray() ;
var cntDeformers = oEnvelope.Deformers.Count ;
var cntVertices = aWeights.length / cntDeformers ;
var iElement = 0 ;
for ( iVertex=0 ; iVertex<cntVertices ; iVertex++ ) {
	strElementWeights = "" ;
	for ( iDeformer=0 ; iDeformer<cntDeformers ; iDeformer++ ) {
		strElementWeights += Math.round(aWeights[ iDeformer + iVertex * cntDeformers ]) ;
		if ( iDeformer != cntDeformers-1 ) {
			strElementWeights += "," ;
		}
	}
	Application.LogMessage( "weight(" + iVertex + ") = " + strElementWeights ) ;
}
// Output of the script is this:
//INFO : "weight(0) = 0,0,100,0"
//INFO : "weight(1) = 0,100,0,0"
//INFO : "weight(2) = 0,50,50,0"
//INFO : "weight(3) = 0,50,50,0"
//INFO : "weight(4) = 0,50,50,0"

3. C# Example

/*
	See Envelope.GetWeights2 for a C# example of accessing envelope weights
*/

See Also

Envelope.GetWeights2