Caveat, lots of hard-coded material file and path stuff in this script, all of which will eventually be in dictionaries/collections. This is all very much proof of concept. In order for it to work, you’ll need to take these steps (I know, too much busy-work :eek:):
– Save the content of the above script to a plain-text editor file, call it whatever you want.
(I call mine ‘FullSkin024.py’, because it’s Python code, version .24.)
– Open Blender (getting rid of the default cube and that)
– File -> Import -> Wavefront (obj) … navigate to your Vicky, select her OBJ (not her MTL), then chose the following Import settings:
---- Untick Smooth Groups and untick Lines and everything in Split By
---- Tick Keep Vert Order and tick Poly Groups
– Import OBJ
– Click on her in the scene, then hit [S] (for scale), 10
– Select Scripting from the Scene Selector (next to ‘Help’) - usually says ‘Default’ by default 
– In the Text Editor section, select Open and navigate to the code file (the one I call ‘FullSkin024.py’)
– Scroll down to line 44 and make changes to:
---- path
---- name of your Vickie - whatever she’s called in Outliner
---- the names of your V4 texture (colour) and bump files for the face, torso and limbs
– Run the script
This will only work for the Victoria 4 figure for Daz-Studio / Poser and will only do skin, so far:
# FullSkin024.py
#
# Copyright (c) 25-Oct-2015, Robyn Hahn
#
# ***** BEGIN GPL LICENSE BLOCK *****
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ***** END GPL LICENCE BLOCK *****
bl_info = {
"name": "Simple skin shader for Poser Figures",
"author": "Robyn Hahn",
"version": (0, 2, 4),
"blender": (2, 76, 0),
"location": "-= Not a real addon For Blender, yet =-",
"description": "Generates a simple Cycles shader for a Poser figure",
"warning": "early development",
"wiki_url": "http://0.0.0.1",
"category": "Simple Material Script"}
import bpy
import os.path
"""
So far, this will set the shader for all skin materials - more to come.
These are the items you change:
path ... the fully-qualified path to your texture files like C:\MyDir\MyTex\
figurObj ... the name of your imported V4 figure
clr files... colour maps
bmp files... bump maps
"""
path = '/home/robyn/Documents/Blender/Projects/AllTextures/AllSkin/textures/'
figurObj = 'V4'
clrLimbs = 'Syri_Limbs.jpg'
bmpLimbs = 'Syri_LimbsB.jpg'
clrTorso = 'Syri_Torso.jpg'
bmpTorso = 'Syri_TorsoB.jpg'
clr_Face = 'Syri_Face.jpg'
bmp_Face = 'Syri_FaceB.jpg'
# sets renderer to Cycles
if bpy.context.scene.render.engine == 'BLENDER_RENDER':
bpy.context.scene.render.engine = 'CYCLES'
# class builds mat-specific node set (shader)
class buildShader():
def __init__(self, cObj, cRegion, ImgClr, ImgBum=None):
self.selObj = cObj
self.Region = cRegion
self.ImgCol = ImgClr
self.ImgBmp = ImgBum
self.selObj.select = True
self.selMats = self.selObj.active_material
self.selMats.use_nodes = True
self.treeNodes = self.selMats.node_tree
self.nodeLinks = self.treeNodes.links
self.makeSkin()
def makeSkin(self):
# clears existing nodes, if any
for n in self.treeNodes.nodes:
self.treeNodes.nodes.remove(n)
# create nodes: Texture Coordinate and Mapping
shaTcd = self.treeNodes.nodes.new('ShaderNodeTexCoord')
shaMap = self.treeNodes.nodes.new('ShaderNodeMapping')
# create node: Colour Image Texture
ImgCol = self.treeNodes.nodes.new('ShaderNodeTexImage')
ImgCol.image = self.ImgCol
ImgCol.color_space = 'COLOR'
# create node: Bump Image Texture
ImgBmp = self.treeNodes.nodes.new('ShaderNodeTexImage')
ImgBmp.image = self.ImgBmp
ImgBmp.color_space = 'NONE'
# create nodes: Diffuse, set second input [1] roughness to .15
shaDif = self.treeNodes.nodes.new('ShaderNodeBsdfDiffuse')
shaDif.inputs[1].default_value = .15
# create node: Translucent
shaTrn = self.treeNodes.nodes.new('ShaderNodeBsdfTranslucent')
shaTrn.inputs[0].default_value = [.8, .22, .06, 1]
# create node: Glossy
shaGls = self.treeNodes.nodes.new('ShaderNodeBsdfGlossy')
shaGls.inputs[1].default_value = .12
# create node: Mix-RGB
clrMix = self.treeNodes.nodes.new('ShaderNodeMixRGB')
clrMix.inputs[0].default_value = .1
clrMix.inputs[2].default_value = [.5, .35, .275, 1]
mathMl = self.treeNodes.nodes.new('ShaderNodeMath')
mathMl.operation = 'MULTIPLY'
mathMl.inputs[1].default_value = .01
shaMx3 = self.treeNodes.nodes.new('ShaderNodeMixShader')
shaMx2 = self.treeNodes.nodes.new('ShaderNodeMixShader')
shaMx1 = self.treeNodes.nodes.new('ShaderNodeMixShader')
# create node: Material Output (sort-of like PoserSurface)
shaOut = self.treeNodes.nodes.new('ShaderNodeOutputMaterial')
# Set node locations, roughly
shaTcd.location = -850, 300
shaMap.location = -600, 300
ImgCol.location = -200, 400
ImgBmp.location = -200, 200
shaDif.location = 0, 400
shaTrn.location = 0, 200
clrMix.location = 0, 100
shaMx3.location = 200, 400
shaMx2.location = 400, 400
shaGls.location = 400, 100
shaMx1.location = 600, 400
mathMl.location = 600, 100
shaOut.location = 800, 300
# Link nodes: tex cood and mapping
self.nodeLinks.new(shaTcd.outputs[2], shaMap.inputs[0])
self.nodeLinks.new(shaMap.outputs[0], ImgCol.inputs[0])
self.nodeLinks.new(shaMap.outputs[0], ImgBmp.inputs[0])
# Link nodes: clr and bmp
self.nodeLinks.new(ImgCol.outputs[0], shaDif.inputs[0])
self.nodeLinks.new(ImgCol.outputs[0], clrMix.inputs[1])
self.nodeLinks.new(ImgBmp.outputs[0], mathMl.inputs[0])
# Mixing colorMap and Translucent ( reddish )
self.nodeLinks.new(shaDif.outputs[0], shaMx3.inputs[1])
self.nodeLinks.new(shaTrn.outputs[0], shaMx3.inputs[2])
shaMx3.inputs[0].default_value = .065
# Mixing ClrMap/Translu and ClrMix ( beige )
self.nodeLinks.new(shaMx3.outputs[0], shaMx2.inputs[1])
self.nodeLinks.new(clrMix.outputs[0], shaMx2.inputs[2])
shaMx2.inputs[0].default_value = .05
# Mixing ClrMap/Transl/ClrMix and Glossy
self.nodeLinks.new(shaMx2.outputs[0], shaMx1.inputs[1])
self.nodeLinks.new(shaGls.outputs[0], shaMx1.inputs[2])
shaMx1.inputs[0].default_value = .05
# Output
self.nodeLinks.new(shaMx1.outputs[0], shaOut.inputs[0])
self.nodeLinks.new(mathMl.outputs[0], shaOut.inputs[2])
return self.selMats
# make sure your figure is selected and nothing else
# bpy.ops.object.select_all(action='DESELECT')
bpy.context.object.active_material_index = 0
curr_obj = bpy.data.objects[figurObj]
for i in range(27):
bPasteTex = False
curr_obj.active_material_index = i
matName = curr_obj.active_material.name
matType = matName[0:1]
if matType == '3':
img_Clr = clrLimbs
img_Bmp = bmpLimbs
bPasteTex = True
if matType == '2':
img_Clr = clrTorso
img_Bmp = bmpTorso
bPasteTex = True
if matType == '1':
img_Clr = clr_Face
img_Bmp = bmp_Face
bPasteTex = True
if bPasteTex:
ImgColour = path + img_Clr
ImgBump = path + img_Bmp
imgC = bpy.data.images.load(filepath = ImgColour)
imgB = bpy.data.images.load(filepath = ImgBump)
newMat = buildShader(curr_obj, 'Skin', imgC, imgB)
Very much proof-of-concept, thus far.