How to make 3D banner like a official 3DS game
This tutorial explains how to create a real Extended Banner for a Nintendo 3DS homebrew CIA: a banner containing a rotatable 3D model, an optional looping animation, a screen-facing logo, custom materials, and sound.
The workflow documented here was developed and hardware-tested while making the animated banner for ClouDS Music FA by myself. It also builds on the earlier static model workflow used by Super Mario 64 3DS Port Ultimate.
Most importantly, this guide documents a hardware compatibility problem which is easy to miss:
An animated banner that works in an emulator can still freeze a real 3DS HOME Menu.
In our tests, a normal soft-skinned skeletal animation rendered correctly in Azahar, but selecting the title on real hardware immediately froze the HOME Menu. The reliable solution was to use rigid mesh-node TRS animation, matching the structure found in official Extended Banners.
============================================================
1. WHAT AN EXTENDED BANNER CONTAINS
============================================================
A complete CIA with a 3D Extended Banner contains:
1. An SMDH with the “extendedbanner” flag
2. A CGFX/BCRES 3D scene
3. Optional banner audio
4. A BNR container created with bannertool
5. The application ELF, ExHeader/RSF, RomFS, icon, and banner packed by makerom
The complete path looks like this:
Blender model or glTF scene
Clean rigid node animation
pycgfx converts glTF to CGFX
Patch CGFX-only properties
banner.cgfx + audio.wav
bannertool creates application.bnr
makerom creates application.cia
A .3dsx can still launch through the Homebrew Launcher, but the HOME Menu Extended Banner belongs to the installed CIA version.
============================================================
1A. THE REQUIRED “COMMON” NAME
============================================================
The final main CMDL model entry inside the banner CGFX must be named exactly:
COMMON
Use uppercase letters. Treat this name as a required part of the HOME Menu banner convention, not as an arbitrary example name.
This requirement appeared in the early Every File Explorer banner workflow. That workflow asked the creator to:
• Merge the static banner into one object
• Name the object “COMMON”
• Name the UV map “COMMON”
• Enter “COMMON” again when Every File Explorer asks for the CGFX model name
The modern pycgfx workflow handles this slightly differently. pycgfx creates the final CMDL model entry as “COMMON” automatically, and it also names the generated skeletal CANM animation “COMMON”. Therefore, individual rigid mesh nodes are allowed to have descriptive names such as “body”, “headphones”, or “logo”.
For a clear and portable Blender hierarchy, use:
COMMON
├── world
└── name
In this hierarchy:
• COMMON is the top-level scene root used by the banner source
• world is the rotating model root
• name is an optional independent billboard logo
With the ClouDS Music FA scripts, the top-level Blender Empty is also named “COMMON”. The converter then writes the final CGFX CMDL model and CANM animation using the same required name.
Do not rename the final CMDL to “world”. “world” is only a node inside the COMMON model.
There are three uses of the word “common” which should not be confused:
1. The common CGFX slot in the CBMD header
This is the default model used when no region/language-specific CGFX is present.
2. The COMMON CMDL model inside the CGFX
This is the main 3D model entry used by the HOME Menu and is the naming rule relevant to model conversion.
3. The COMMON CANM animation
For an animated banner, this is the skeletal/node animation entry associated with the model.
Older tutorials also recommended material and texture names such as COMMON1, COMMON2, or commonXX. Those names are useful for compatibility with older tools and official-style language texture replacement, but they are not the same thing as the required main CMDL name.
If you use the old OBJ + Every File Explorer method, follow all of its COMMON naming steps exactly.
If you use pycgfx, verify the converted file rather than assuming the source object name alone is enough:
Models DICT:
COMMON
Skeletal Animations DICT, if animation is present:
COMMON
Skeleton/node hierarchy:
Contains the expected world, logo, and rigid animated mesh nodes
============================================================
2. REQUIRED TOOLS
============================================================
You will need:
• Blender
• Python 3
• skyfloogle/pycgfx
• gltflib
• Pillow
• bannertool
• makerom
• devkitARM and the normal tools required to build your application
• Your model, textures, logo, and optional audio
The final ClouDS Music FA banner was built with Blender 5.1.2 and this pycgfx revision:
https://github.com/skyfloogle/pycgfx
Commit:
1f78850086f3a77c41e07162e842f97a5bf3c18a
Example setup:
git clone https://github.com/skyfloogle/pycgfx.git .tools/pycgfx
git -C .tools/pycgfx checkout 1f78850086f3a77c41e07162e842f97a5bf3c18a
python3 -m venv .tools/pycgfx/.venv
.tools/pycgfx/.venv/bin/pip install gltflib pillow
Other Blender or pycgfx versions may also work, but import/export behavior and animation APIs can change.
pycgfx includes a useful HOME Menu camera reference glTF. Importing that reference into Blender makes it much easier to judge scale and safe areas before conversion.
Keep the final CGFX below 512 KiB. The finished ClouDS Music FA CGFX is approximately 331 KiB.
Historical note:
The 2016 Every File Explorer tutorial used OBJ + MTL and imposed several restrictions: one merged object, one texture, no alpha, and COMMON naming for the object and UV map. The COMMON model name remains important, but the one-object, one-texture, and no-alpha restrictions were limitations of that older workflow. Modern pycgfx banners can use multiple rigid mesh nodes, multiple textures, animation, and tested alpha-masked materials.
============================================================
2A. FROM A PAPER BANNER TO AN ADVANCED BANNER
============================================================
Not every project needs to begin with animation. It is useful to treat 3DS banners as a series of levels. Start with the simplest level that proves your packaging works, then add one feature at a time.
LEVEL 0 — A 2D “PAPER” BANNER
The simplest custom banner is a flat 256 × 128 PNG. It does not require you to author a custom CGFX model.
Prepare:
• A 256 × 128 PNG banner image
• An optional short banner WAV
• A 48 × 48 PNG icon for the SMDH
Create the banner:
bannertool makebanner \
-i banner.png \
-a audio.wav \
-o application.bnr
Create the SMDH:
bannertool makesmdh \
-s "Short title" \
-l "Long title" \
-p "Publisher" \
-i icon.png \
-o application.smdh
Some older guides used a WAV of no more than approximately three seconds, 16-bit PCM, 44100 Hz, stereo. Follow the requirements of the bannertool build you are using.
This level is ideal for verifying the SMDH, banner sound, Title ID, RSF, makerom command, and HOME Menu cache behavior before introducing a 3D scene.
LEVEL 1 — ONE 3D MODEL ROTATED BY THE HOME MENU
This is the classic early homebrew 3D banner. There is only one static model. You do not author an animation: the HOME Menu presents and rotates the model for you.
Legacy Every File Explorer method:
1. Merge the visible scene into one object
2. Triangulate the mesh
3. Name the object COMMON
4. Name the UV map COMMON
5. Export OBJ + MTL
6. In Every File Explorer, choose:
File
New from File
Nintendo 3DS Plugin
CTR Graphics (CGFX)
7. Select the OBJ and enter COMMON as the model name
8. Save the result as banner.cgfx
9. Inspect it in Ohana3DS Rebirth before packaging
The old converter generally expected one object and one texture and did not reliably support alpha. Those are converter limitations, not universal limits of the 3DS banner format.
Modern pycgfx equivalent:
1. Create a static Blender scene
2. Use COMMON as the scene root
3. Export glTF or GLB
4. Convert it:
.tools/pycgfx/.venv/bin/python \
.tools/pycgfx/main.py \
input-model.gltf \
banner.cgfx
5. Confirm that the final CMDL entry is named COMMON
Package either 3D result with:
bannertool makebanner \
-ci banner.cgfx \
-a audio.wav \
-o application.bnr
This produces the familiar beginner banner in which the complete model is carried around by the HOME Menu renderer. Design every side of it, because the rear and profile will become visible.
LEVEL 2 — MODEL, STATIC BACKGROUND, AND FIXED LOGO
A background does not need a special file type. It may simply be additional scene geometry:
• A ground plane
• A stage
• A sky dome
• A large textured backdrop
• Decorative objects behind the main subject
Its parent determines how it behaves:
COMMON
├── world
│ ├── main_model
│ └── rotating_background
├── independent_background
└── name
Anything parented under world follows the HOME Menu rotation with the main scene. A background placed as a sibling of world can have an independent transform or animation. A screen-facing backdrop may use a carefully oriented plane and an appropriate billboard mode, but it still needs correct depth, alpha, and safe-area testing.
The logo can be a separate plane named name, placed outside world, and patched to YAxial billboard mode 5. This keeps it facing the viewer while the main model rotates.
Large transparent backgrounds can be expensive and may expose sorting artifacts. Keep texture resolution, transparent overdraw, and total CGFX size conservative.
LEVEL 3 — RIGID NODE ANIMATION
Once the static scene works, animate rigid mesh nodes using ordinary Transform (5) translation, rotation, and scale members.
The same method works for:
• A character or mascot moving to the music
• Headphones rocking independently
• Decorative equalizer pieces
• A floating stage
• Geometry used as a moving background
Therefore, if the “background” is a mesh, moving it is not fundamentally different from moving the foreground model. Parent and animate it intentionally so it does not appear to fly away with the wrong pivot.
Do not confuse this with soft skinning. The safe hardware-tested workflow in this guide bakes the visible pose into rigid mesh-node animation.
LEVEL 4 — MATERIAL OR TEXTURE-ANIMATED BACKGROUNDS
Some community banners appear to animate the image inside a background instead of moving the background mesh itself. A scrolling starfield is the obvious example: the plane can stay still while its texture coordinates, material parameters, or texture selection change.
A well-known community example is the BootNTR / BootNTR Selector rocket banner. Its starfield has been observed moving behind the rocket. That is evidence that this class of effect exists in released 3DS software.
However, we have not personally reconstructed and hardware-tested the exact BootNTR material animation. Do not treat the following as a proven copy-and-paste recipe.
CGFX material animation has paths associated with texture coordinators, including concepts equivalent to:
• Texture scale
• Texture rotation
• Texture translation
• Texture or image switching
In principle, a starfield can scroll by changing texture coordinates while its geometry remains fixed. This is likely a better fit than physically moving a giant background plane through the scene.
At the time of writing, the pycgfx workflow used for ClouDS Music FA does not provide a finished, validated glTF authoring path for this exact effect. Implementing it may require:
1. Extracting and inspecting a known-good banner
2. Studying its CGFX material CANM entries
3. Extending the converter or patching the generated CGFX
4. Testing in an emulator
5. Testing again on real hardware
Treat texture-animated backgrounds as an advanced research direction. If you publish a working implementation, document the exact CANM members and hardware results so the community can turn this known example into a reproducible workflow.
============================================================
3. DESIGNING THE SCENE
============================================================
The HOME Menu rotates the banner model, so do not design only for the front view.
Check all of the following:
• Front, side, and rear silhouettes
• A sensible rotation origin
• Enough space above the model for HOME Menu information
• Enough space below the model for the camera and L + R hints
• No logo, head, or decoration leaving the visible safe area during rotation
• Correct face normals
• Correct UV orientation
• Texture sizes suitable for 3DS memory
• An intentional parent for every background element
• Acceptable depth ordering and alpha sorting on large backdrops
Prefer:
• Simple diffuse materials
• A small number of material slots
• Conservative texture resolution
• Alpha masking for transparent logo edges
• Matte or restrained highlights
Avoid making the model’s identity depend on desktop-style PBR reflections. The 3DS HOME Menu lighting and TEV stages can make a material look very different from Blender.
Do not aggressively decimate a model just because the HOME Menu slows down. In our tests, the complete higher-detail model performed correctly after the animation format was fixed, while destructive decimation introduced cracks and missing surfaces.
============================================================
4. STATIC BANNERS AND ANIMATED BANNERS
============================================================
If your banner is static, the process is relatively simple:
1. Build and position the scene in Blender
2. Export a clean glTF
3. Convert it with pycgfx
4. Apply any required CGFX-only flags
5. Package it into the BNR and CIA
For an animated banner, the final animation structure matters much more.
There are two very different animation approaches:
A. Soft-skinned skeletal animation
Vertices contain bone indices and bone weights. A skeleton deforms the mesh every frame.
B. Rigid mesh-node animation
Each moving mesh node remains rigid. The animation changes only its translation, rotation, and scale.
Blender can use either method while you are creating the animation. However, the final hardware-safe banner should use method B.
============================================================
5. THE MOST IMPORTANT HARDWARE RULE
============================================================
Use bones as an authoring rig if you want, but do not leave soft skinning in the final CGFX.
The final animated nodes should use ordinary Transform (5) CANM members containing only:
• Translation
• Rotation
• Scale
The following must agree with one another:
• The final CMDL model and animation group name COMMON
• glTF animation target names
• CGFX skeleton/node names
• SOBJ mesh_node_name values
• CANM member names
The final primitive sets should have:
skinning_mode == 0
The final vertex streams should not contain:
JOINTS_0
JOINTS_1
WEIGHTS_0
WEIGHTS_1
Deleting only the Armature object is not enough. If bone indices or weights remain in the exported vertex data, the banner is still not a clean rigid animation.
============================================================
6. CONVERTING A BLENDER RIG INTO RIGID NODE ANIMATION
============================================================
If your source animation already moves separate rigid objects, you can skip most of this section.
If your source animation uses an armature and deforming skin, use the armature only as a creative tool and bake the result:
1. Finish the animation in Blender
2. Choose the base pose which will become the final rigid mesh
3. Apply the deformed pose to the full-resolution mesh
4. Split the parts which need independent motion into separate mesh objects
5. Sample the required bone motion for every frame
6. Transfer that motion to each rigid mesh object as TRS keyframes
7. Remove Armature modifiers
8. Remove armature parenting
9. Remove vertex groups
10. Export glTF and verify that no JOINTS or WEIGHTS attributes remain
For example, the ClouDS Music character was authored with an upper-body rig. In the exported banner, the cloud body, front decorations, and headphones are three rigid mesh nodes. They share sampled upper-body motion but contain no skinning data.
This gives the appearance of a natural animated character while using the simpler structure accepted by real HOME Menu hardware.
Do not reduce the mesh resolution during this conversion unless it is genuinely necessary. Bake the original triangles, UVs, and normals first.
============================================================
7. ANIMATION TIMING AND LOOPING
============================================================
Set the animation range explicitly.
Blender may keep its default ending at frame 250 even if your real animation ends much earlier. If that empty tail is exported, the model may move once and then remain still for several seconds before looping.
Recommended setup:
• Set the intended FPS explicitly
• Set the exact first frame
• Set the exact final frame
• Make the first and final poses loop cleanly
• Add a short intentional rest near the end if the animation needs breathing room
• Remove all unused timeline tail frames
• When previewing, avoid displaying identical first and last frames twice
The ClouDS Music FA animation uses:
30 FPS
36 frames
Approximately 1.2 seconds per loop
Its character rises slightly, settles, sways from side to side, and includes a short resting section. This is only one example; the same rigid animation method works for many other motions.
============================================================
8. ADDING A LOGO THAT ALWAYS FACES THE CAMERA
============================================================
A normal logo plane placed under the rotating model root will rotate with the model. At the rear view it will appear mirrored.
Official-style banners can solve this with a billboard node.
glTF does not have a field for the CGFX billboard mode, so this requires two stages:
1. Create a separate logo plane in Blender
2. After conversion, set its corresponding CGFX bone/node to YAxial billboard mode, value 5
A useful hierarchy is:
COMMON
├── world Rotating main model
└── name Independent screen-facing logo
The logo must be a sibling of the rotating model root, not its child.
For the most reliable result:
• Position, rotate, and scale the logo correctly in Blender
• Bake the full visual transform into the plane vertices
• Leave the logo node itself with an identity transform
• Apply YAxial (5) billboarding to that identity node after conversion
Why bake the transform into the vertices?
If the logo node still contains Blender’s plane rotation, the HOME Menu billboard transform may rotate it a second time. The result is often a logo that becomes a thin vertical line.
If the logo is mirrored or upside down, fix the plane normal and UV orientation. Do not stack corrective rotations onto the billboard node.
============================================================
9. CONVERTING glTF TO CGFX
============================================================
The ClouDS Music FA repository contains three reference scripts:
tools/banner/create_rhythm_animation.py
tools/banner/build_banner_scene.py
tools/banner/convert_banner_cgfx.py
Repository:
https://github.com/Epic0522/ClouDS-Music-FA
These scripts are reference implementations, not universal one-click converters. Adapt them to the structure and names used by your own model.
At minimum, review and replace:
• MESH_NAMES or RIGID_ANIMATED_MESHES
• Source armature and bone names
• Model scale and vertical position
• HOME Menu safe-area values
• Logo dimensions, depth, node name, and texture
• Animation FPS, first frame, and final frame
• The list of TRS channels which should survive
• Material correction rules
Example Blender command for creating or preparing the source animation:
BLENDER=blender
"$BLENDER" --background --factory-startup \
--python tools/banner/create_rhythm_animation.py -- \
input-model.gltf output-directory
On macOS, Blender may be located here:
/Applications/Blender.app/Contents/MacOS/Blender
Example command for assembling the model and logo, and baking the authored skin motion into rigid mesh-node motion:
"$BLENDER" --background --factory-startup \
--python tools/banner/build_banner_scene.py -- \
output-directory/clouds-banner-rhythm.gltf \
path/to/logo.png \
banner-scene.gltf
Example conversion command:
.tools/pycgfx/.venv/bin/python \
tools/banner/convert_banner_cgfx.py \
banner-scene.gltf banner.cgfx
The reference converter performs several important post-conversion operations:
• Writes mesh_node_name for every SOBJ mesh
• Sets the logo node to YAxial (5) billboard mode
• Rejects soft skinning
• Rejects bone-index and bone-weight streams
• Confirms that the expected animation members are ordinary Transform (5) members
• Removes excessive specular behavior produced by generic PBR conversion
If your project uses different node names, change the hard-coded names before running it.
============================================================
10. MATERIALS AND THE “WASHED OUT” PROBLEM
============================================================
A model can look correct in Blender and still turn almost white when it faces the HOME Menu light.
pycgfx’s generic PBR conversion may create a strong white specular contribution. This can wash out both the main model and a fixed logo.
The safe correction is usually:
• Keep diffuse lighting
• Reduce or bypass the specular TEV stage
• Remove unnecessary specular distribution lookup data
• Use matte material values
Do not blindly delete all lighting. Diffuse shading helps the model retain its shape as it rotates.
If only one material is affected, correct that material rather than globally flattening the entire scene.
============================================================
11. CREATING THE SMDH
============================================================
Create the SMDH with bannertool:
bannertool makesmdh \
-s "Short title" \
-l "Long description" \
-p "Publisher" \
-f "visible,allow3d,recordusage,extendedbanner" \
-i icon.png \
-o application.smdh
The extendedbanner flag is required.
Without it, the CIA may contain the 3D scene but the HOME Menu will not treat it as an Extended Banner.
============================================================
12. ADDING BANNER AUDIO
============================================================
Banner audio is optional.
For the tested bannertool workflow, prepare:
• 44.1 kHz
• 16-bit
• Stereo PCM WAV
• No longer than 3 seconds
Then create the banner container:
bannertool makebanner \
-ci banner.cgfx \
-a audio.wav \
-o application.bnr
If you do not want audio, consult the bannertool version you are using for its supported no-audio invocation.
============================================================
13. BUILDING THE CIA
============================================================
Example makerom command:
makerom -f cia -target t -exefslogo \
-o application.cia \
-elf application.elf \
-rsf application.rsf \
-icon application.smdh \
-banner application.bnr \
-DAPP_ROMFS=/absolute/path/to/romfs \
-major 1 -minor 0 -micro 0
Adjust the RSF, RomFS path, program version, title metadata, and application files for your project.
============================================================
14. VALIDATION ORDER
============================================================
Do not jump directly from Blender to a public CIA.
Use this order:
1. Blender
Check the model, loop, UVs, normals, rotation center, logo, and safe area.
2. Exported glTF
Check that only the intended nodes and animation channels remain. Search the mesh attributes for JOINTS and WEIGHTS.
3. Converted CGFX
Check that:
• The file is below 512 KiB
• The main CMDL model is named exactly COMMON
• The CANM animation is named COMMON when animation is present
• Primitive sets use skinning mode 0
• No bone-index or bone-weight streams exist
• Every SOBJ has the correct mesh_node_name
• The logo is YAxial billboard mode 5
• Animated members are ordinary Transform (5)
4. Azahar HOME Menu
Install the CIA, restart the emulator, and inspect several complete rotations and animation loops.
5. Real hardware
Install the CIA on a CFW 3DS. Leave the cursor on the title, rotate the banner, enter and exit the application, move away from the title, and return to it repeatedly.
6. More than one model of 3DS
When possible, test on both Old and New 3DS hardware.
Emulator success is not final proof. The real HOME Menu is the compatibility target.
============================================================
15. HOME MENU CACHE
============================================================
The HOME Menu caches banners.
After installing an updated CIA, you may still see the previous model, animation, logo, or material.
Try:
• Restarting the emulator
• Restarting the real console
• Uninstalling the old title and reinstalling it
• Temporarily using a different Title ID during development
Do not assume the conversion failed until the cache has been ruled out.
============================================================
16. TROUBLESHOOTING
============================================================
Problem:
The banner works in Azahar, but selecting it freezes a real 3DS.
Likely cause:
Soft skinning, bone indices, or bone weights remain in the final CGFX.
Fix:
Convert the motion to rigid mesh-node TRS animation. Validate skinning_mode and vertex attributes before writing the file.
Problem:
The model moves once, then waits several seconds.
Likely cause:
Blender exported the default empty timeline up to frame 250.
Fix:
Set the exact scene end frame and remove the unused tail.
Problem:
The logo rotates with the model.
Likely cause:
The logo is a child of the rotating model root.
Fix:
Move it to a separate root-level sibling and enable Y-axis billboarding.
Problem:
The logo becomes a thin line.
Likely cause:
The plane rotation is being combined with the billboard rotation.
Fix:
Bake the visual transform into the vertices and leave the billboard node at identity.
Problem:
The logo is mirrored or upside down.
Likely cause:
Incorrect face normal or UV direction.
Fix:
Correct the plane orientation and flip only the necessary UV axis.
Problem:
The model or logo turns white when facing forward.
Likely cause:
Excessive specular contribution from the converted PBR material.
Fix:
Reduce the specular TEV stage and use a simpler matte material while keeping useful diffuse shading.
Problem:
The model leaves the visible area.
Likely cause:
The scene was composed using only the Blender camera and did not reserve space for HOME Menu UI.
Fix:
Use the HOME Menu reference camera and reduce the total scale.
Problem:
The model contains cracks or holes.
Likely cause:
Aggressive decimation, broken topology, or incorrect normals.
Fix:
Return to the complete mesh and inspect topology, faces, normals, and textures separately.
Problem:
A transparent logo has a solid rectangle around it.
Likely cause:
Alpha mode or cutoff was lost during conversion.
Fix:
Use alpha masking and inspect the final CGFX material state.
Problem:
The newly installed CIA still shows an old banner.
Likely cause:
HOME Menu cache.
Fix:
Restart, reinstall, or temporarily change the Title ID.
Problem:
The background rotates or flies around when it should remain behind the subject.
Likely cause:
The background is parented under world, has the wrong pivot, or inherited the main model transform.
Fix:
Choose the hierarchy intentionally. Keep rotating scene geometry under world; place independent or screen-facing background nodes beside world under COMMON. Bake transforms and inspect every angle.
Problem:
A transparent background sorts incorrectly or produces visible layers.
Likely cause:
Excessive alpha overdraw, incorrect depth state, or ambiguous draw order.
Fix:
Reduce overlapping transparent surfaces, prefer opaque or alpha-masked geometry where possible, and inspect the final CGFX material state.
Problem:
A texture or material animation works in an emulator but is unstable on real hardware.
Likely cause:
The generated CANM/material members do not match the subset expected by the HOME Menu renderer.
Fix:
Compare the structure with a known-good banner and test each material animation member separately on hardware. Do not release an emulator-only result as verified.
============================================================
17. REFERENCE STRUCTURE FROM CLOUDS MUSIC FA
============================================================
The working ClouDS Music FA banner uses:
Scene root:
COMMON
Rotating model root:
world
Fixed screen-facing logo:
name
Rigid animated meshes:
Cloud_Textured
Front_Decorations
Headphones
Animation:
Ordinary Transform (5) CANM members only
Timing:
30 FPS
36 frames
Approximately 1.2 seconds
Final CGFX:
Approximately 331 KiB
The source rig exists only during Blender authoring. The final CGFX contains no soft skin.
============================================================
18. FINAL CHECKLIST
============================================================
Before releasing your CIA, verify every item:
□ The SMDH contains extendedbanner
□ The CGFX is below 512 KiB
□ The final CMDL model is named exactly COMMON
□ The final CANM animation is named COMMON when animation is present
□ The model stays inside the HOME Menu safe area
□ The rotation center looks correct
□ Front, side, and rear views are acceptable
□ The logo is not a child of the rotating root
□ The logo uses YAxial billboard mode 5
□ The billboard node has an identity transform
□ No JOINTS or WEIGHTS data remains
□ Every primitive set uses skinning mode 0
□ Every animated member is ordinary Transform (5)
□ The animation end frame is explicit
□ The loop has no accidental multi-second pause
□ Every background is parented under world or COMMON intentionally
□ Large backdrops do not create excessive alpha overdraw
□ Experimental texture/material animation is clearly distinguished from hardware-tested steps
□ Materials do not wash out under HOME Menu lighting
□ Alpha-masked textures work
□ Audio is in a supported format and duration
□ The new banner is visible after clearing HOME Menu cache
□ The banner has been tested on real hardware
============================================================
19. CLOSING NOTES
============================================================
The main lesson is simple:
The 3DS HOME Menu can display a surprisingly rich animated 3D banner, but its safe animation path is not the same as a modern desktop glTF renderer.
Use Blender bones to create the motion if that is convenient, then bake the visible result into rigid mesh-node translation, rotation, and scale. Keep the screen-facing logo independent, patch the CGFX properties which glTF cannot represent, validate the final binary, and always test on real hardware.
Once those rules are followed, a homebrew title can have a rotatable, animated, sound-enabled banner that feels much closer to official Nintendo 3DS software.
Reference projects:
ClouDS Music FA
https://github.com/Epic0522/ClouDS-Music-FA
Super Mario 64 3DS Port Ultimate
https://github.com/Epic0522/Super-Mario-64-3ds-port---Ultimate
pycgfx
https://github.com/skyfloogle/pycgfx
Historical Every File Explorer tutorial
This guide will only go over the basic way of doing it because the other way involves using the NW4C, but you can still make some cool banners. The steps during this can get confusing, and I'm trying to make them clear, but I don't expect you to be that guy and learn to model and make banners in one day. If it put something in this guide that shouldn't be there(Such as links to illegal stuff(wich there...
Bannertool 2D banner example
BootNTR Selector banner release
https://github.com/Nanquitas/BootNTR/releases/tag/v2.13.3
CBMD format documentation
https://3dbrew.org/wiki/CBMD
The workflow documented here was developed and hardware-tested while making the animated banner for ClouDS Music FA by myself. It also builds on the earlier static model workflow used by Super Mario 64 3DS Port Ultimate.
Most importantly, this guide documents a hardware compatibility problem which is easy to miss:
An animated banner that works in an emulator can still freeze a real 3DS HOME Menu.In our tests, a normal soft-skinned skeletal animation rendered correctly in Azahar, but selecting the title on real hardware immediately froze the HOME Menu. The reliable solution was to use rigid mesh-node TRS animation, matching the structure found in official Extended Banners.
============================================================
1. WHAT AN EXTENDED BANNER CONTAINS
============================================================
A complete CIA with a 3D Extended Banner contains:
1. An SMDH with the “extendedbanner” flag
2. A CGFX/BCRES 3D scene
3. Optional banner audio
4. A BNR container created with bannertool
5. The application ELF, ExHeader/RSF, RomFS, icon, and banner packed by makerom
The complete path looks like this:
Blender model or glTF scene
Clean rigid node animation
pycgfx converts glTF to CGFX
Patch CGFX-only properties
banner.cgfx + audio.wav
bannertool creates application.bnr
makerom creates application.ciaA .3dsx can still launch through the Homebrew Launcher, but the HOME Menu Extended Banner belongs to the installed CIA version.
============================================================
1A. THE REQUIRED “COMMON” NAME
============================================================
The final main CMDL model entry inside the banner CGFX must be named exactly:
COMMON
Use uppercase letters. Treat this name as a required part of the HOME Menu banner convention, not as an arbitrary example name.
This requirement appeared in the early Every File Explorer banner workflow. That workflow asked the creator to:
• Merge the static banner into one object
• Name the object “COMMON”
• Name the UV map “COMMON”
• Enter “COMMON” again when Every File Explorer asks for the CGFX model name
The modern pycgfx workflow handles this slightly differently. pycgfx creates the final CMDL model entry as “COMMON” automatically, and it also names the generated skeletal CANM animation “COMMON”. Therefore, individual rigid mesh nodes are allowed to have descriptive names such as “body”, “headphones”, or “logo”.
For a clear and portable Blender hierarchy, use:
COMMON
├── world
└── name
In this hierarchy:
• COMMON is the top-level scene root used by the banner source
• world is the rotating model root
• name is an optional independent billboard logo
With the ClouDS Music FA scripts, the top-level Blender Empty is also named “COMMON”. The converter then writes the final CGFX CMDL model and CANM animation using the same required name.
Do not rename the final CMDL to “world”. “world” is only a node inside the COMMON model.
There are three uses of the word “common” which should not be confused:
1. The common CGFX slot in the CBMD header
This is the default model used when no region/language-specific CGFX is present.
2. The COMMON CMDL model inside the CGFX
This is the main 3D model entry used by the HOME Menu and is the naming rule relevant to model conversion.
3. The COMMON CANM animation
For an animated banner, this is the skeletal/node animation entry associated with the model.
Older tutorials also recommended material and texture names such as COMMON1, COMMON2, or commonXX. Those names are useful for compatibility with older tools and official-style language texture replacement, but they are not the same thing as the required main CMDL name.
If you use the old OBJ + Every File Explorer method, follow all of its COMMON naming steps exactly.
If you use pycgfx, verify the converted file rather than assuming the source object name alone is enough:
Models DICT:
COMMON
Skeletal Animations DICT, if animation is present:
COMMON
Skeleton/node hierarchy:
Contains the expected world, logo, and rigid animated mesh nodes
============================================================
2. REQUIRED TOOLS
============================================================
You will need:
• Blender
• Python 3
• skyfloogle/pycgfx
• gltflib
• Pillow
• bannertool
• makerom
• devkitARM and the normal tools required to build your application
• Your model, textures, logo, and optional audio
The final ClouDS Music FA banner was built with Blender 5.1.2 and this pycgfx revision:
https://github.com/skyfloogle/pycgfx
Commit:
1f78850086f3a77c41e07162e842f97a5bf3c18a
Example setup:
git clone https://github.com/skyfloogle/pycgfx.git .tools/pycgfx
git -C .tools/pycgfx checkout 1f78850086f3a77c41e07162e842f97a5bf3c18a
python3 -m venv .tools/pycgfx/.venv
.tools/pycgfx/.venv/bin/pip install gltflib pillow
Other Blender or pycgfx versions may also work, but import/export behavior and animation APIs can change.
pycgfx includes a useful HOME Menu camera reference glTF. Importing that reference into Blender makes it much easier to judge scale and safe areas before conversion.
Keep the final CGFX below 512 KiB. The finished ClouDS Music FA CGFX is approximately 331 KiB.
Historical note:
The 2016 Every File Explorer tutorial used OBJ + MTL and imposed several restrictions: one merged object, one texture, no alpha, and COMMON naming for the object and UV map. The COMMON model name remains important, but the one-object, one-texture, and no-alpha restrictions were limitations of that older workflow. Modern pycgfx banners can use multiple rigid mesh nodes, multiple textures, animation, and tested alpha-masked materials.
============================================================
2A. FROM A PAPER BANNER TO AN ADVANCED BANNER
============================================================
Not every project needs to begin with animation. It is useful to treat 3DS banners as a series of levels. Start with the simplest level that proves your packaging works, then add one feature at a time.
LEVEL 0 — A 2D “PAPER” BANNER
The simplest custom banner is a flat 256 × 128 PNG. It does not require you to author a custom CGFX model.
Prepare:
• A 256 × 128 PNG banner image
• An optional short banner WAV
• A 48 × 48 PNG icon for the SMDH
Create the banner:
bannertool makebanner \
-i banner.png \
-a audio.wav \
-o application.bnr
Create the SMDH:
bannertool makesmdh \
-s "Short title" \
-l "Long title" \
-p "Publisher" \
-i icon.png \
-o application.smdh
Some older guides used a WAV of no more than approximately three seconds, 16-bit PCM, 44100 Hz, stereo. Follow the requirements of the bannertool build you are using.
This level is ideal for verifying the SMDH, banner sound, Title ID, RSF, makerom command, and HOME Menu cache behavior before introducing a 3D scene.
LEVEL 1 — ONE 3D MODEL ROTATED BY THE HOME MENU
This is the classic early homebrew 3D banner. There is only one static model. You do not author an animation: the HOME Menu presents and rotates the model for you.
Legacy Every File Explorer method:
1. Merge the visible scene into one object
2. Triangulate the mesh
3. Name the object COMMON
4. Name the UV map COMMON
5. Export OBJ + MTL
6. In Every File Explorer, choose:
File
New from File
Nintendo 3DS Plugin
CTR Graphics (CGFX)7. Select the OBJ and enter COMMON as the model name
8. Save the result as banner.cgfx
9. Inspect it in Ohana3DS Rebirth before packaging
The old converter generally expected one object and one texture and did not reliably support alpha. Those are converter limitations, not universal limits of the 3DS banner format.
Modern pycgfx equivalent:
1. Create a static Blender scene
2. Use COMMON as the scene root
3. Export glTF or GLB
4. Convert it:
.tools/pycgfx/.venv/bin/python \
.tools/pycgfx/main.py \
input-model.gltf \
banner.cgfx
5. Confirm that the final CMDL entry is named COMMON
Package either 3D result with:
bannertool makebanner \
-ci banner.cgfx \
-a audio.wav \
-o application.bnr
This produces the familiar beginner banner in which the complete model is carried around by the HOME Menu renderer. Design every side of it, because the rear and profile will become visible.
LEVEL 2 — MODEL, STATIC BACKGROUND, AND FIXED LOGO
A background does not need a special file type. It may simply be additional scene geometry:
• A ground plane
• A stage
• A sky dome
• A large textured backdrop
• Decorative objects behind the main subject
Its parent determines how it behaves:
COMMON
├── world
│ ├── main_model
│ └── rotating_background
├── independent_background
└── name
Anything parented under world follows the HOME Menu rotation with the main scene. A background placed as a sibling of world can have an independent transform or animation. A screen-facing backdrop may use a carefully oriented plane and an appropriate billboard mode, but it still needs correct depth, alpha, and safe-area testing.
The logo can be a separate plane named name, placed outside world, and patched to YAxial billboard mode 5. This keeps it facing the viewer while the main model rotates.
Large transparent backgrounds can be expensive and may expose sorting artifacts. Keep texture resolution, transparent overdraw, and total CGFX size conservative.
LEVEL 3 — RIGID NODE ANIMATION
Once the static scene works, animate rigid mesh nodes using ordinary Transform (5) translation, rotation, and scale members.
The same method works for:
• A character or mascot moving to the music
• Headphones rocking independently
• Decorative equalizer pieces
• A floating stage
• Geometry used as a moving background
Therefore, if the “background” is a mesh, moving it is not fundamentally different from moving the foreground model. Parent and animate it intentionally so it does not appear to fly away with the wrong pivot.
Do not confuse this with soft skinning. The safe hardware-tested workflow in this guide bakes the visible pose into rigid mesh-node animation.
LEVEL 4 — MATERIAL OR TEXTURE-ANIMATED BACKGROUNDS
Some community banners appear to animate the image inside a background instead of moving the background mesh itself. A scrolling starfield is the obvious example: the plane can stay still while its texture coordinates, material parameters, or texture selection change.
A well-known community example is the BootNTR / BootNTR Selector rocket banner. Its starfield has been observed moving behind the rocket. That is evidence that this class of effect exists in released 3DS software.
However, we have not personally reconstructed and hardware-tested the exact BootNTR material animation. Do not treat the following as a proven copy-and-paste recipe.
CGFX material animation has paths associated with texture coordinators, including concepts equivalent to:
• Texture scale
• Texture rotation
• Texture translation
• Texture or image switching
In principle, a starfield can scroll by changing texture coordinates while its geometry remains fixed. This is likely a better fit than physically moving a giant background plane through the scene.
At the time of writing, the pycgfx workflow used for ClouDS Music FA does not provide a finished, validated glTF authoring path for this exact effect. Implementing it may require:
1. Extracting and inspecting a known-good banner
2. Studying its CGFX material CANM entries
3. Extending the converter or patching the generated CGFX
4. Testing in an emulator
5. Testing again on real hardware
Treat texture-animated backgrounds as an advanced research direction. If you publish a working implementation, document the exact CANM members and hardware results so the community can turn this known example into a reproducible workflow.
============================================================
3. DESIGNING THE SCENE
============================================================
The HOME Menu rotates the banner model, so do not design only for the front view.
Check all of the following:
• Front, side, and rear silhouettes
• A sensible rotation origin
• Enough space above the model for HOME Menu information
• Enough space below the model for the camera and L + R hints
• No logo, head, or decoration leaving the visible safe area during rotation
• Correct face normals
• Correct UV orientation
• Texture sizes suitable for 3DS memory
• An intentional parent for every background element
• Acceptable depth ordering and alpha sorting on large backdrops
Prefer:
• Simple diffuse materials
• A small number of material slots
• Conservative texture resolution
• Alpha masking for transparent logo edges
• Matte or restrained highlights
Avoid making the model’s identity depend on desktop-style PBR reflections. The 3DS HOME Menu lighting and TEV stages can make a material look very different from Blender.
Do not aggressively decimate a model just because the HOME Menu slows down. In our tests, the complete higher-detail model performed correctly after the animation format was fixed, while destructive decimation introduced cracks and missing surfaces.
============================================================
4. STATIC BANNERS AND ANIMATED BANNERS
============================================================
If your banner is static, the process is relatively simple:
1. Build and position the scene in Blender
2. Export a clean glTF
3. Convert it with pycgfx
4. Apply any required CGFX-only flags
5. Package it into the BNR and CIA
For an animated banner, the final animation structure matters much more.
There are two very different animation approaches:
A. Soft-skinned skeletal animation
Vertices contain bone indices and bone weights. A skeleton deforms the mesh every frame.
B. Rigid mesh-node animation
Each moving mesh node remains rigid. The animation changes only its translation, rotation, and scale.
Blender can use either method while you are creating the animation. However, the final hardware-safe banner should use method B.
============================================================
5. THE MOST IMPORTANT HARDWARE RULE
============================================================
Use bones as an authoring rig if you want, but do not leave soft skinning in the final CGFX.
The final animated nodes should use ordinary Transform (5) CANM members containing only:
• Translation
• Rotation
• Scale
The following must agree with one another:
• The final CMDL model and animation group name COMMON
• glTF animation target names
• CGFX skeleton/node names
• SOBJ mesh_node_name values
• CANM member names
The final primitive sets should have:
skinning_mode == 0
The final vertex streams should not contain:
JOINTS_0
JOINTS_1
WEIGHTS_0
WEIGHTS_1
Deleting only the Armature object is not enough. If bone indices or weights remain in the exported vertex data, the banner is still not a clean rigid animation.
============================================================
6. CONVERTING A BLENDER RIG INTO RIGID NODE ANIMATION
============================================================
If your source animation already moves separate rigid objects, you can skip most of this section.
If your source animation uses an armature and deforming skin, use the armature only as a creative tool and bake the result:
1. Finish the animation in Blender
2. Choose the base pose which will become the final rigid mesh
3. Apply the deformed pose to the full-resolution mesh
4. Split the parts which need independent motion into separate mesh objects
5. Sample the required bone motion for every frame
6. Transfer that motion to each rigid mesh object as TRS keyframes
7. Remove Armature modifiers
8. Remove armature parenting
9. Remove vertex groups
10. Export glTF and verify that no JOINTS or WEIGHTS attributes remain
For example, the ClouDS Music character was authored with an upper-body rig. In the exported banner, the cloud body, front decorations, and headphones are three rigid mesh nodes. They share sampled upper-body motion but contain no skinning data.
This gives the appearance of a natural animated character while using the simpler structure accepted by real HOME Menu hardware.
Do not reduce the mesh resolution during this conversion unless it is genuinely necessary. Bake the original triangles, UVs, and normals first.
============================================================
7. ANIMATION TIMING AND LOOPING
============================================================
Set the animation range explicitly.
Blender may keep its default ending at frame 250 even if your real animation ends much earlier. If that empty tail is exported, the model may move once and then remain still for several seconds before looping.
Recommended setup:
• Set the intended FPS explicitly
• Set the exact first frame
• Set the exact final frame
• Make the first and final poses loop cleanly
• Add a short intentional rest near the end if the animation needs breathing room
• Remove all unused timeline tail frames
• When previewing, avoid displaying identical first and last frames twice
The ClouDS Music FA animation uses:
30 FPS
36 frames
Approximately 1.2 seconds per loop
Its character rises slightly, settles, sways from side to side, and includes a short resting section. This is only one example; the same rigid animation method works for many other motions.
============================================================
8. ADDING A LOGO THAT ALWAYS FACES THE CAMERA
============================================================
A normal logo plane placed under the rotating model root will rotate with the model. At the rear view it will appear mirrored.
Official-style banners can solve this with a billboard node.
glTF does not have a field for the CGFX billboard mode, so this requires two stages:
1. Create a separate logo plane in Blender
2. After conversion, set its corresponding CGFX bone/node to YAxial billboard mode, value 5
A useful hierarchy is:
COMMON
├── world Rotating main model
└── name Independent screen-facing logo
The logo must be a sibling of the rotating model root, not its child.
For the most reliable result:
• Position, rotate, and scale the logo correctly in Blender
• Bake the full visual transform into the plane vertices
• Leave the logo node itself with an identity transform
• Apply YAxial (5) billboarding to that identity node after conversion
Why bake the transform into the vertices?
If the logo node still contains Blender’s plane rotation, the HOME Menu billboard transform may rotate it a second time. The result is often a logo that becomes a thin vertical line.
If the logo is mirrored or upside down, fix the plane normal and UV orientation. Do not stack corrective rotations onto the billboard node.
============================================================
9. CONVERTING glTF TO CGFX
============================================================
The ClouDS Music FA repository contains three reference scripts:
tools/banner/create_rhythm_animation.py
tools/banner/build_banner_scene.py
tools/banner/convert_banner_cgfx.py
Repository:
https://github.com/Epic0522/ClouDS-Music-FA
These scripts are reference implementations, not universal one-click converters. Adapt them to the structure and names used by your own model.
At minimum, review and replace:
• MESH_NAMES or RIGID_ANIMATED_MESHES
• Source armature and bone names
• Model scale and vertical position
• HOME Menu safe-area values
• Logo dimensions, depth, node name, and texture
• Animation FPS, first frame, and final frame
• The list of TRS channels which should survive
• Material correction rules
Example Blender command for creating or preparing the source animation:
BLENDER=blender
"$BLENDER" --background --factory-startup \
--python tools/banner/create_rhythm_animation.py -- \
input-model.gltf output-directory
On macOS, Blender may be located here:
/Applications/Blender.app/Contents/MacOS/Blender
Example command for assembling the model and logo, and baking the authored skin motion into rigid mesh-node motion:
"$BLENDER" --background --factory-startup \
--python tools/banner/build_banner_scene.py -- \
output-directory/clouds-banner-rhythm.gltf \
path/to/logo.png \
banner-scene.gltf
Example conversion command:
.tools/pycgfx/.venv/bin/python \
tools/banner/convert_banner_cgfx.py \
banner-scene.gltf banner.cgfx
The reference converter performs several important post-conversion operations:
• Writes mesh_node_name for every SOBJ mesh
• Sets the logo node to YAxial (5) billboard mode
• Rejects soft skinning
• Rejects bone-index and bone-weight streams
• Confirms that the expected animation members are ordinary Transform (5) members
• Removes excessive specular behavior produced by generic PBR conversion
If your project uses different node names, change the hard-coded names before running it.
============================================================
10. MATERIALS AND THE “WASHED OUT” PROBLEM
============================================================
A model can look correct in Blender and still turn almost white when it faces the HOME Menu light.
pycgfx’s generic PBR conversion may create a strong white specular contribution. This can wash out both the main model and a fixed logo.
The safe correction is usually:
• Keep diffuse lighting
• Reduce or bypass the specular TEV stage
• Remove unnecessary specular distribution lookup data
• Use matte material values
Do not blindly delete all lighting. Diffuse shading helps the model retain its shape as it rotates.
If only one material is affected, correct that material rather than globally flattening the entire scene.
============================================================
11. CREATING THE SMDH
============================================================
Create the SMDH with bannertool:
bannertool makesmdh \
-s "Short title" \
-l "Long description" \
-p "Publisher" \
-f "visible,allow3d,recordusage,extendedbanner" \
-i icon.png \
-o application.smdh
The extendedbanner flag is required.
Without it, the CIA may contain the 3D scene but the HOME Menu will not treat it as an Extended Banner.
============================================================
12. ADDING BANNER AUDIO
============================================================
Banner audio is optional.
For the tested bannertool workflow, prepare:
• 44.1 kHz
• 16-bit
• Stereo PCM WAV
• No longer than 3 seconds
Then create the banner container:
bannertool makebanner \
-ci banner.cgfx \
-a audio.wav \
-o application.bnr
If you do not want audio, consult the bannertool version you are using for its supported no-audio invocation.
============================================================
13. BUILDING THE CIA
============================================================
Example makerom command:
makerom -f cia -target t -exefslogo \
-o application.cia \
-elf application.elf \
-rsf application.rsf \
-icon application.smdh \
-banner application.bnr \
-DAPP_ROMFS=/absolute/path/to/romfs \
-major 1 -minor 0 -micro 0
Adjust the RSF, RomFS path, program version, title metadata, and application files for your project.
============================================================
14. VALIDATION ORDER
============================================================
Do not jump directly from Blender to a public CIA.
Use this order:
1. Blender
Check the model, loop, UVs, normals, rotation center, logo, and safe area.
2. Exported glTF
Check that only the intended nodes and animation channels remain. Search the mesh attributes for JOINTS and WEIGHTS.
3. Converted CGFX
Check that:
• The file is below 512 KiB
• The main CMDL model is named exactly COMMON
• The CANM animation is named COMMON when animation is present
• Primitive sets use skinning mode 0
• No bone-index or bone-weight streams exist
• Every SOBJ has the correct mesh_node_name
• The logo is YAxial billboard mode 5
• Animated members are ordinary Transform (5)
4. Azahar HOME Menu
Install the CIA, restart the emulator, and inspect several complete rotations and animation loops.
5. Real hardware
Install the CIA on a CFW 3DS. Leave the cursor on the title, rotate the banner, enter and exit the application, move away from the title, and return to it repeatedly.
6. More than one model of 3DS
When possible, test on both Old and New 3DS hardware.
Emulator success is not final proof. The real HOME Menu is the compatibility target.
============================================================
15. HOME MENU CACHE
============================================================
The HOME Menu caches banners.
After installing an updated CIA, you may still see the previous model, animation, logo, or material.
Try:
• Restarting the emulator
• Restarting the real console
• Uninstalling the old title and reinstalling it
• Temporarily using a different Title ID during development
Do not assume the conversion failed until the cache has been ruled out.
============================================================
16. TROUBLESHOOTING
============================================================
Problem:
The banner works in Azahar, but selecting it freezes a real 3DS.
Likely cause:
Soft skinning, bone indices, or bone weights remain in the final CGFX.
Fix:
Convert the motion to rigid mesh-node TRS animation. Validate skinning_mode and vertex attributes before writing the file.
Problem:
The model moves once, then waits several seconds.
Likely cause:
Blender exported the default empty timeline up to frame 250.
Fix:
Set the exact scene end frame and remove the unused tail.
Problem:
The logo rotates with the model.
Likely cause:
The logo is a child of the rotating model root.
Fix:
Move it to a separate root-level sibling and enable Y-axis billboarding.
Problem:
The logo becomes a thin line.
Likely cause:
The plane rotation is being combined with the billboard rotation.
Fix:
Bake the visual transform into the vertices and leave the billboard node at identity.
Problem:
The logo is mirrored or upside down.
Likely cause:
Incorrect face normal or UV direction.
Fix:
Correct the plane orientation and flip only the necessary UV axis.
Problem:
The model or logo turns white when facing forward.
Likely cause:
Excessive specular contribution from the converted PBR material.
Fix:
Reduce the specular TEV stage and use a simpler matte material while keeping useful diffuse shading.
Problem:
The model leaves the visible area.
Likely cause:
The scene was composed using only the Blender camera and did not reserve space for HOME Menu UI.
Fix:
Use the HOME Menu reference camera and reduce the total scale.
Problem:
The model contains cracks or holes.
Likely cause:
Aggressive decimation, broken topology, or incorrect normals.
Fix:
Return to the complete mesh and inspect topology, faces, normals, and textures separately.
Problem:
A transparent logo has a solid rectangle around it.
Likely cause:
Alpha mode or cutoff was lost during conversion.
Fix:
Use alpha masking and inspect the final CGFX material state.
Problem:
The newly installed CIA still shows an old banner.
Likely cause:
HOME Menu cache.
Fix:
Restart, reinstall, or temporarily change the Title ID.
Problem:
The background rotates or flies around when it should remain behind the subject.
Likely cause:
The background is parented under world, has the wrong pivot, or inherited the main model transform.
Fix:
Choose the hierarchy intentionally. Keep rotating scene geometry under world; place independent or screen-facing background nodes beside world under COMMON. Bake transforms and inspect every angle.
Problem:
A transparent background sorts incorrectly or produces visible layers.
Likely cause:
Excessive alpha overdraw, incorrect depth state, or ambiguous draw order.
Fix:
Reduce overlapping transparent surfaces, prefer opaque or alpha-masked geometry where possible, and inspect the final CGFX material state.
Problem:
A texture or material animation works in an emulator but is unstable on real hardware.
Likely cause:
The generated CANM/material members do not match the subset expected by the HOME Menu renderer.
Fix:
Compare the structure with a known-good banner and test each material animation member separately on hardware. Do not release an emulator-only result as verified.
============================================================
17. REFERENCE STRUCTURE FROM CLOUDS MUSIC FA
============================================================
The working ClouDS Music FA banner uses:
Scene root:
COMMON
Rotating model root:
world
Fixed screen-facing logo:
name
Rigid animated meshes:
Cloud_Textured
Front_Decorations
Headphones
Animation:
Ordinary Transform (5) CANM members only
Timing:
30 FPS
36 frames
Approximately 1.2 seconds
Final CGFX:
Approximately 331 KiB
The source rig exists only during Blender authoring. The final CGFX contains no soft skin.
============================================================
18. FINAL CHECKLIST
============================================================
Before releasing your CIA, verify every item:
□ The SMDH contains extendedbanner
□ The CGFX is below 512 KiB
□ The final CMDL model is named exactly COMMON
□ The final CANM animation is named COMMON when animation is present
□ The model stays inside the HOME Menu safe area
□ The rotation center looks correct
□ Front, side, and rear views are acceptable
□ The logo is not a child of the rotating root
□ The logo uses YAxial billboard mode 5
□ The billboard node has an identity transform
□ No JOINTS or WEIGHTS data remains
□ Every primitive set uses skinning mode 0
□ Every animated member is ordinary Transform (5)
□ The animation end frame is explicit
□ The loop has no accidental multi-second pause
□ Every background is parented under world or COMMON intentionally
□ Large backdrops do not create excessive alpha overdraw
□ Experimental texture/material animation is clearly distinguished from hardware-tested steps
□ Materials do not wash out under HOME Menu lighting
□ Alpha-masked textures work
□ Audio is in a supported format and duration
□ The new banner is visible after clearing HOME Menu cache
□ The banner has been tested on real hardware
============================================================
19. CLOSING NOTES
============================================================
The main lesson is simple:
The 3DS HOME Menu can display a surprisingly rich animated 3D banner, but its safe animation path is not the same as a modern desktop glTF renderer.
Use Blender bones to create the motion if that is convenient, then bake the visible result into rigid mesh-node translation, rotation, and scale. Keep the screen-facing logo independent, patch the CGFX properties which glTF cannot represent, validate the final binary, and always test on real hardware.
Once those rules are followed, a homebrew title can have a rotatable, animated, sound-enabled banner that feels much closer to official Nintendo 3DS software.
Reference projects:
ClouDS Music FA
https://github.com/Epic0522/ClouDS-Music-FA
Super Mario 64 3DS Port Ultimate
https://github.com/Epic0522/Super-Mario-64-3ds-port---Ultimate
pycgfx
https://github.com/skyfloogle/pycgfx
Historical Every File Explorer tutorial
Creating 3D Banners from 3D Models
THIS IS A W.I.P
This was made because of the huge lake of TRUE 3D banners.THIS IS A W.I.P
This guide will only go over the basic way of doing it because the other way involves using the NW4C, but you can still make some cool banners. The steps during this can get confusing, and I'm trying to make them clear, but I don't expect you to be that guy and learn to model and make banners in one day. If it put something in this guide that shouldn't be there(Such as links to illegal stuff(wich there...
- MovieAutomotive
- Replies: 36
- Forum: Nintendo 3DS
Bannertool 2D banner example
does anyone know how to use bannertool for a cia on the 3ds? @Pk11 @RocketRobz ? I had to use a gui for my sm64 build. I'm trying to build both a bnr and icn file with bannertool from png images. thanks.
- godreborn
- Replies: 13
- Forum: Nintendo 3DS
BootNTR Selector banner release
https://github.com/Nanquitas/BootNTR/releases/tag/v2.13.3
CBMD format documentation
https://3dbrew.org/wiki/CBMD







