fredag 15 februari 2019

Loading morphs after anatomy has been merged.

You can load shapekeys to a mesh with the Import Morph(s) button. However, this only works as long as the mesh is intact, because morphs are stored as pairs of vertex numbers and offsets. If you change the mesh in any way, e.g. by merging anatomy or joining eyelashes to a Genesis 8 character, or if you delete or add any vertices manually, the vertex numbers are corrupted and the morphs can not be loaded. If you have spent a lot of time finishing your character, and then realize that you need to import another morph, what to do?

Fortunately, user engetudouiti came up with a clever trick for loading morphs to a merged character, using the plugin's ability to transfer shapekeys between meshes. This feature was originally intended for transferring corrective shapekeys from a character to her clothes, but here we use it backwards, and transfer shapekeys from a smaller mesh to the merged character.

Here is the recipe:

1. Import the character again on a new layer.
2. Delete all objects on this layer, except for those that you want to import morphs to.
3. Parent these meshes to the original armature. This step is necessary only if you use rig properties to drive the shapekeys, because the drivers look for the parents.
4. Import the morph to the new character or anatomy. This can now be done because it has the correct number of vertices.
5. Select the vertices of the merged mesh that are affected by the morphs.
6. With the merged character selected and the mesh with morphs active, press Transfer Other Shapekeys in the Morphs section.
7. Make sure that Selected Verts Only and Ignore Rigidity Groups are selected.
8. Delete the mesh with morphs.

The selection in step 5 is necessary because we transfer shapekeys from a small mesh to a bigger one, and we don't want vertices outside the small mesh's domain to be affected. Unfortunately, this step requires some manual work. This could have been avoided if you had created vertex groups containing the graft information before merging the meshes. If not, you must make the selection manually.

Here is how you would create the vertex groups:

With the character selected and the anatomy active, press Create Graft Groups in the Morphs section of the Advanced Setup panel. This creates two vertex groups for the character mesh: Graft_xxx and Mask_xxx, and one vertex group for the anatomy: Graft_xxx. Here xxx is the name of the anatomy mesh (not the object). After the anatomy has been merged with the character, the Graft_xxx vertex group consists of the vertices at the boundary of the anatomy. The vertices inside the boundary are those that should be affected by the morph and hence selected when the morphs are transferred.

tisdag 6 november 2018

Blender 2.80

The development version now runs on Blender 2.80. Or at least it runs on the version of Blender 2.80 that I downloaded a few days ago. There are still some issues, but most features seems to work as they do in Blender 2.79.

The most obvious difference is that the DAZ tab has moved from the T-shelf on the left of the viewport to the N-shelf on the right side. Not sure why add-ons cannot define tabs in the Tools shelf anymore, but so it is. Here is the same character imported into Blender 2.79 and Blender 2.80:

Blender 2.79

Blender 2.80
The development version can be downloaded from

The same changes have also been implemented on two of my other add-ons:
MHX 2 importer:
Those add-ons are not really supported anymore, but at least the basic features now work under Blender 2.80.

måndag 15 oktober 2018

Stable version 1.3.1

Originally I planned to wait with the next release until after Blender 2.80 was available. However, since the development version is so much better than version 1.3, especially when it comes to materials, I decided to make a new stable release, version 1.3.1. It can be downloaded from

The progress on materials, which I have already written about here, are due to many helpful bug reports by users engetudouiti and Alessandro Padovani. As I myself have a very limited understanding of Iray materials, and am not very good at Cycles either, these improvements could not have happened without their help.

The documentation has not been updated since version 1.3. The current user interface differs slightly from the one described in the documentation, but hopefully this should not cause serious problems. When you import a Daz file, the materials section in the import options now looks like this:
For opaque materials there are two options, depending on whether we want to use the principled node or not. For refractive materials there are three more options: the Guess option is good for eyes, and the Custom Shader is a quite complex node setup that should mimic refractive Iray materials very closely. Finally, the Environment checkbox allows us to import environment maps from Daz Studio. This is useful if you want to import complete Daz scenes, less so if you use Daz Studio as a character generator.

When the add-on is enabled, there is a warning message in the terminal: "Warning: This script was written Blender version 2.80.0 and might not function (correctly), though it is enabled". This is normal and nothing to worry about. The goal is that the future version 1.4 should run on both Blender 2.79 and 2.80, and as a first step in this direction the Blender version has been changed to 2.80.

torsdag 19 juli 2018

Bee reports about a new tool for arXiv users that she helped to create: Scimeter. Having been stuck for a decade and not really on speaking terms with the arXiv moderators, I haven't thought much about physics for the last decade, but here is the cloud that it produces for my arXiv papers:

 Couldn't have made it better myself.

måndag 16 juli 2018

Shells and Layered Images

In Daz Studio, a shell is a mesh with zero vertices that is used to add features to the materials of the base mesh. It can be used e.g. for makeup, tattoos and wounds. Shells are also used by Genesis 8 genitals to add color and effects without having to modify the torso material.

Importing the shells directly into Blender makes no sense, because they are empty meshes that don't show up in renders. Instead the Daz Importer uses the information in the shell materials to modify the materials of the base mesh. Here is an example where two bruises have been added to the face and one bruise has been added to the lips:
 The principled face material looks like this:
 The bruise textures are added to the face material inside the node group:
 This node group contains some redundant nodes, which hopefully will go away soon.

 A different way to add layers is to use the Layered Image Editor (LIE) in Daz Studio. Here we have added three small textures to the face texture.
After importing to Blender, the face looks like this. There was also added an extra texture to the lips material.
And here is the node group that computes the diffuse texture. The textures are placed using mapping nodes.

måndag 2 juli 2018

Stripped runtime system

In version 1.3 of the Daz importer the face bones drivers use Custom Driver Functions. This represents a major improvement compared to the methods used in earlier versions, because
  1. There no limit to the number of driving properties.
  2. Driver functions can be combined with other drivers.
  3. Performance is much better than with handlers.
However, there is a caveat. The add-on must always be enabled, because the drivers use the function evalMorph, which is defined by the add-on. This is not really a problem as long as you stay on the same computer, but if you send your blend file to another machine which does not have the Daz importer installed, the missing driver function will destroy the face pose completely. A typical situation where this problem may arise is if you send the blend files away to a render farm.

If you look in the DOS/terminal window, you find a lot of error messages of the form

Error in Driver: The following Python expression failed:
        'evalMorphs(self, 2, "Rot")'

Traceback (most recent call last):
  File "<bpy driver>", line 1, in <module>
NameError: name 'evalMorphs' is not defined

Thus clearly the problem is that the drivers for the face bones call the function evalMorphs, which is missing because it defined by the non-available import-daz add-on.

To solve this problem, the definition of evalMorphs and some necessary supporting code has been duplicated in the file, located in the folder with the same name under the import_daz directory. Since this addition is very recent, you need to download the latest development version of the add-on.

To use this file when the import-daz add-on is disabled, follow these steps:

In the Scripting context, select Open to open a text file.

Navigate to the file import-daz/runtime_stripped/

First enable the Register checkbox, and then press the Run Script button. Finally save the blend file.

Open the blend file again. Since it is the last file saved, it should be found at the top of the Open Recent... menu item.

And now the ugly face is replaced by a smile.

At least this works in this example. It is not clear to me if it will still work if you do batch rendering from a terminal, or if you have do some extra steps as well.

lördag 2 juni 2018

Material progress

With release 1.3 the Daz importer feels almost complete. I have started to use it for my own personal projects, and there is little that I want to change. However, there is one area that is still problematic: materials. This is not so surprising, because my understanding of Blender materials is poor and of Daz materials is almost non-existent.

Fortunately, recently Daz master Alessandro Padovani has stepped in with a number of bug reports that clarified a number of issues:
  • Daz textures are automatically multiplied with the color. In Blender, this multiplication has to be carried out explicitly.
  • Daz colors are sRGB whereas Blender uses a linear color space. This does not affect textures, which are automatically converted, but it changes pure colors.
  • Depending on the shader, specular maps are put in different channels: glossy color, glossy layered weight, specular color, etc.
However, the most important improvement is in the treatment of bump maps. The following picture illustrates the difference between stable 1.3 and the current development version for a Genesis 8 character, provided that the principled shader is used.

In Blender, the bump node depends on two parameters: strength and distance. In Iray, there is no distance parameter, so in 1.3 I assumed that it was 1 Daz unit, i.e. 1 cm. However, Alessandro figured out that the correct bump distance in Iray is 0.5 mm. In other Daz shaders such as 3Delight, the bump distance (or more exactly, bump max and min values) is explicitly available, and is typically 1 or 2 mm. To eliminate the worst artefacts, version 1.3 had two import options with which one could change the bump strength and subsurface distance, which also affects the bumpiness. Since bump maps are now imported correctly, these options have been removed.

In plain Cycles, without the principled shader, the situation was not so bad, as show in the picture below. However, this was really due to cheating. To avoid the extreme bumpiness, in version 1.3 the bump map only affected the diffuse channel, but not SSS or translucency. In the development version, the bump map affects all three channels, but the skin still looks ok due to the reduced bump distance. This trick was not possible with the principled shader, because it only has one Normal input which affects both base color and SSS.

Another difference is that the transparency option has disappeared in the development version. This was originally introduced for debug purposes, because I did not understand how to handle refraction correctly. In the current version, the refraction channel in Daz is mapped to a Refraction node in Cycles, and to the Transmission input in the principled node if that is enabled. There remains an option to mix the result with a Transparency node, because sometimes the pure result tends to be not so good.

Here is an eye rendered in plain Cycles with the Mix Transparancy Factor set to 0.0, 0.5 and 1.0, respectively.

And here is the same eye, but loaded with Principled Shader enabled.