npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

blender-actions-to-json

v3.0.0

Published

Write the joint data for all `.blend` file actions to a JSON file

Downloads

35

Readme

blender-actions-to-json npm version Build Status

Given a Blender .blend file, write the joint data for all actions to a JSON file

Example Gif

Initial Background / Motivation

Before

I export my Blender models to COLLADA using the native Blender COLLADA exporter before parsing these COLLADA files for my model's data.

Unfortunately this only includes the raw keyframes and no metadata about which keyframes belong to which action, so I end up needing to manually keep track of which keyframe each action starts on.

After

The purpose of this module is to remove that work for me. Now if I want to get the keyframes and joints for the attack animation, I can just reference the JSON action file that this module generates under the key attack. If the number of keyframes for the attack action changes, they'll still all be under the attack action key in the JSON data so I will still have access to them without needing to manually specify the new range of keyframes. Just iterate over the attack key

This is part of an effort to automate more of my asset pipeline.

To Install

We currently support Blender version 2.80 and up

npm install -g blender-actions-to-json
# This will save the actions2json command to your Blender User Preferences
# so that you can call it from within Blender.
actions2json --install

Usage

# Run via CLI
blender /path/to/my-model.blend --background --python `actions2json` -- /path/to/output.json
# Run via bpy.ops
bpy.ops.import_export.actions2json(filepath='/path/to/output.json')

The outputted file will look something like this:

{
  "actions": {
    "some-action": {
      "0.041667": [
        [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
        [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
      ],
      "0.833333": [
        [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
        [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
      ]
    },
    "another-action": {
      "0": [
        [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
        [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
      ]
    }
  },
  "inverseBindPoses": [
    [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
    [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
  ],
  "jointNameIndices": {
    "Torso": 0,
    "Chest": 1
  }
}

The file has all of your actions. Each action has all of the keyframe times for that action. Each keyframe time has the pose matrices for each joint in your armature.

The ordering of the joints is the same as bpy.context.selected_pose_bones.

~InverseBindPoses~ The inverse bind matrix is the matrix that when multiplied by your joint’s default position moves your joint to the origin, in model space. The inverse bind matrix ensures that when you parent your mesh to your rig your vertices won't move (because all of your bones get turned into identity matrices before transforming your vertices) until you move your rig out of this bind position.

If any of this is confusing please open an issue!

CLI Usage

actions2json --help

Usage

  $ actions2json
    # Returns the filename of the Blender addon. Useful for running the addon via CLI
    # i.e.
    #   blender my-model.blend --python \`actions2json\` -- /var/tmp/output-file.json

  $ actions2json --help
    # Prints some help text on how to use this command

  $ actions2json --install
    # Installs and enables the addon and then saves it to your Blender user preferences
    # Note that you must have Blender in your $PATH in order for this command to work

Options

  -h, --help            -> Get help text about using the blender-actions-to-json CLI

  -i, --install         -> Install the addon and save it in your Blender

Note

blender-actions-to-json currently only exports actions for one armature.

This script currenly requires that your bpy.context.active_object is your armature.

blender-actions-to-json will use the first armature that it finds if the bpy.context.active_object is not an armature, so if your file only has one armature you're good to go.

Otherwise you will need either need to select your desired armature before running this script.

You can do this by either:

  1. Running an armature selection script before this script
  2. OR manually right click it while in object mode before running this script.

If you're looking to use this script as part of a fully automated pipeline, #2 is not an option and you will need to do #1.

You can chain blender scripts, so you can run blender my-model.blend --background --python my-script-that-selects-armature --python blender-actions-to-json.py -- ./outputfile.json

Again, all of this only applies if your Blender file has more than one armature. When I eventually work with files with multiple armatures I'll have a better idea of how to address this.

If any of this is confusing please open an issue and I'll try to give a better explanation based on your question(s)!

To test

In order to run the tests you'll need to have blender in your $PATH so that we can spawn a headless blender process from Node.js.

If Blender isn't already in your $PATH, on mac you can try export PATH="$PATH:/Applications/blender.app/Contents/MacOS" in your terminal

git clone https://github.com/chinedufn/blender-actions-to-json
cd blender-actions-to-json
npm install
npm run test

TODO:

  • Maybe support a -p, --precision flag to specify the number of decimal places that pose matrices are rounded to

See Also

License

MIT