Blender V3.6.23
SDK V1.5.7
Asobo MSFS gltf I/O toolkit V5.4.7 (from the SDK)
I’m trying to export an animation with Animation Mode set to “NLA tracks”, but when I try to export I get errors as shown below, and the export does not work. I’ve included a screenshot of the NLA editor and export settings also at the bottom of the post.
I noticed that this has been raised before but as far as I can see, the solution was to lock the editability of the NLA animations. I have tried this and the results were the same.
I did manage to get the export to work by setting the Animation Mode to “Actions”, but I believe that the correct method is to use “NLA Tracks” and to bake all animations - is that correct? Also, by using “Actions” I ended up with two objects in MSFS, one static and one animated. I’m not sure whether this is related to using “Actions” as the Animation Mode.
Any help greatly appreciated.
Below is an extract of the output from the export showing the errors:-
=====================================================
19:36:57 | INFO: Extracting primitive: Circle.233Switching to fully guarded memory allocator.
Blender 3.6.23 (hash e467db79ca8c built 2025-06-17 03:22:43)
Blender 3.6.23
Build: 2025-06-17 03:22:43 Windows Release
argv[0] = C:\Program Files\Blender Foundation\Blender 3.6\blender.exe
argv[1] = F:\References\DA20\99c26cb4dcf5.blend
argv[2] = --background
argv[3] = --addons
argv[4] = io_scene_gltf2_msfs_2024
argv[5] = --python-expr
argv[6] = try:
import bpy
import traceback
bpy.ops.msfs2024.multi_export_gltf(export_mode='PRESETS', called_in_subprocess=True)
except:
traceback.print_exc()
print(‘[SUBPROCESS][ERROR]’)
argv[7] = --debug
argv[8] = 0
Read prefs: “C:\Users\k_l_m\AppData\Roaming\Blender Foundation\Blender\3.6\config\userpref.blend”
Read blend: “F:\References\DA20\99c26cb4dcf5.blend”
scene set 00000136FD7B8068
Traceback (most recent call last):
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2_init_.py”, line 852, in execute
return gltf2_blender_export.save(context, export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_export.py”, line 34, in save
json, buffer = __export(export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_export.py”, line 51, in __export
__gather_gltf(exporter, export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_export.py”, line 65, in __gather_gltf
active_scene_idx, scenes, animations = gltf2_blender_gather.gather_gltf2(export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_gather.py”, line 32, in gather_gltf2
animations += gather_animations(export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\gltf2_blender_gather_animations.py”, line 21, in gather_animations
return gather_tracks_animations(export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\gltf2_blender_gather_tracks.py”, line 26, in gather_tracks_animations
animations_, merged_tracks = gather_track_animations(obj_uuid, merged_tracks, len(animations), export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\gltf2_blender_gather_tracks.py”, line 125, in gather_track_animations
animation = bake_animation(obj_uuid, track_name, export_settings, mode=on_type)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\gltf2_blender_gather_animation_utils.py”, line 169, in bake_animation
animation = gather_action_object_sampled(obj_uuid, None, animation_key, export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_action_sampled.py”, line 18, in gather_action_object_sampled
channels=__gather_channels(object_uuid, blender_action.name if blender_action else cache_key, export_settings),
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_action_sampled.py”, line 42, in __gather_channels
return gather_object_sampled_channels(object_uuid, blender_action_name, export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_channels.py”, line 32, in gather_object_sampled_channels
channel = gather_sampled_object_channel(
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_gather_cache.py”, line 35, in wrapper_cached
result = func(*args, **kwargs)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_channels.py”, line 61, in gather_sampled_object_channel
sampler = __gather_sampler(obj_uuid, channel, action_name, node_channel_is_animated, node_channel_interpolation, export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_channels.py”, line 104, in __gather_sampler
return gather_object_sampled_animation_sampler(
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_gather_cache.py”, line 35, in wrapper_cached
result = func(*args, **kwargs)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_sampler.py”, line 27, in gather_object_sampled_animation_sampler
keyframes = __gather_keyframes(
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_sampler.py”, line 62, in __gather_keyframes
keyframes = gather_object_sampled_keyframes(
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_gather_cache.py”, line 35, in wrapper_cached
result = func(*args, **kwargs)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_keyframes.py”, line 31, in gather_object_sampled_keyframes
mat = get_cache_data(
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_gather_cache.py”, line 97, in wrapper_objectcache
result = func(*args)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\gltf2_blender_gather_animation_sampling_cache.py”, line 100, in get_cache_data
if 'bone' not in data[obj_uuid][obj_uuid].keys():
KeyError: ‘e0907ede-925b-43fb-b730-af4e59f4605b’
Traceback (most recent call last):
File “C:\MSFS 2024 SDK\Tools\Blender\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py”, line 321, in export
gltf = self.export_blender_3_6(context, file_path, self.msfs_export_settings)
File “C:\MSFS 2024 SDK\Tools\Blender\addons\io_scene_gltf2_msfs_2024\io\exp\msfs_multi_export.py”, line 167, in export_blender_3_6
return bpy.ops.export_scene.gltf(
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\modules\bpy\ops.py”, line 113, in call
ret = _op_call(self.idname_py(), None, kw)
RuntimeError: Error: Python: Traceback (most recent call last):
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2_init_.py”, line 852, in execute
return gltf2_blender_export.save(context, export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_export.py”, line 34, in save
json, buffer = __export(export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_export.py”, line 51, in __export
__gather_gltf(exporter, export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_export.py”, line 65, in __gather_gltf
active_scene_idx, scenes, animations = gltf2_blender_gather.gather_gltf2(export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_gather.py”, line 32, in gather_gltf2
animations += gather_animations(export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\gltf2_blender_gather_animations.py”, line 21, in gather_animations
return gather_tracks_animations(export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\gltf2_blender_gather_tracks.py”, line 26, in gather_tracks_animations
animations_, merged_tracks = gather_track_animations(obj_uuid, merged_tracks, len(animations), export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\gltf2_blender_gather_tracks.py”, line 125, in gather_track_animations
animation = bake_animation(obj_uuid, track_name, export_settings, mode=on_type)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\gltf2_blender_gather_animation_utils.py”, line 169, in bake_animation
animation = gather_action_object_sampled(obj_uuid, None, animation_key, export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_action_sampled.py”, line 18, in gather_action_object_sampled
channels=__gather_channels(object_uuid, blender_action.name if blender_action else cache_key, export_settings),
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_action_sampled.py”, line 42, in __gather_channels
return gather_object_sampled_channels(object_uuid, blender_action_name, export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_channels.py”, line 32, in gather_object_sampled_channels
channel = gather_sampled_object_channel(
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_gather_cache.py”, line 35, in wrapper_cached
result = func(*args, **kwargs)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_channels.py”, line 61, in gather_sampled_object_channel
sampler = __gather_sampler(obj_uuid, channel, action_name, node_channel_is_animated, node_channel_interpolation, export_settings)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_channels.py”, line 104, in __gather_sampler
return gather_object_sampled_animation_sampler(
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_gather_cache.py”, line 35, in wrapper_cached
result = func(*args, **kwargs)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_sampler.py”, line 27, in gather_object_sampled_animation_sampler
keyframes = __gather_keyframes(
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_sampler.py”, line 62, in __gather_keyframes
keyframes = gather_object_sampled_keyframes(
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_gather_cache.py”, line 35, in wrapper_cached
result = func(*args, **kwargs)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\object\gltf2_blender_gather_object_keyframes.py”, line 31, in gather_object_sampled_keyframes
mat = get_cache_data(
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\gltf2_blender_gather_cache.py”, line 97, in wrapper_objectcache
result = func(*args)
File “C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\addons\io_scene_gltf2\blender\exp\animation\sampled\gltf2_blender_gather_animation_sampling_cache.py”, line 100, in get_cache_data
if 'bone' not in data[obj_uuid][obj_uuid].keys():
KeyError: ‘e0907ede-925b-43fb-b730-af4e59f4605b’
Location: C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\modules\bpy\ops.py:113
19:36:57 | INFO: Primitives created: 1
19:36:57 | INFO: Extracting primitive: Circle.234
19:36:57 | INFO: Primitives created: 1

