[[start:knowledge|<< Back]]
====== Blender ======
1 unit = 1m\\
[[https://github.com/Victor-IX/Blender-Launcher-V2|Blender Launcher]]\\
[[https://hollisbrown.github.io/blendershortcuts/|Blender Shortcuts]]
===== Shortcuts =====
Manual adjustments
Ctrl , preferences
==== General ====
^ Action ^ Shortcut ^
| Property box | F9 |
| Apply to all selected elements | hold Alt |
| Frame selected | . (numpad) |
| Frame camera | 0 (numpad) |
| Set selected item as active viewpoint | Ctrl 0 |
| Set active camera to view | Ctrl Alt 0 |
| Transfrom all selected objects | Alt (hold) |
| Join objects | Ctrl j |
| Move to collection | M |
| Link to collection | Shift M |
| Radial view selection menu | ` |
| Scale around z axis | Alt s |
| Cursor/view to center | Shift c |
| Place curcor | Shift right mouseclick |
| Drag viewport/window | Shift middle mouse |
| Zoom viewport/window | Ctrl middle mouse |
| Hide selected | h |
| Isolate selected | Shift h |
| Unhide all | Alt h |
| Quick favorites | q |
| Snap to orthographic views | hold Alt while rotating |
| Toggle quad view (orthographic and perspective) | Ctrl Alt q |
| Batch rename | Ctrl f2 |
==== Rendering ====
^ Action ^ Shortcut ^
| Render frame | F12 |
| Render sequence | Ctrl F12 |
| Render region | Ctrl b |
| Delete render region | Ctrl Alt b |
==== Modeling ====
^ Action ^ Shortcut ^
| Extrude point, edge or poly | e |
| Select edge/poly loop | Alt click (the loop will follow the direction relative to where you clicked) |
| Rotate allong edges | Ctrl Shift Alt s |
| Even mode when doing loop cut | e |
| Subdivide (combine with Auto Smooth for best experience) | Ctrl 1,2,3,... or Ctrl 0 to reset to original mesh |
| Snap to points with ruler | Hold Ctrl |
| Scale along normals | Alt s |
| Measure thickness with ruler | Hold Shift |
| Mesure angle with ruler | Click in the middle |
| Delete a ruler | x |
| Inset | i |
| Toggle constraint to outer edge while insetting | i + b |
==== Sculpting ====
^ Action ^ Shortcut ^
| Perspective/orthographic | numpad 5 |
| Rescale brush | f |
| Intensity brush | Shift f |
| Invert brush | hold Ctrl |
| Smooth | Shift |
| Stroke method | e |
| Dyntopo | Ctrl d |
| Invert Masked | Alt i |
| Undo mask | Alt m |
| Hide masked | Ctrl h |
| Unhide all | h |
| Lasso mask | Ctrl Shift lmb |
| box mask | b |
==== Rigging ====
^ Action ^ Shortcut ^
| Set pivot point | . |
==== Animation ====
^ Action ^ Shortcut ^
| Set keyframe | i |
==== Unwrapping ====
^ Action ^ Shortcut ^
| Select UV island | i |
==== Shading ====
^ Action ^ Shortcut ^
| Preview shader | Ctrl Shift click |
| Principled texture setup | Ctrl Shift t |
| Cut node wires | Ctrl right-click drag |
==== Tracking ====
^ Action ^ Shortcut ^
| Create new tracker | Ctrl click |
| Show search box | Alt s |
| Track manually | Alt arrows |
| Lock view to tracker | l |
| Start auto tracker | Ctrl t |
| Lock tracker | Ctrl l |
==== Boxcutter/Hardops ====
==== Add-on Specific ====
Install Hardops first, then Boxcutter. This way Boxcutter is the first mode you access when pressing Alt w
^ Action ^ Shortcut ^
^ Hardops/Boxcutter ||
| Toggle between Hardops & Boxcutter | Alt w |
| Viewport settings | Alt v |
| Align boxcutter | Shift v |
| Hardops menu | q |
| Radial hardops menu | Shift q |
| Box cutter menu/hopstools | d |
| HOps helper | Ctrl ` |
| Hold shift when releasing cutter | Displays and selects your cutter |
| Mirror | Alt x |
| Allign edges | Alt a |
^ MaterialIQ ||
| Toggle asset library | press e over any area |
===== Add-on's =====
^ Name ^ Description ^
| [[https://docs.blender.org/manual/en/latest/addons/mesh/looptools.html|Loop tools]] | |
| [[https://docs.blender.org/manual/en/latest/addons/mesh/edit_mesh_tools.html|Edit Mesh Tools]] | |
| [[https://docs.blender.org/manual/en/latest/addons/node/node_wrangler.html|Node wrangler]] | Improve the node experience by a lot |
| [[https://blendermarket.com/products/machin3tools|MACHIN3tools]] | MACHIN3tools |
| [[https://machin3.io/CURVEmachine/|CURVEmachine]] | Makes POLY Curve editing more flexible |
| [[https://www.blendermarket.com/products/hard-ops--boxcutter-ultimate-bundle|Hard Ops / Boxcutter]] | Hard Ops / Boxcutter |
| [[https://polyhaven.com/plugins/blender|Poly Haven]] | Asset library integration of all polyhaven assets |
| [[https://blendermarket.com/products/materialiq|Materialiq]] | Material library |
| [[https://blendermarket.com/products/ezlattice-blender-add-on-for-deformingreshaping-models-quickly?ref=2|EZLattice]] | Lattice companion for Blender. |
| [[http://www.jpfep.net/pages/addroutes/|AddRoutes]] | Work with MIDI and OSC signals in Blender |
| [[https://coreycorza.gumroad.com/l/pinvertsaddon|PinVerts]] | Pin unselected vertices for Proportional Editing to aid in modelling |
| [[https://blendermarket.com/products/shot-manager|Shot manager]] | Render manager |
| [[https://github.com/stuffmatic/fSpy-Blender|fSpy]] | Open source still image camera matching |
| [[https://keentools.io/products/geotracker-for-blender|KeenTools]] | GeoTracker |
| [[https://www.blendermarket.com/products/dream-textures|Dream textures]] | AI-generate textures, ... |
| [[https://github.com/tin2tin/Pallaidium|Pallaidium]] | AI-generate video, image, and audio from text prompts |
| [[https://fairmarket.land/product/phyx-drag?a=c8edc042|PhyX]] | Scene layout tool |
| [[https://blendermarket.com/products/engon|Engon]] | Asset browser |
| [[https://udinbv.gumroad.com/l/shaders|Udin Shaders]] | Car shaders |
| [[https://github.com/atticus-lv/PolyQuilt|Poly Quilt]] | Retopology tool |
| [[https://extensions.blender.org/add-ons/storypencil-storyboard-tools/|StoryPencil]] | Storyboarding |
| [[https://blendermarket.com/products/gaffer-light-manager|Gaffer]] | Light & Hdri Manager |
| [[https://engelik.gumroad.com/l/DQNYI|Light manager]] | Light manager |
| [[https://github.com/RedHaloStudio/Sketchup_Importer/releases/tag/0.23.2|Sketchup Importer]] | Tested with 3.6 |
| [[https://github.com/EatTheFuture/compify|Compify]] | Easier/better compositing in 3D space |
| [[https://github.com/Kiri-Innovation/3dgs-render-blender-addon|3DGS Render]] | Gaussian Splatting Editor/Renderer |
| [[https://github.com/leukbaars/DreamUV|DreamUV]] | Tools that allow you to manipulate UVs in the 3D viewport |
| [[https://extensions.blender.org/add-ons/boltfactory/|BoltFactory]] | |
| [[https://blendermarket.com/products/sculpt-bridge-tool|Sculpt Bridge Tool]] | |
| [[https://blendermarket.com/products/shadersplus|Shaders Plus]] | Caustics, Thin Film, Dispersion For Cycles & Eevee |
| [[https://blendermarket.com/products/gobos-plus---procedural--4k-gobos-for-cycles--eevee|Gobos Plus]] | Procedural & 4K Gobos For Cycles + Eevee |
| [[https://blendermarket.com/products/iesplus?ref=1210|Ies Plus]] | Procedural Ies Light Nodes |
| [[https://blendermarket.com/products/light-wrangler|Light Wrangler]] | Modify lights faster with shortcuts etc |
| [[https://blendermarket.com/products/lens-sim|Lens Sim]] | Lens simulation for Bokeh, Chromatic Aberration |
| [[https://github.com/chsh2/nijiGPen/releases|nijiGPen]] | Adds new features to Grease Pencil for creating 2D graphic design and illustrations |
| [[https://extensions.blender.org/add-ons/grease-pencil-tool-wheel/|Grease pencil tool wheel]] | |
[[https://github.com/agmmnn/awesome-blender|A curated list of Blender Add-on's]]
\\
===== Python scripts =====
Assign shaders to selected meshes with the same name as the shader\\
import bpy
# Get selected objects
selected_objects = bpy.context.selected_objects
# Loop through selected objects
for obj in selected_objects:
if obj.type == 'MESH':
# Check if there's a material with the same name as the object
matching_material = bpy.data.materials.get(obj.name)
if matching_material:
# Clear existing materials on the object
obj.data.materials.clear()
# Assign the matching material to the object
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.")
Quickly Import KitBash3D Models into the Blender Asset Browser\\
# Open your KB3D Pack. Make sure the textures are loaded and everything works as intended. This script assumes the Scene is named KB3D_"TitleCasePackName"-Native. It should be that by default.
# Create a new folder in your Asset Library Folder for Blender. (Edit>Preferences>FilePaths>AssetLibraries). I recommend a setup like this
# (D:/BlenderAssetLibraries/KB3D/CyberDistricts/Cyberdistricts.blend)
# Where "CyberDistricts" would be the AssetLibrary.
# Open the script in Blender by going to the Text Editor and clicking "Open" to locate the file, or paste it from the Gist.
# Run the script by clicking the "Run Script" button in the Text Editor or pressing Alt+P.
# The script will create new collections for each type of asset in your scene and move the assets into these collections. It will also generate a unique ID for the asset pack and each asset in the pack.
# The script will then update the asset catalog file to include the new asset pack and each asset in the pack.
# Once the script is finished, you can save your Blender file and close it.
# You should now see it in the asset libraries section on Blender.
# Troubleshooting: If something goes wrong or a mistake is maid I have minimal errorchecking. Just undo before the script was run and delete the Catalogs or the "blender_assets.cats.txt" file,
# they may trip up the script if it failed partway through.
# I put a lot of effort into making this, so if you'd like to show your appreciation-
# you can donate to me through PayPal at the link below: https://paypal.me/mintyfresh
# Update: Remade better.
# TODO: Add simple GUI, test all packs, ensure consistent sizing and proper integration for easy placing of props.
import bpy
import os
from pathlib import Path
import uuid
#filename
file_name = str(bpy.data.scenes.keys()[0].split('_')[1].split('-')[0])
folder = Path(bpy.data.filepath).parent
new_uuid = str(uuid.uuid4())
# Mapping for collections to asset types
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()}
# Create the primary collections
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)
# Loop through all the empties and sort them into the collections for the library
for obj in bpy.data.objects:
if obj.type == "EMPTY" and obj.name.startswith("KB3D_"):
# Sort the new collection into the correct group
asset_type = obj.name.split("_")[2][:4]
# Check if the asset_type exists in the flipped_cmap dictionary
if asset_type in flipped_cmap:
cm_col_name = flipped_cmap[asset_type]
else:
cm_col_name = "Other"
# Create a new collection with Empty's name
new_collection = bpy.data.collections.new(obj.name)
bpy.data.collections[obj.name].objects.link(obj)
# Linking Object groups
cm_col = bpy.data.collections[cm_col_name]
# Move the object's children to the new collection
bpy.data.collections[cm_col.name].children.link(bpy.data.collections[obj.name])
kit_catalog[obj.name] = cm_col.name
print(kit_catalog.values())
# Loop over Object and relink to parents.
for obj in bpy.data.objects:
if obj.type == "MESH" and obj.parent != 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()
# Create a list of all empty objects
empty_objects = [obj for obj in bpy.data.objects if obj.type == "EMPTY" and obj.name.startswith("KB3D_")]
# Loop through the list of empty objects and clear their locations
for obj in empty_objects:
obj.location = (0, 0, 0)
asset_catalog_path = folder / "blender_assets.cats.txt"
# Initialize the list of lines and the asset_uuids dictionary
lines = []
asset_uuids = {}
# Read the existing asset catalog file into a list of lines
with asset_catalog_path.open('a+') as f:
f.seek(0) # Move the file pointer to the beginning of the file
lines = f.readlines()
# Check if the blender_assets.cats.txt file is empty and initialize it if necessary
if os.path.getsize(asset_catalog_path) == 0:
header_lines = [
"# 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"
]
lines.extend(header_lines)
# Add new lines to the catalog if necessary
file_contents = ''.join(lines)
# Initialize the asset_uuids dictionary outside the condition
collection_uuids = {collection_name: [] for collection_name 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")
# Write the updated list of lines back to the file
with asset_catalog_path.open("w") as f:
f.writelines(lines)
kit_catalog = {}
# Asset Library Adder
for col in bpy.data.collections:
if col.name.startswith("KB3D_"):
# Gets the asset type of an object from the Name
# Ex: Bldg Prop Strc
asset_type = col.name.split("_")[2][:4] # e.g. "Bldg"
# Check if the asset_type exists in the flipped_cmap dictionary
if asset_type in flipped_cmap:
asset_name = flipped_cmap[asset_type] # e.g. "Buildings"
col.asset_data.catalog_id = asset_uuids[asset_name]
else:
asset_name = "Other"
col.asset_data.catalog_id = asset_uuids[asset_name] # Set the catalog_id for the "Other" category
print(col.name, asset_name)
# Linking Object groups
cm_col = bpy.data.collections[col.name] # Buildings [Collection]
print('adding', col.name, 'asset_data')
===== Demo Scenes =====
^ Description ^ Name ^
| Fake caustics | [[https://app.gumroad.com/d/b831ccb7c47989ba31987807ae974158|Refractive Caustics (Blender 3.2+)]] |
| Geo nodes presets wit fields (like C4D) | [[https://app.gumroad.com/d/d00352cb11da823b4633f1254cd77de1|Geo Nodes presets]] |
| | [[https://ko-fi.com/s/9131dc3af8|Abstract Loops]] |
===== Links =====
[[https://www.youtube.com/watch?v=jnj2BL4chaQ&t=4s|Beginners tutorial]]
[[https://hollisbrown.github.io/blendershortcuts/|Blender Shortcuts]]
[[https://docs.blender.org/manual/en/latest/|Manual]]
[[https://bubblepins.com/membership/export-houdini-kinefx-rigs-amp-blendshapes-to-blender|Export Houdini KineFX Rigs & BlendShapes to Blender]]
==== Pre-production ====
[[https://cgcookie.mavenseed.com/courses/grease-pencil-basics-an-introduction-to-blender-s-grease-pencil|Grease Pencil]]\\
[[https://www.youtube.com/watch?v=7PrgpIskR5s&ab_channel=CGCookie|Storyboarding in 3D Space]]\\
[[https://www.youtube.com/watch?v=lpimPeoVeZ4|Storyboard with Blender's Grease Pencil: tips for your short film]]\\
[[https://www.youtube.com/watch?v=yaOEsAOnq7s|Blender 2D Animation Basics for Beginners - Grease pencil guide]]\\
[[https://jjanneanthony.com/2024/02/23/31-day-grease-pencil-challenge-in-blender/|31-Day Grease Pencil Challenge in Blender]]\\
-==== Production ====
[[https://www.youtube.com/watch?v=w6YPbidAAzQ|How Ian Hubert Hacked VFX - Delighting]]\\
[[https://www.artstation.com/blogs/ericcorreia/AgNXW|A Guide on Achieving Flawless Bakes]]\\