XSIforum.com

Foros 3D => Autodesk Softimage => Rigging y Scripting => Mensaje iniciado por: gerardoxsi en 10 Julio 2010, 15:41:20

Título: conexion python
Publicado 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.

Código: [Seleccionar]
#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()

Citar
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
Título: Re: conexion python
Publicado por: gerardoxsi en 10 Julio 2010, 15:54:53
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>>

Título: Re: conexion python
Publicado por: alanf en 10 Julio 2010, 17:38:46
<COMObject <unknown>> es correcto, porque es un objeto. No es como MEL que todo es un string.


Este codigo si funciona:

Código: [Seleccionar]
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

Código: [Seleccionar]
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()
Título: Re: conexion python
Publicado por: gerardoxsi en 10 Julio 2010, 19:11:46
muchas gracias alan!!!  ahora he avanzado un paso!   O0

la parte donde no me aclaro mucho es esta:

Citar
"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?
Título: Re: conexion python
Publicado por: Cesar Saez en 10 Julio 2010, 19:24:44
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 ;)
Título: Re: conexion python
Publicado por: gerardoxsi en 10 Julio 2010, 19:45:06
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!
Título: Re: conexion python
Publicado por: gerardoxsi en 10 Julio 2010, 19:55:52
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!
Título: Re: conexion python
Publicado por: Cesar Saez en 10 Julio 2010, 19:57:40
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)
Título: Re: conexion python
Publicado por: gerardoxsi en 10 Julio 2010, 20:18:16
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?
Título: Re: conexion python
Publicado por: Cesar Saez en 10 Julio 2010, 20:22:23
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 :)
Título: Re: conexion python
Publicado por: gerardoxsi en 10 Julio 2010, 20:23:57
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
Título: Re: conexion python
Publicado por: gerardoxsi en 10 Julio 2010, 20:57:14
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!
Título: Re: conexion python
Publicado por: gerardoxsi en 10 Julio 2010, 21:36:31
y si necesito multiples "doritos" como hago?
Título: Re: conexion python
Publicado por: Cesar Saez en 10 Julio 2010, 22:26:07
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.
Título: Re: conexion python
Publicado por: gerardoxsi en 10 Julio 2010, 22:35:28
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.
Título: Re: conexion python
Publicado por: Cesar Saez en 10 Julio 2010, 23:00:35
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.
Título: Re: conexion python
Publicado por: gerardoxsi en 11 Julio 2010, 11:00:21
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
Título: Re: conexion python
Publicado por: sirdavid32 en 24 Agosto 2010, 22:13:16
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.