Weights (Envelope)

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

Autodesk Softimage v7.5