This repository contains various Blender operators to assist me with my daily work. Because I mainly work on high-poly CAD models, most operators in here center around organization, simplification, cleaning, and smart selection of things. I hope you will find something useful, too.
- Installation
- Operators
2.1 Replace by Primitive
2.2 Align Bounds
2.3 Select Loose by Size
2.4 Select Similar
2.5 Select Visible
2.6 Select Overlap
2.7 Transfer Materials
2.8 Select Concave Parts
2.9 Lerp Weights
2.10 Set Parent Advanced
2.11 Apply Name
2.12 Select All by Name
2.13 Replace Duplicate Materials
2.14 Prepare Export to Unity
2.15 Vertex Color to Group
2.16 Join as Vertex Group
2.17 Remove Empty Vertex Groups
2.18 Remove Similar UV Maps
2.19 Force Apply Transform
2.20 Force Apply Modifier
2.21 Select N Instances
2.22 Viewport Display from Shader
The existence of submodules unfortunately makes it not possible to completely download the repository as a zip file. Do this instead:
- Navigate to Blender's addons directory. If you don't know the path, type
bpy.utils.user_resource('SCRIPTS', path="addons")
into Blender's Python Console to see it. - Clone via
git clone --recurse-submodules https://github.com/D4KU/smorgasbord.git
- In Blender, navigate to
Edit > Preferences > Add-ons
- Hit the Refresh button
- Search for the add-on and tick it in the list.
[Object mode] Object > Transform > Replace by Primitive
[Edit mode] Mesh > Transform > Replace by Primitive
Replace selected objects or vertices by a chosen geometric primitive. This primitive is transformed so its bounding box fits the bounding box of the corresponding selected object or vertex selection as closely as possible. Because this method only compares bounding boxes and does not use a full-blown registration method, an object's apparent rotation can only be matched if it is still accessible via the object's properties and wasn't already applied directly to the mesh data.
[Object mode] Object > Transform > Align Bounds
[Edit mode] Mesh > Transform > Align Bounds
In Object mode, align any number of selected objects to the active one. As in
the Replace by Primitive
function, only the object's bounding boxes are
aligned, so the same restrictions regarding rotations apply.
In Edit mode this function aligns the bounds around the vertex selection of each individual object to the vertex selection of the active object.
The method ignores pivot points and instead matches the bounding box centers
of all meshes/vertex selections. This, and the fact that also rotation and
scale are aligned, distinguishes this method from the built-in Align Objects
Blender function.
[Edit mode] Select > Select Loose by Size
Select loose parts in the currently edited meshes whose bounding box volume (or diagonal) is greater than a given minimum threshold and less or equal than a given maximum threshold.
[Object mode] Select > Select Similar
This is an implementation of Osada et al.'s paper Matching 3D Models with Shape Distributions. By selecting an object and choosing similarity measure limits, one can find objects with a similar shape in the scene. The method is scale- and rotation-invariant, but it is pretty simple, without any usage of Machine Learning, so similarities between strongly deformed or complex objects can't be reliably detected.
[Edit mode] Select > Select Visible
Renders edited objects from random positions around them and selects vertices seen from any of those positions, leaving occluded vertices unselected. This is useful to remove hidden inside parts of a CAD model, for example. A good workflow following this function is to select linked vertices (Ctrl-L) to catch the ones this operator missed, and then to invert the selection. This is shown in the animation below.
[Edit mode] Select > Select Overlap
Select vertices in the active object close to vertices in selected objects. How close can be controlled via a parameter.
[Object mode] Object > Relations > Transfer materials
This operator only exists to compensate the fact that the Data Transfer modifier can't transfer material slots. In every selected target mesh, it finds the closest polygon in the active source mesh and copies over the assigned material.
[Edit mode] Select > Select Concave Parts
By comparing normals of adjacent faces, this operator is able to select concave mesh parts. It defines a concave patch as a set of connected polygons in which at least two polygons face each other by a given angle. The border to neighboring patches is set along edges whose adjacent polygons face away from each other.
[Weight Paint mode] Weights > Lerp Weights
By selecting two bones in an armature and vertices in a mesh, this operator is able to linearly interpolate the bones' weights based on the distance between them.
[Object mode] Object > Parent > Set Parent Advanced
Adds more options to parent one object to another:
-
No Inverse, Keep Transform: Keep no inverse parent correction (the child's origin is the parent's position), but recalculate the transform values so that the child keeps it's world transform.
-
No Inverse, Keep Basis: Keep no inverse parent correction, but keep the transform values set in the property panel. The child object moves.
-
World to Local Origin: The inverse Parent correction is set so that the child's world position before re-parenting becomes its new origin.
[Object mode] Object > Apply > Apply Name
Set the name of an selected object's data block equal to the object name. If several objects link to the same data block, its name is set to the one of the last linked object in the scene hierarchy.
[Object mode] Select > Select All by Name
Select all objects in the scene whose name either contains, equals, starts with, or ends with a given phrase.
Material Properties > Material Context Menu (v-shape under minus-sign)
For every selected object's material slot, try to replace all assigned
duplicate materials with their original by comparing their names. A regular
expression, which can be passed to the function as input, specifies how
material names are matched. The default expression, .*(?=\.[0-9]+)
, replaces
a material with a suffix containing a dot and a number by the corresponding
material without such a suffix, if such a material exists. For example,
Plastic_black.001 would be replaced by Plastic_black, if existent.
[Object mode] Object > Transform > Prepare Export to Unity
Applies a rotation to every selected object so that when imported to Unity, the Y and Z axis are swapped and no unwanted transformations are applied. The result from applying this operator twice is the same as not applying it at all.
[Object mode] Object Data Properties > Vertex Group Context Menu
For every selected object, convert the active vertex color layer into a eponymous vertex group. To convert from RGB values to scalar weights either all channels are averaged or only individual ones are passed through.
[Object mode] Object > Join as Vertex Group
Join selected objects into the active object and create a vertex group for each joined-in object.
[Object mode] Object Data Properties > Vertex Group Context Menu
For every vertex group of every selected object, delete all groups not containing any weights above a given threshold.
[Object mode] Search
For every active UV map of every selected object, calculate the similarity to other maps and remove them if they fall under a given threshold. Similarity is computed by summing the absolute distances between each pair of UV coordinates in both compared maps.
[Object mode] Object > Apply
Circumvents the restriction that an object's transform can't be applied to its mesh if that mesh is shared with other objects. After applying the active object's transform to the mesh, the local transform of other instances is updated so that they stay in place.
Instead of setting the pivot point to the world origin, it can alternatively
be set to the cursor. This results in the same behaviour as the built-in
Set origin to 3D cursor
operator, with the distinction that other instances
are updated so that they don't jump around.
[Object mode] Object > Apply
Circumvents the restriction that modifiers can't be applied to linked data. The data block is copied, the given modifier applied to it, and then the original data block is overwritten with the copy for every selected object. If no object is selected in addition to the active one, all objects in the scene are considered selected.
[Object mode] Select > Select N Instances
For each data of selected objects, select N objects sharing the same data. This can be mesh-, light-, curve-, camera-, armature-data, etc. Even Empties are considered instances of another, since they all share 'None' as common data.
N is set by a lower and upper bound. Negative values count from the end of the instance list. For the upper bound, non-negative values less equal the lower bound are considered as infinity. The order of instances is determined by their occurrence in the scene hierarchy. A few examples:
- from 0 to 0: select all
- from 0 to 1: select first instance
- from 1 to 2: select second instance
- from 0 to -1: select all but the last instance
- from 5 to 0: select all from the fifth instance onward
- from 5 to 1: likewise
- from 5 to 5: likewise
- from -1 to 0: select nothing (not supported)
- from -1 to 3: likewise
- from -2 to -1: select last instance
Material Properties > Material Context Menu (v-shape under minus-sign)
For each active material of each selected object, search its node tree for a shader node and apply its properties to the material's viewport display properties. Optionally, do it the other way around: apply the viewport display properties to the shader node.