Generate floor boards quick and simple

I am updating this addon, check for an update this article.

I am currently enrolled in Andrew Price's Architecture Academy and in one of his tutorials he mentioned how easy it would be to have a simple script that could create floor boards suitable for architectural renders like those available in some other modelling packages. He even thought about asking someone to develop it but for some reason or other it never came te be.

Add Floor Boards

Because I think it would make a useful addition to the ArchViz' modeller 's tool set I put together a simple script Add Floor Boards. Once installed it can be found in the Add->Mesh menu at the to of the 3D view. Slap on a decent wood shader and you have a floor with real geometry in a few seconds.

The object that is generated by the script is a simple collection of rectangular faces adorned with a solidify and a bevel modifier so you can tweak some stuff even after the tool properties are no longer accessible.

Installation

  • Download the script from GitHub
  • Click File->User Preferences->Addons and click the install script from file
  • Don't forget to enable the add-on, it can be found in the Add Mesh section

Usage

After clicking Add->Mesh->Add Floor Board a default floor board is generated. The tool options should be self explanatory and are shown below:

Note that the measures are in blender units and the defaults reflect typical oak boards available at my local floor board dealer and are denoted in meters. (If you do archviz work it makes sense tp select some units in the scene options). Note that the variations in length and width are added to the base measurements so set them to zero if you want comlletely regular planks (a fixed width is quite common, a fixed length not so much as it leads to waste).

Blender addon to setup image based lighting (IBL) nodes in Cycles

setting up image based lighting (IBL) in Cycles isn't all that difficult but creating a versatile setup requires a lot of repetitive actions that lends itself well to automation. In this article I present a simple add-on that may be accessed from the Add menu in the node editor to quickly set up all the nodes for environment lighting.
Note: as of 2015/03/13 a bug fix release is available on GitHub.

The SIBL archive

One of the resources I find myself using quite often is the SIBL archive. Each archive is basically a directory (commonly packed as a .zip file) that contains both a high resolution backplate and HDR environment and reflection maps. It also contains an .ibl file that documents the resources available in the .zip file. The add-on uses this .ibl file to create all necessary nodes and references to the images. I am not sure how widely accepted the SIBL format is, but the add-on can also be used by simply selecting a .jpg and a .hdr file instead of a .ibl file so you are not restricted to just SIBL files.

Installation


Download the add-on
It is available on Github as a single file sibl.py. You can directly save it to your download directory via this link.
Install in Blender
Open the add-ons section of Blenders User Preferences and click Add external add-on. Select the downloaded file and click install. After installation you may find it in the Node section where you can activate it.

Usage

With a SIBL archive

Enable the add-on
In the add-ons section of the user preferences. It sits in the Node category.
Download a SIBL archive
Unzip the archive
Go to the World nodes
Click the world icon in the node editor.
Click Add -> Sibl Environment Setup
Select the .ibl file
Click Add Environment

With separate files

Enable the add-on
In the add-ons section of the user preferences. It sits in the Node category.
Go to the World nodes
Click the world icon in the node //editor.
Click Add -> General Environment Setup
Select one or two files
If you select more than one file, a file with a .hdr extension will be used as the environment lighting and the other one as the backplate.
Click Add Environment
After selecting the files the node setup will be displayed in the node editor. If there were any issues with the .hdr or backplate images the corresponding environment texture node is colored red. This may happen if the file is unreadable for some reason or if the the .ibl file points to non existing files.

Options

When the file selector is opened to allow you to select a file, some options are available in a panel on the left of the list of files:
Use reflection map
This one is only present when opening a .ibl file. It selects a higher resolution environment map suitable for glossy reflections (if available). You probably should only use this if you want to see the environment reflected in glossy surfaces because a reflection .hdr uses a lot more memory than a low resolution .hdr environment map.
Clear node tree
Uncheck this if you want to keep any existing nodes in the world node tree. If unchecked a world output node will be reused if present, as are any texture coordinate and light path nodes. Other nodes are untouched.

Implementation details

While developing this add-on I noticed that the [Environment] section in some .ibl files was spelled without an n. This is probably a bug but this add-on accepts both spellings. (An .ibl file is formatted as an .ini file, a common file format on windows and easily parsable with Python's configparser module.
All meta-data in .ibl files is ignored. This means any sun or additional key lights defined in the file are ignored. Also, all image files are currently assumed to be spherical (a.k.a. equirectangular or LatLong format, Blender's default mapping for environment textures). This means that light probe maps are currently not supported.

An OSL wood shader with knots for Blender Cycles

In a previous article I presented a shader that could be used to create the impression of knots in wood. This was accomplished by warping the texture coordinates around randomly distributed points in space.

Knots however do not resemble spheres but are more like cylinders that are cut under a slight angle. This distinction is not that important but for completeness sake we present this new implementation here together with a node setup that combines these knots with the wood shader we presented a while ago. An example result is shown below.

Code and example node setup

The implementation differs from the previous one in generating random lines (represented by a random point plus a random direction) instead of points. The texture coordinates are bent proportional to the distance to the closest point on this random line, so the bend() is a little bit more complicated than before.


vector random_sphere(point p, int n, float zdistribution){
float t = M_2PI*noise("cell",p,n*2+0);
float u = 2*noise("cell",p,n*2+1)-1;
float s,c,a;
sincos(t,s,c);
a = sqrt(1-u*u);
float x = a*c;
float y = a*s;
float z = u*zdistribution;
return vector(x,y,z);
}

int bend(vector p, vector k, vector kv, float r, float a, float m, output vector B){
vector pk = k - p;
vector t = dot(pk,kv)/dot(kv,kv);
vector D = k + t * kv - p;
float L = length(D);
if( L < r ){
float c = L/r;
float d = m * pow( 1 - c , a);
if( d < L ){
B = d * normalize(D);
return 1;
}else{
B = D;
return 2;
}
}
return 0;
}

shader knot(
vector Pos = P,
float Scale = 1.5,

float R = 2.9,
float Falloff = 2,
float Strength = 1,
float Knots=0.1,
float Z=1,

output vector Vec = P,
output float Fac = 0
){
vector p = Scale * Pos;
vector sdp = 0;

float TR = ceil(R);
for(float dx=-TR; dx <= TR; dx++){
for(float dy=-TR; dy <= TR; dy++){
for(float dz=-TR; dz <= TR; dz++){
vector ip = floor(p)+vector(dx,dy,dz);
for(int ik=0; ik < (int)Knots; ik++){
vector k = noise("cell",ip,ik);
vector kv= random_sphere(ip,ik+1000,Z);
vector dp= 0;
int ret = bend(p,ip+k,kv,R,Falloff,Strength,dp);
if(ret != 0){
Fac=max(Fac,ret==2);
sdp+=dp;
}
}
if( noise("cell",ip,-1) < mod(Knots,1.0) ){
vector k = noise("cell",ip,-2);
vector kv= random_sphere(ip,998,Z);
vector dp= 0;
int ret = bend(p,ip+k,kv,R,Falloff,Strength,dp);
if(ret != 0){
Fac=max(Fac,ret==2);
sdp+=dp;
}
}
}
}
}
if( Fac < 1 ){
Vec = p + sdp;
}else{
Vec = sdp;
}
}
Note that the function random_sphere() is modified from the one presented in a previous article to bias the vectors that are returned. This allows us to tweak the orientation of the generated knots, which might give more realisted results because branches (the source of the knots) are not pointing in all directions from the stem.

The node setup used to create the material in the example image is shown below (click to enlarge).

Room for improvement

The distribution of the knots might be convincing enough for our purposes but the material is now just another (darker) wood mzterial, rings and all. Quits a number of wood knots do look like that but a significant fraction shows characteristic radial cracks. This is caused when the wood is dried because the material properties of the knot are different from the surrounding wood. It would be nice if we could implement this in some way as well.