XSIforum.com
Foros 3D => Autodesk Softimage => Rigging y Scripting => Mensaje iniciado por: gerardoxsi en 10 Julio 2010, 15:41:20
-
Hola a todos
Estoy usando softi 2010 x64 SP1, y python
Lo he instalado siguiendo este tutorial: Installing Python for Softimage (http://vimeo.com/12097088)
cuando intento introduccir el siguiente script, me da error, bueno, me dice que no tengo ningun componente seleccionado, aún cuando SI tengo uno seleccionado.
#imports
import win32com.client
from win32com.client import constants
#globals
xsi = win32com.client.Dispatch( "XSI.Application" ).Application
xsiPrint = xsi.LogMessage
def setupDorrito():
if xsi.Selection < 1:
xsiPrint("Select an component!",constants.siError)
return False
root = xsi.ActiveSceneRoot
#create cluster constrained null, setup its look
clsCnsNull = root.AddNull("clsCnsNull")
clsCnsNull.primary_icon.value = 0
clsCnsNull.size.value = 0.1
clsCnsNull.shadow_icon.value = 7
clsCnsNull.shadow_colour_custom.value = 1
clsCnsNull.B.value = 1
clsCnsNull.G.value = 0.5
#make cluster from selection
subComponent = xsi.Selection(0).subComponent
cnsCls = subComponent.CreateCluster("cnsCls")
#constrain object to cluster
cns = clsCnsNull.Kinematics.AddConstraint("ObjectToCluster",cnsCls)
cns.tangent.value = 1
cns.dirx.value = 0
cns.diry.value = -1
cns.upvct_active.value = 1
cns.upx.value = 1
cns.upy.value = 0
#make dorrito
dorrito = root.AddNull("dorrito")
dorrito.primary_icon.value = 0
dorrito.size.value = 0.2
dorrito.shadow_icon.value = 8
dorrito.shadow_colour_custom.value = 1
dorrito.G.value = 1
dorrito.shadow_offsetX.value = 0.1
dorrito.shadow_scaleX.value = 0
clsCnsNull.AddChild(dorrito)
dorrito.kinematics.local.transform = XSIMath.CreateTransform()
setupDorrito()
Fuente: http://www.softimageblog.com/archives/209 (http://www.softimageblog.com/archives/209)
creo que el error es la conexión que hace el script con phyton y softimage, o me equivoco?
porque obtengo el error?
Muchas gracias de antemano
-
mnn quizas la conexión no es el problema
ya que si hago un
xsiPrint (xsi)
obtengo:
# INFO : C:\Softimage\Softimage_2010_SP1_x64\Application\bin\XSI.exe
pero si selecciono unos vertices, y hago
xsiPrint (xsi.Selection)
obtengo:
# INFO : <COMObject <unknown>>
-
<COMObject <unknown>> es correcto, porque es un objeto. No es como MEL que todo es un string.
Este codigo si funciona:
from win32com.client import constants
xsi = Application
xsiPrint = xsi.LogMessage
def setupDorrito():
if xsi.Selection.Count < 1:
xsiPrint("Select an component!",constants.siError)
return False
root = xsi.ActiveSceneRoot
#create cluster constrained null, setup its look
clsCnsNull = root.AddNull("clsCnsNull")
clsCnsNull.primary_icon.value = 0
clsCnsNull.size.value = 0.1
clsCnsNull.shadow_icon.value = 7
clsCnsNull.shadow_colour_custom.value = 1
clsCnsNull.B.value = 1
clsCnsNull.G.value = 0.5
#make cluster from selection
subComponent = xsi.Selection(0).SubComponent
cnsCls = subComponent.CreateCluster("cnsCls")
#constrain object to cluster
cns = clsCnsNull.Kinematics.AddConstraint("ObjectToCluster",cnsCls)
cns.Parameters("tangent").Value = True
cns.Parameters("dirx").Value = 0
cns.Parameters("diry").Value = -1
cns.Parameters("upvct_active").Value = True
cns.Parameters("upx").Value = 1
cns.Parameters("upy").Value = 0
#make dorrito
dorrito = root.AddNull("dorrito")
dorrito.primary_icon.value = 0
dorrito.size.value = 0.2
dorrito.shadow_icon.value = 8
dorrito.shadow_colour_custom.value = 1
dorrito.G.value = 1
dorrito.shadow_offsetX.value = 0.1
dorrito.shadow_scaleX.value = 0
clsCnsNull.AddChild(dorrito)
dorrito.kinematics.local.transform = XSIMath.CreateTransform()
setupDorrito()
y
from win32com.client import constants
xsi = Application
xsiPrint = xsi.LogMessage
# You add the dorito as a deformer, then select the parent and then the dorito null, then run:
def setupStaticState():
defList = []
clsList = []
for i in xrange(0,len(xsi.Selection),2):
clsList.append(xsi.Selection(i))
defList.append(xsi.Selection(i+1))
for a,b in zip(defList,clsList):
defKineState = a.Properties("Static_KineState")
clsKine = b.Properties("Kinematics")
defKineState.Parameters("orix").AddExpression(clsKine.FullName + ".global.rotx")
defKineState.Parameters("oriy").AddExpression(clsKine.FullName + ".global.roty")
defKineState.Parameters("oriz").AddExpression(clsKine.FullName + ".global.rotz")
defKineState.Parameters("posx").AddExpression(clsKine.FullName + ".global.posx")
defKineState.Parameters("posy").AddExpression(clsKine.FullName + ".global.posy")
defKineState.Parameters("posz").AddExpression(clsKine.FullName + ".global.posz")
# Steven forgot to do scaling. (It's important!)
defKineState.Parameters("sclx").AddExpression(clsKine.FullName + ".global.sclx")
defKineState.Parameters("scly").AddExpression(clsKine.FullName + ".global.scly")
defKineState.Parameters("sclz").AddExpression(clsKine.FullName + ".global.sclz")
setupStaticState()
-
muchas gracias alan!!! ahora he avanzado un paso! O0
la parte donde no me aclaro mucho es esta:
"I now need to paint the cloned mesh’s envelope. The way I do this is add another deformer to the deformer list, set all the points to 100 % of this new deformer, and then choose the Dorrito and paint it’s influence. Once I am happy with the deformation I just remove the extra deformer from the envelope and I get zero weights except for where I painted the Dorrito’s influence. This deformer moves with the cluster constrained null, but it causes this nasty double transform when I rotate the head!"
ya le he implementado el "dorito" a mi mesh original.
se supone que el "cloned" ya tiene un pesado heredado del original, no?
he de añadir el dorito como envelope... cuando lo añado, es el único deformador que me sale!
aqui es donde no me aclaro mucho con los envelopes
el tutorial dice "set all the points to 100 % of this new deformer"... pero es que ya los tengo al 100% según el weight editor, aunque me siguen influenciando los deformadores que le aplique al mesh original.
"and then choose the Dorrito and paint it’s influence."... ahora que?... he de restar influencia (ya que la tengo al 100%) donde no quiero que deforme el dorito?
-
Agrega un deformador temporal y asigna un 100% en todos los puntos para ese deformador, pesa el dorito localmente como te apetezca y luego borra el deformador temporal ;)
-
haaa... creo un null, le hago un envelope a mi cloned con ese null, y luego añado el dorito a ese envelope!
otro paso más resuelto
ahora bien, selecciono el cluster "cnsCls" (en mi mesh original) y luego el Dorito.
paso el segundo script obtengo un error:
# ERROR : Traceback (most recent call last):
# File "<Script Block >", line 28, in <module>
# setupStaticState()
# File "<Script Block >", line 17, in setupStaticState
# defKineState.Parameters("orix").AddExpression(clsKine.FullName ".global.rotx")
# AttributeError: 'NoneType' object has no attribute 'FullName'
# - [line 17]
falta poco!
-
oppsss... que tonto!
seleccionaba el cluster en vez del null!!!
ya ya me funciona.... gracias a ambos!
da un gusto estar entre tanto talento en este foro!
-
Falta concatenar los strings con un signo + en la linea 17
Debería ser:
defKineState.Parameters("orix").AddExpression(clsKine.FullName + ".global.rotx")
o bien:
defKineState.Parameters("orix").AddExpression("%s.global.rotx" % clsKine.FullName)
-
el siguiente paso sería poder controlar los shapes con el dorito.
cuando intento hacer la conección de parametros del dorito con el shape, me sale un mensaje de advertencia sobre ciclos.
¿es normal?... o me la he vuelto a liar?
-
Te has vuelto a liar, toda la movida es para evitar los ciclos :P
Relee el texto en xsi-blog y reproducelo con algo simple (¿una esfera con 2 shapes?), no es tan dificil como parece, para entenderlo incluso te diría que pases de los scripts, así sabrás exactamente que estás haciendo y porque funciona como funciona :)
-
si, bueno.. estaba practicando esto con un cilindro, un simple shape y dos huesos... voy a repasarmelo de nuevo.
gracias cesar! ... a ver si salgo de esta
-
Te has vuelto a liar, toda la movida es para evitar los ciclos :P
este "tutorial" va muy bien si quieres tener un cluster por encima de los huesos... pero si lo que quiero es que mi dorito no sea un "cluster" (en el sentido "maya"), sino que sea un driver de unos shapes?... por eso es que me adverita lo de dobles transformaciones.
en mi caso particular, quiero es tener un controlador de shapes pegado a la geometria que deforma, sin tener dobles transformaciones cuando use los huesos.
Me explico?
y gracias de nuevo por vuestro tiempo!
-
y si necesito multiples "doritos" como hago?
-
El objetivo de esto es poder tener un objeto que siga a la geometría deformada por shapekeys y que pueda deformar a la geometría que sigue de forma que mientras siga la deformación provocada por el shapekey no halla doble transformación (shapes -> huesos).
Para lo que describes (huesos -> shapes) bastaría con vincular un null al hueso más cercano, vincular el control a ese nulo para tener transformaciones limpias y atar mediante una expresión o un link with el shape correspondiente.
-
y para un lattice.
supongamos que tengo un lattice para todo un personaje, que me le hace squash y strech. etc
ese lattice me modifica la posición de los vertices de mi personaje.
como mantengo los huesos de mi personaje y controladores de shapes en posición sin que hagan dobles transformaciones?
si los huesos , o un null padre de ellos, tienen un constraint to cluster en unos vertices que estan moviendose por el lattice, tendre doble transformaciones.
-
No entiendo el problema, si el lattice va sobre el envelope la cabeza no debería tener ningún problema, primero se deforma (parpadeando, sonriendo, etc) y luego calcula la deformación del lattice haciendo S&S.
-
Tengo este ejemplo.... pongamos una celula, por decir algo
quiero modificar toda la celula con el lattice, pero las patas las quiero mover con esos huesos:
(http://img130.imageshack.us/img130/3182/lattice.jpg)
los nulls de aros (amarillo y azul) encima del personaje controlan el lattices.
tengo 2 clusters, uno para cada base de cada pata.
si hago un constraint de los roots de las cadenas de huesos a dichos clusters obtendre ciclos.
aqui está la escena (xsi 2010 sp1): http://rapidshare.com/files/406299543/celula.scn
Gracias como siempre por tu valioso tiempo
-
Por eso es que siempre digo que un video vale mas que mil palabras.
Sería un aporte valiosisimo repasar esto con el resto del equipo.
Saludos.