Nubu
  • Features
  • How it works
  • Pricing
  • Integrations
  • FAQ
  • Contact
  • Docs
  • Blog
  • Log in
  • Log inSign up
    Nubu

    Creative automation for teams that ship campaigns, not busywork.

    Try for free
    Product
    FeaturesNubu MotionHow it worksPricingIntegrationsFAQ
    Company
    AboutContactDocsBlogLog in
    Legal
    Privacy policyTerms of serviceData deletion
    © 2026 Bear Studios · Nubu
    Introduction
    Templates overviewInstalling Nubu BuilderAdding template compsAdding propertiesAdding footageSetting defaultsExporting your templateUploading a template
    Flows overviewAvailable nodesAdding a nodeConnecting nodesWorking with dataTemplates and outputsUsing AI nodesBuilding a creative
    CampaignsTemplatesAssetsGlossariesRendersSettings
    Connecting Meta AdsConnecting Google AdsConnecting OpenAIConnecting Gemini AI StudioConnecting Anthropic
    AI Assistant overviewPrompt examplesAssistant settings and controls
    Nubu Motion scripts: the reference
    OverviewQuick startDifferences from After EffectsDeterminism
    JavaScript supportReferences and idsProject scriptsState and timeBudgets and errorsFormatting values
    GlobalTime conversionInterpolationVector mathsRandom and noiseColour conversionOther maths
    LayerCompPropertyKeyframePathGeometryProjectComponentConsoleComponentControlExpressionControl
    The property vocabularyAnimators propertiesAudio propertiesContent propertiesContents propertiesEffects propertiesExpression controls propertiesFills propertiesInstance controls propertiesLayer propertiesLayout propertiesMasks propertiesStrokes propertiesText style propertiesRig propertiesRigging propertiesRig controllers propertiesRigging weights propertiesRigging mesh propertiesRig items propertiesRig splines propertiesRig simulation propertiesRig properties propertiesRig drivers propertiesRig draw order propertiesTransform propertiesTrim path properties
    Error codesBudgets
    Changelog
    All docs
    Motion Scripting
    / Properties

    Rigging weights properties

    A weighted binding's keyed influence entries by rigging item, shape, subpath, vertex and entity: the weight of a bone or a controller on a vertex or its handles, and a handle's blend.

    The rigging weights family: a weighted binding's influence entries - the weight of one bone or controller on one vertex of a contents shape (or of the legacy path under the literal home path), on its in / out handle, and the handle's blend (the share of the handle's own entries over the vertex's) - percent (0..100), addressed by rigging item id, shape id, subpath index, vertex index and entity id. Only KEYED entries have rows (the focus rule); every pattern reads, keyframes AND drives: a script easing a vertex's weight from one bone to another over time hands that part of the silhouette between them.

    Every pattern below is readable from scripts through prop() and layer.prop(); ids in a pattern (like <effect_id>) stand for the entity's real id. Every pattern here is in the drive set: scripts may WRITE each one with set() or a single-output return, per frame.

    PatternWire kindUnitsReadsWrites
    rigging.<item_id>.weights.<shape_id>.<subpath>.<vertex>.<entity_id>scalarpercent (0..100)yesdrive set
    rigging.<item_id>.weights.<shape_id>.<subpath>.<vertex>.in.<entity_id>scalarpercent (0..100)yesdrive set
    rigging.<item_id>.weights.<shape_id>.<subpath>.<vertex>.in.blendscalarpercent (0..100)yesdrive set
    rigging.<item_id>.weights.<shape_id>.<subpath>.<vertex>.out.<entity_id>scalarpercent (0..100)yesdrive set
    rigging.<item_id>.weights.<shape_id>.<subpath>.<vertex>.out.blendscalarpercent (0..100)yesdrive set
    rigging.<item_id>.weights.path.<subpath>.<vertex>.<entity_id>scalarpercent (0..100)yesdrive set
    rigging.<item_id>.weights.path.<subpath>.<vertex>.in.<entity_id>scalarpercent (0..100)yesdrive set
    rigging.<item_id>.weights.path.<subpath>.<vertex>.in.blendscalarpercent (0..100)yesdrive set
    rigging.<item_id>.weights.path.<subpath>.<vertex>.out.<entity_id>scalarpercent (0..100)yesdrive set
    rigging.<item_id>.weights.path.<subpath>.<vertex>.out.blendscalarpercent (0..100)yesdrive set

    Worked examples#

    The rigging weights family: a weighted binding's influence entries - the weight of one bone or controller on one vertex (a contents shape by id, or the legacy path under the literal home path), on its in / out handle, and the handle's blend - percent (0..100), addressed by rigging item id, home, subpath index, vertex index and entity id. The stage normalises a vertex's entries at evaluation, so one driven entry re-balances the point against the others; only KEYED entries have timeline rows (the focus rule), while every pattern reads, keyframes AND drives.

    Worked example: Hand the cuff back to the upper arm#

    The scene. A Stage comp with a two-bone Arm rig - the Upper bone from (60, 90) heading right for 80 px, the Forearm turned 20 degrees under it and keyed to bend to 80 degrees over the first second - and a Sleeve path layer hugging the arm, bound Weighted to the rig with the Distance seed (the shoulder end on the Upper, the cuff on the Forearm).

    • The comp Stage: 640 by 360 at 25 fps, 100 frames (4 seconds).
    • Arm: a rig layer, at [60, 90].
      • The skeleton: Upper (bone_1, a root) from [0, 0] at 0 degrees for 80 px; Forearm (bone_2, under Upper) at 20 degrees for 60 px.
      • Keyframe rig.bones.bone_2.rotation at frame 0: 20 (linear).
      • Keyframe rig.bones.bone_2.rotation at frame 24: 80 (linear).
    • Sleeve: a path layer, at [0, 0], filled #2266ff.
      • The rigging stack: rigging_1 - a WEIGHTED binding on the Arm rig (the Distance seed: every vertex weighted by its distance to the bones; the script addresses the entries as rigging.rigging_1.weights.<home>.<subpath>.<vertex>.<entity_id>).

    The script. Add a project script named Hand the cuff back to the upper arm and paste:

    export const outputs = ["layer_2:rigging.rigging_1.weights.path.0.5.bone_1"];
    
    export function frame() {
      return linear(time, 0, 2, 0, 60);
    }
    

    Line by line:

    • Line 1: One output: the UPPER bone's weight on the Sleeve's cuff vertex (vertex 5 of the legacy path - the home is the literal path, subpath 0). rigging.<item_id>.weights.path.<subpath>.<vertex>.<entity_id> is that entity's share of the point in percent; the Distance seed left the cuff almost wholly on the Forearm (about 9 on the Upper, 91 on the Forearm).
    • Line 4: linear() ramps the Upper's share from 0 to 60 over the first two seconds and holds 60 after that. The stage normalises the point's entries at evaluation, so as the Upper's share grows the cuff vertex follows the bent Forearm less and less - by two seconds it sits about halfway between the two bones' places. The other cuff vertices keep their seeded weights and still swing with the Forearm.

    What you see. The elbow bends over the first second (the Forearm's keyed rotation); the cuff's top vertex starts by swinging down with the Forearm, then drifts back toward the upper arm's line as the script hands it over - at one second its Upper weight reads 30, at two seconds 60, then it holds.

    The elbow bends over the first second (the Forearm's keyed rotation); the cuff's top vertex starts by swinging down with the Forearm, then drifts back toward the upper arm's line as the script hands it over - at one second its Upper weight reads 30, at two seconds 60, then it holds.