Skip to content
Return to Knowledge

Free and open-source 3D creation suite supporting the entire pipeline. Modeling, sculpting, animation, VFX, compositing, motion tracking and video editing.

Unitsmeter
PlatformWindows, macOS, Linux

Tips โ€‹

TIP

Use Blender Launcher V2 to manage multiple Blender versions.

TIP

Interactive shortcut reference: Blender Shortcuts

Shortcuts โ€‹

General โ€‹

ActionShortcut
PreferencesCtrl ,
Property boxF9
Apply to all selected elementshold Alt
Frame selectedNumpad .
Frame cameraNumpad 0
Set selected as active viewpointCtrl Numpad 0
Set active camera to viewCtrl Alt Numpad 0
Join objectsCtrl J
Move to collectionM
Link to collectionShift M
Radial view selection menu`
Scale around Z axisAlt S
Cursor/view to centerShift C
Place cursorShift RMB
Drag viewportShift MMB
Zoom viewportCtrl MMB
Hide selectedH
Isolate selectedShift H
Unhide allAlt H
Quick favoritesQ
Snap to orthographic viewshold Alt while rotating
Toggle quad viewCtrl Alt Q
Batch renameCtrl F2
Vertex bevelCtrl Shift B

Rendering โ€‹

ActionShortcut
Render frameF12
Render sequenceCtrl F12
Render regionCtrl B
Delete render regionCtrl Alt B

Modeling โ€‹

ActionShortcut
ExtrudeE
Select edge/poly loopAlt LMB
Rotate along edgesCtrl Shift Alt S
Even mode (loop cut)E
SubdivideCtrl 1 / 2 / 3 (Ctrl 0 to reset)
Snap to points with rulerhold Ctrl
Scale along normalsAlt S
Measure thickness with rulerhold Shift
Measure angle with rulerclick in the middle
Delete a rulerX
InsetI
Constrain to outer edge (inset)I then B

Sculpting โ€‹

ActionShortcut
Toggle perspective/orthographicNumpad 5
Rescale brushF
Brush intensityShift F
Invert brushhold Ctrl
Smoothhold Shift
Stroke methodE
DyntopoCtrl D
Invert maskAlt I
Undo maskAlt M
Hide maskedCtrl H
Unhide allH
Lasso maskCtrl Shift LMB
Box maskB

Rigging โ€‹

ActionShortcut
Set pivot point.

Animation โ€‹

ActionShortcut
Set keyframeI

Unwrapping โ€‹

ActionShortcut
Select UV islandI

Shading โ€‹

ActionShortcut
Preview shaderCtrl Shift LMB
Principled texture setupCtrl Shift T
Cut node wiresCtrl RMB drag

Tracking โ€‹

ActionShortcut
Create new trackerCtrl LMB
Show search boxAlt S
Track manuallyAlt Arrows
Lock view to trackerL
Start auto trackerCtrl T
Lock trackerCtrl L

Hard Ops / Boxcutter โ€‹

INFO

Install Hard Ops first, then Boxcutter. This way Boxcutter is the first mode you access when pressing Alt W.

ActionShortcut
Toggle Hard Ops / BoxcutterAlt W
Viewport settingsAlt V
Align BoxcutterShift V
Hard Ops menuQ
Radial Hard Ops menuShift Q
Boxcutter menu / Hops toolsD
HOps helperCtrl `
Display & select cutterhold Shift when releasing
MirrorAlt X
Align edgesAlt A

Materialiq โ€‹

ActionShortcut
Toggle asset libraryE over any area

DANGER

Materialiq can cause problems with commonly used shortcuts like mode switching (1 2 3) and the MACHIN3tools shortcut Alt X.

Add-ons โ€‹

NameDescription
Loop ToolsMesh modelling toolkit
Edit Mesh ToolsAdditional mesh modelling tools
Node WranglerDramatically improves the node editing experience
MACHIN3toolsSwiss army knife for Blender workflow
CURVEmachineFlexible poly curve editing
Hard Ops / BoxcutterHard surface modelling toolkit
Edge FlowAdjust mesh geometry to curved surfaces
GrabDocTrim & tileable texture baker
Quick RigidEasy access to rigid body settings
Poly HavenPolyhaven asset library integration
MaterialiqMaterial library
EZLatticeLattice deformation companion
AddRoutesMIDI and OSC signals in Blender
NodeOSCOSC support for nodes
PinVertsPin unselected vertices for proportional editing
Shot ManagerRender manager
fSpyStill image camera matching
KeenTools GeoTrackerGeometry tracking
Dream TexturesAI-generate textures
PallaidiumAI-generate video, image, and audio
PhyXScene layout tool
EngonAsset browser
Udin ShadersCar shaders
Poly QuiltRetopology tool
StoryPencilStoryboarding tools
GafferLight & HDRI manager
Light ManagerLight manager
Sketchup ImporterTested with 3.6
CompifyCompositing in 3D space
3DGS RenderGaussian Splatting editor/renderer
DreamUVManipulate UVs in the 3D viewport
BoltFactoryParametric bolt and nut generator
Sculpt Bridge ToolBridge or punch holes in meshes
Shaders PlusCaustics, thin film, dispersion
Gobos PlusProcedural & 4K gobos
IES PlusProcedural IES light nodes
Light WranglerModify lights faster with shortcuts
Lens SimBokeh, chromatic aberration simulation
nijiGPen2D graphic design with Grease Pencil
Grease Pencil Tool WheelExtended pie menu for GP tools
Camera PlaneImport images stuck to camera
Timelapse OrbitRotating viewport recording
Target, Please!Targeting add-on
IKEA BrowserDownload IKEA furniture in Blender
Batch ExporterBatch export tool
3D Print Toolbox3D print analysis tools
Motion SoundsGenerate sound from animation

Scripts โ€‹

Assign materials by object name โ€‹

Assigns a material to each selected mesh if a material with the same name exists.

python
import bpy

selected_objects = bpy.context.selected_objects

for obj in selected_objects:
    if obj.type == 'MESH':
        matching_material = bpy.data.materials.get(obj.name)
        if matching_material:
            obj.data.materials.clear()
            obj.data.materials.append(matching_material)
            print(f"Assigned material '{matching_material.name}' to object '{obj.name}'")
        else:
            print(f"No matching material found for object '{obj.name}'")

print("Material assignment complete for selected objects.")

Import KitBash3D models into Asset Browser โ€‹

Sorts KB3D pack objects into collections and registers them as assets. Run inside Blender's Text Editor.

Setup:

  1. Open your KB3D pack (textures loaded, scene named KB3D_"TitleCasePackName"-Native)
  2. Create a folder in your Asset Library path (e.g. D:/BlenderAssetLibraries/KB3D/CyberDistricts/Cyberdistricts.blend)
  3. Run the script with Alt + P
python
import bpy
import os
from pathlib import Path
import uuid

file_name = str(bpy.data.scenes.keys()[0].split('_')[1].split('-')[0])
folder = Path(bpy.data.filepath).parent
new_uuid = str(uuid.uuid4())

collection_map = {
    "Props": "Prop",
    "Buildings": "Bldg",
    "Structures": "Strc",
    "Vehicles": "Vehi",
    "Creatures": "Crea"
}
kit_catalog = {}
flipped_cmap = {v: k for k, v in collection_map.items()}

primary_collections = ["Props", "Buildings", "Structures", "Vehicles", "Creatures", "Other"]
for collection_name in primary_collections:
    new_collection = bpy.data.collections.new(collection_name)
    bpy.context.scene.collection.children.link(new_collection)

for obj in bpy.data.objects:
    if obj.type == "EMPTY" and obj.name.startswith("KB3D_"):
        asset_type = obj.name.split("_")[2][:4]
        cm_col_name = flipped_cmap.get(asset_type, "Other")
        new_collection = bpy.data.collections.new(obj.name)
        bpy.data.collections[obj.name].objects.link(obj)
        cm_col = bpy.data.collections[cm_col_name]
        bpy.data.collections[cm_col.name].children.link(bpy.data.collections[obj.name])
        kit_catalog[obj.name] = cm_col.name

for obj in bpy.data.objects:
    if obj.type == "MESH" and obj.parent is not None:
        bpy.data.collections[obj.parent.name].objects.link(obj)

for empty in bpy.data.objects:
    if empty.type == 'EMPTY' and empty.name.startswith('KB3D_'):
        bpy.context.scene.collection.objects.unlink(empty)
        for child in empty.children:
            bpy.context.scene.collection.objects.unlink(child)

for col in bpy.data.collections:
    if col.name.startswith('KB3D_'):
        col.asset_mark()

empty_objects = [obj for obj in bpy.data.objects if obj.type == "EMPTY" and obj.name.startswith("KB3D_")]
for obj in empty_objects:
    obj.location = (0, 0, 0)

asset_catalog_path = folder / "blender_assets.cats.txt"
lines = []
asset_uuids = {}

with asset_catalog_path.open('a+') as f:
    f.seek(0)
    lines = f.readlines()

if os.path.getsize(asset_catalog_path) == 0:
    lines.extend([
        "# This is an Asset Catalog Definition file for Blender.\n",
        "#\n",
        "# Empty lines and lines starting with `#` will be ignored.\n",
        "# The first non-ignored line should be the version indicator.\n",
        '# Other lines are of the format "UUID:catalog/path/for/assets:simple catalog name"\n',
        "\n",
        "VERSION 1\n\n"
    ])

file_contents = ''.join(lines)
collection_uuids = {cn: [] for cn in collection_map.keys()}
collection_uuids["Other"] = []

if file_name not in file_contents:
    if "KB3D" not in file_contents:
        lines.append(f"{str(uuid.uuid4())}:KB3D:KB3D\n")
    lines.append(f"{str(uuid.uuid4())}:KB3D/{file_name}:{file_name}\n")
    for collection_name in collection_map.keys():
        asset_uuid = str(uuid.uuid4())
        asset_uuids[collection_name] = asset_uuid
        lines.append(f"{asset_uuid}:KB3D/{file_name}/{collection_name}:{collection_name}\n")
    asset_uuid = str(uuid.uuid4())
    asset_uuids["Other"] = asset_uuid
    lines.append(f"{asset_uuid}:KB3D/{file_name}/Other:Other\n")

with asset_catalog_path.open("w") as f:
    f.writelines(lines)

kit_catalog = {}
for col in bpy.data.collections:
    if col.name.startswith("KB3D_"):
        asset_type = col.name.split("_")[2][:4]
        asset_name = flipped_cmap.get(asset_type, "Other")
        col.asset_data.catalog_id = asset_uuids[asset_name]
        print(f"Adding {col.name} -> {asset_name}")

Resources โ€‹

Home ยท Hobi ยท Blog
Made with โค๏ธ in