Re: Mi primer tutorial... Incorporar un script en blender.
Publicado: Vie Jul 15, 2005 1:57 pm
por silo
Hola Sliker.
Siguiendo el desarrollo sobre tema del script MHsssbeta04.py, deseo informarte que después de seguir las últimas recomendaciones que hacías sobre el mismo y siguiendo al pie de la letra tus instrucciones, al abrir nuevamente Blender éste no aparece en la pestaña \"Scripts Window/Materials\".
La versión de Blender que he usado es la 2.36 y la 2.37a y la versión Python 2.3
Como he visto que autorizas a publicar el código del script, lo inserto para ver si el fallo está visible:
****************************************
#inicio
#!BPY
\"\"\"
Name: \'MHsssbeta04\'
Blender: 237a
Group: \'Materials\'
Tip: \'MHSSSbeta04\'
\"\"\"
#fin
#(C)2005 Manuel Bastioni
#Thanks to Willian Padovani Germano
#Subsurface scattering beta4
#Under GPL license
print \"--------------------------------------\"
import Blender
from Blender import *
from math import *
from Blender.Draw import *
from Blender.BGL import *
from Blender import Camera
from Blender import Window
colors1= [Create(150), Create(150), Create(150)]
colors2= [Create(150), Create(150), Create(150)]
factor2 = Create(0.05)
samples= Create(20)
diffusion = Create(0.2)
factor = Create(1.5)
#Some vector-matrix functions
#############################
# returns Vector Length
def vlen(u):
return sqrt(u[0]**2 + u[1]**2 + u[2]**2)
def vdot(u, v):
return u[0]*v[0] + u[1]*v[1] + u[2]*v[2]
# returns a vector u-v
def vsub(u, v):
return [u[0]-v[0], u[1]-v[1], u[2]-v[2]]
# returns a vector u+v
def vadd(u, v):
return [u[0]+v[0], u[1]+v[1], u[2]+v[2]]
# returns a vector u*scalar
def vmul(u, s):
return [u[0]*s, u[1]*s, u[2]*s]
# returns a vector normalized
def vunit(u):
return vmul(u, 1/vlen(u))
def multmatvec4x3(m, v):
r = [0.0, 0.0, 0.0]
r[0] = v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0] + m[3][0]
r[1] = v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1] + m[3][1]
r[2] = v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2] + m[3][2]
return r
def mulmatvec3x3(m, v):
r = [0.0, 0.0, 0.0]
r[0] = v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0]
r[1] = v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1]
r[2] = v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2]
return r
#Main functions
#############################
def lightFromSource(sourceLights,objToIlluminate,fullColor,rampColor,minTollerance = 0,maxTollerance = 1,clear = 1):
vLights = {}
vNormls = {}
vCoords = {}
print \"Illumination using colors\", fullColor
if objToIlluminate.getType() == \"Mesh\":
mesh = objToIlluminate.getData()
m = objToIlluminate.getMatrix()
faces = mesh.faces
mesh.hasVertexColours(1)
if clear:
for f in faces:
for i in f.col:
i.r = 0
i.g = 0
i.b = 0
else:
print \"No obj selected for Ill\"
PupMenu(\"Error%t|No object selected\")
return
for v in mesh.verts:
vNormls[str(v)] = mulmatvec3x3(m, v.no) #local to global (no translation)
vCoords[str(v)] = multmatvec4x3(m, v.co) #local to global (tranlation too)
for sourceLight in sourceLights:
lightCoo = sourceLight.getLocation()
print \"NAME\",sourceLight.getName(), \"COOR\",lightCoo
for v in mesh.verts:
#print mesh.verts.index(v)
vCoo = vCoords[str(v)]
vNor = vNormls[str(v)]
lightVector = vunit(vsub(lightCoo,vCoo))
vertVector = vNor #The norm is already normalized
dotProd = vdot(lightVector,vertVector)
if dotProd > minTollerance and dotProd 255: vColR = 255
if vColG > 255: vColG = 255
if vColB > 255: vColB = 255
else:
vColR = int(fullColor[0]+(1-dotProd)*(rampColor[0]- fullColor[0]))
vColG = int(fullColor[1]+(1-dotProd)*(rampColor[1]- fullColor[1]))
vColB = int(fullColor[2]+(1-dotProd)*(rampColor[2]- fullColor[2]))
color = NMesh.Col(vColR,vColG,vColB,255)
vLights[str(v)] = color
for f in faces:
if len(f.col)==0:
f.col = []
for v in f.v:
f.col.append(NMesh.Col(0,0,0,0))
for v in f.v:
vIndx = f.v.index(v)
if vLights.has_key(str(v)):
f.col[vIndx].r += vLights[str(v)].r
f.col[vIndx].g += vLights[str(v)].g
f.col[vIndx].b += vLights[str(v)].b
mesh.update()
def illuminate(diffusion = 1,fullColor = [255,255,255],rampColor = [0,0,0]):
print \"START AUTOILLUMINATION\"
diffusion = 1-diffusion
time1 = sys.time()
try:
objToIll = Object.GetSelected()[0]
except:
print \"No obj selected for Ill\"
PupMenu(\"Error%t|No object selected\")
return
objects = Object.Get()
lighSources = []
for obj in objects:
if \'Lamp\' in obj.getName() or obj.getType() == \"Lamp\":
lighSources.append(obj)
lightFromSource(lighSources,objToIll,fullColor,rampColor,diffusion,1)
print \"Auto illumination time\", sys.time()-time1
def makeSSS(samples = 20, factor2=0.05, factor = 1.2):
print \"START SCATTERING\"
time1 = sys.time()
try:
object = Object.GetSelected()[0]
except:
print \"No obj selected for SSS\"
PupMenu(\"Error%t|No object selected\")
return
if object.getType() == \"Mesh\":
mesh = object.getData()
if not mesh.hasFaceUV() and not mesh.hasVertexColours():
PupMenu(\"Error%t|This mesh does not have vertex colors\")
Window.WaitCursor(0)
return
faces = mesh.faces
scatterVertsColor = []
for azz in range(len(mesh.verts)):
scatterVertsColor.append([0,0,0])
#print scatterVertsColor
for f in faces:
for v1 in f.v:
idx = f.v.index(v1)
vidx = v1.index
scatterVertsColor[vidx][0] = f.col[idx].r
scatterVertsColor[vidx][1] = f.col[idx].g
scatterVertsColor[vidx][2] = f.col[idx].b
for i in range (1,samples):
for f in faces:
Rmax=Gmax=Bmax=0
for c in f.col:
if c.r > Rmax: Rmax = c.r
if c.g > Gmax: Gmax = c.g
if c.b > Bmax: Bmax = c.b
for v1 in f.v:
idx = f.v.index(v1)
vidx = v1.index
if scatterVertsColor[vidx][0] < Rmax/factor:
scatterVertsColor[vidx][0] += int(Rmax*factor2)
if scatterVertsColor[vidx][1] < Gmax/factor:
scatterVertsColor[vidx][1] += int(Gmax*factor2)
if scatterVertsColor[vidx][2] < Bmax/factor:
scatterVertsColor[vidx][2] += int(Bmax*factor2)
for f in faces:
for v1 in f.v:
idx = f.v.index(v1)
vidx = v1.index
f.col[idx].r = scatterVertsColor[vidx][0]
f.col[idx].g = scatterVertsColor[vidx][1]
f.col[idx].b = scatterVertsColor[vidx][2]
mesh.update()
object.makeDisplayList()
time2 = sys.time()
print \"scattering time: \", time2 - time1
def saveParameters(fileName):
global colors1,colors2,samples,diffusion,factor2,factorl
dataFile = open(fileName,\"w\")
dataFile.write(str(colors1[0].val)+\"\\n\")
dataFile.write(str(colors1[1].val)+\"\\n\")
dataFile.write(str(colors1[2].val)+\"\\n\")
dataFile.write(str(colors2[0].val)+\"\\n\")
dataFile.write(str(colors2[1].val)+\"\\n\")
dataFile.write(str(colors2[2].val)+\"\\n\")
dataFile.write(str(samples.val)+\"\\n\")
dataFile.write(str(diffusion.val)+\"\\n\")
dataFile.write(str(factor.val)+\"\\n\")
dataFile.write(str(factor2.val)+\"\\n\")
dataFile.close()
def loadParameters(fileName):
global colors1,colors2,samples,diffusion,factor2,factor
dataFile = open(fileName,\"r\")
dataSSS = dataFile.readlines()
dataFile.close()
colors1[0].val=int(dataSSS[0])
colors1[1].val=int(dataSSS[1])
colors1[2].val=int(dataSSS[2])
colors2[0].val=int(dataSSS[3])
colors2[1].val=int(dataSSS[4])
colors2[2].val=int(dataSSS[5])
samples.val=int(dataSSS[6])
diffusion.val=float(dataSSS[7])
factor.val=float(dataSSS[8])
factor2.val=float(dataSSS[9])
Redraw()
def draw():
global colors1,colors2,samples,diffusion,factor2,factor
glClearColor(0.5, 0.5, 0.5, 0.0)
glClear(GL_COLOR_BUFFER_BIT)
glColor3f(float(colors1[0].val)/255,float(colors1[1].val)/255,float(colors1[2].val)/255)
glRectf(180,155,210,100)
glColor3f(float(colors2[0].val)/255,float(colors2[1].val)/255,float(colors2[2].val)/255)
glRectf(180,175,210,230)
glColor3f(1, 1, 1)
glRasterPos2i(10, 162)
Text(\"Subdermal scatter\",\'small\' )
colors1[0]= Slider(\"Rp: \", 2, 10, 140, 160, 18, colors1[0].val, 0, 255, 1)
colors1[1]= Slider(\"Gp: \", 2, 10, 120, 160, 18, colors1[1].val, 0, 255, 1)
colors1[2]= Slider(\"Bp: \", 2, 10, 100, 160, 18, colors1[2].val, 0, 255, 1)
glColor3f(1, 1, 1)
glRasterPos2i(10, 237)
Text(\"Epidermal scatter\",\'small\' )
colors2[0]= Slider(\"Rt: \", 2, 10, 215, 160, 18, colors2[0].val, 0, 255, 1)
colors2[1]= Slider(\"Gt: \", 2, 10, 195, 160, 18, colors2[1].val, 0, 255, 1)
colors2[2]= Slider(\"Bt: \", 2, 10, 175, 160, 18, colors2[2].val, 0, 255, 1)
glColor3f(1, 1, 1)
glRasterPos2i(10, 387)
Button(\"Exit\", 1, 10, 10, 40, 19)
Button(\"GO\", 3, 170, 10, 60, 60)
Button(\"Save\", 4, 50, 10, 60, 19)
Button(\"Load\", 5, 110, 10, 60, 19)
tooltip0 = \"Iteration. Hight value = increment of time calculation, better quality and more scattering\"
tooltip2 = \"Light Received\"
tooltip3 = \"Increase or decrease the scatter contrast and luminosity\"
tooltip4 = \"Density of material. Hight density, low scattering\"
samples= Number(\"Iteration: \", 2, 10, 30, 160, 20, samples.val, 10, 50,tooltip0)
diffusion= Number(\"Light Received: \", 2, 10, 50, 160, 20, diffusion.val, 0.1, 1,tooltip2)
factor2= Number(\"Scatter: \", 2, 10, 70, 110, 20, factor2.val, 0.01, 1,tooltip3)
factor= Number(\"Density: \", 2, 120, 70, 110, 20, factor.val, 0.1, 4,tooltip4)
glColor3f(1, 1, 1)
glRasterPos2i(10, 310)
Text(\"MAKEHUMAN SSS beta 4\" )
def event(evt, val):
if (evt== QKEY and not val): Exit()
def bevent(evt):
global colors1,colors2,samples,diffusion,factor2,factor
if (evt== 1): Exit()
elif (evt== 2): pass
elif (evt== 3):
Window.WaitCursor(1)
illuminate( diffusion.val,\\
[int(colors2[0].val),\\
int(colors2[1].val),\\
int(colors2[2].val)],\\
[int(colors1[0].val),\\
int(colors1[1].val),\\
int(colors1[2].val)])
makeSSS(samples.val,factor2.val, factor.val)
Window.WaitCursor(0)
elif (evt== 4):
Window.FileSelector (saveParameters, \"Save sss parameters\")
elif (evt== 5):
Window.FileSelector (loadParameters, \"Load sss parameters\")
Register(draw, event, bevent)
*******************************************
Quisiera encontrar el motivo que hace que en algunos casos no salga en la pestaña Materials.
Gracias por tu información que sin duda todos valoramos mucho.
Saludos