PDA

View Full Version : XSI script - cap holes


la_piaga
24-02-2005, 13:18
Sto studiando xsi 4.2 che mi sta davvero illuminando (al punto che ho messo pure l'avatar :asd: ) anche se, come ogni suo concorrente, ha qualche neo, uno di questi è la mancanza di un comando per riempire automaticamente i "buchi" negli oggetti poligonali, funzione che si può però realizzare in pochi secondi con uno scriptino:
dopo avere selezionato gli edges costituenti il bordo:
- duplicarli
- passare alla selezione dei punti facenti capo agli edges
- collassarli
- dissolvere il punto risultante

Fortunatamente quelle sopra elencate sono tutte funzioni embeeded in xsi e possono essere tradotte in un vbscript come questo:

Function capHoles( )
dim localVar
set localVar=getvalue("selectionlist")
'copia edges
DuplicateMeshComponent localVar, siPersistentOperation
'selezione vertici appartenenti agli edges
selectAdjacent, "point", false
set localVar=getvalue("selectionlist")
'saldatura vertici nell'average point
WeldPoints localVar
set localVar=getvalue("selectionlist")
'dissoluzione vertice risultante
ApplyTopoOp "DissolveComponent", localVar, siUnspecified, siPersistentOperation
DeselectAll
End Function

L'ho immesso come custom command e l'ho bindato ad un tasto (shift/c) Però quando lo lancio risulta esserci un errore alla linea selectAdjacent... e la cosa curiosa è che sintatticamente è corretto perche se lo immetto passo-passo nel command box non mi da nessun errore ed il risultato è quello che mi aspetto; altresì non da errori e tutto procede liscio se lo spezzo in due scripts divisi appena sopra la linea incriminata (sai che pizza e che bruttura dovere immettere due comandi in successione per una semplice funzione...).

Non mi sembra ci siano molti utenti xsi qui ma tentar non nuoce :) . Qualche idea?

luca72.lws
24-02-2005, 15:03
In lightwave , basta selezionare i punti di contorno del buco, poi premi "p" per creare un poligono di chiusura (lo saprai) , però la selezione dei punti deve essere tassativamente fatta in maniera sequenziale partendo da un punto(o oraria o antioraria) , per cui nel tuo script magari passando da edges a punti non viene tenuto in considerazine l'ordine di selezione dei punti?


Può essere?

:)

la_piaga
24-02-2005, 15:22
Da quanto mi dici i principi di funzionamento sono differenti: lw genera come hai detto un poligono "tappo" utilizzando i vertici indicati perciò bisogna utilizzare la regola della mano destra (vertici collegawti in senso antiorario, dal palmo alle dita -> normale uscente, dal palmo al pollice).
Lo script qui sopra invece fisicamente genera a partire dai bordi del buco un "orlo" di qudrilateri mediante la copia dei bordi stessi (che si può intendere come un'estrusione a spessore 0) poi prende i vertici più interni e semplicemente li collassa nel punto medio ottenendo una serie di triangoli (che poi andranno dissolti), per questo non importa l'ordine. Comunque grazie lo stesso :)

kawallo
24-02-2005, 22:09
Gli script non ho ancora avuto modo di studiarli, ma in teoria il tuo procedimento non fa una piega.
Ad ogni modo ho trovato una discussione sul forum di XSI Base che potrebbe interessarti: http://www.xsibase.com/netview_forum/index.php?board=10;action=display;threadid=12531

la_piaga
24-02-2005, 23:53
Originariamente inviato da kawallo
Ad ogni modo ho trovato una discussione sul forum di XSI Base che potrebbe interessarti: http://www.xsibase.com/netview_forum/index.php?board=10;action=display;threadid=12531
L'avevo adocchiata pure io ma 'sta gente non ha decisamente afferrato il principio di funzionamento del "bridge boundary edges". Il sistema che propongono con tanta enfasi non funziona affato, o meglio funziona in caso le edges siano tutte corrispondenti su lati opposti quindi in casi molto rari :(

kawallo
25-02-2005, 00:43
Sì, ma gli RCTools sembrano funzionare bene. Io ho cappato i poligoni nell'immagine allegata senza problemi.

la_piaga
25-02-2005, 02:32
Originariamente inviato da kawallo
Sì, ma gli RCTools sembrano funzionare bene. Io ho cappato i poligoni nell'immagine allegata senza problemi.
Si, però mi seccava installarli per la sola funzione di capping, il resto (loop selections etc.) è stato tutto implementato in nativo in xsi 4.2

Curiosità: usi la selezione dei components stile windows od extended stile softimage|3d?
Io personalmente sto tentando la strada extended (ovviamente bindando il "deselect all" su di un tasto più accessibile di shift+ctrl+a :rolleyes: ) anche se sarebbe necessario per un workflow liscio avere allo steso tasto associato sia il deselect all che il drop tool cosa che non sono ancora riuscito a realizzare... Sono proprio un noobone! :cry:

luca72.lws
25-02-2005, 13:16
Queso lo conoscevi già? (però lo script è stato fatto per la v1.5 , non sò se funzioni anche per la 4.2)

http://www.edharriss.com/tutorials/tutorial_xsi_cap_holes/Cap%20Holes/How%20to%20cap%20holes%20in%20Softimage%20XSI.htm

Si in effetti il "bridge tool" (se funzia come in LW8) non vedo come possa essere utilizzato!

(ah............ forse ho capito! , ma lo scriptino non serve!)


:)

la_piaga
25-02-2005, 13:28
Ah, buono a sapersi, il dissolve prima fonde poi elimina i components, non c'è bisogno di effettuare il welding preventivo.
Comunque stessa storia, si comporta allo steso modo :(

luca72.lws
25-02-2005, 13:46
Originariamente inviato da la_piaga

Comunque stessa storia, si comporta allo steso modo :(

Allora ti disegni il tappo separatamente , poi selezioni prima il tappo e poi il body e li unisci col bridge tool (vado a naso perchè io ho ancora LW 7.5 senza il bridge tool)



:)

la_piaga
25-02-2005, 13:58
Non è tanto il modo di realizzare la cosa (in fin dei conti anche usando il metodo dello script però manualmente ci si impiega un attimo, poi non è che debba tappare buchi tutto il tempo... :D ) quanto il capire perchè questo script non funzioni, considerato il fatto che, come dicevo, immettendo le linee passo-passo nel command box tutto va a buon fine.
Poi avrei un altro paio di scripts da realizzare per rendere xsi perfetto per le mie esigenze di modellazione, ma se non riesco a fare funzionare questo, che è di gran lunga il più semplice, figuriamoci gli altri! :muro:

la_piaga
27-02-2005, 21:50
Ce l'ho fatta! :winner:
E' proprio una strana faccenda questa, che peraltro ho risolto in modo decisamente poco elegante, ma funziona e non fa casino, questo è l'importante.
Probabilmente xsi non aggiorna istantaneamente le componenti adiacenti ed accedervi subito dopo la duplicazione lo mandava in bestia; quindi ho messo una traslazione nulla subito dopo la generazione del duplicato e così funziona a dovere.
Inoltre a differenza di ciò che suggerisce il tizio del sito segnalatomi da luca72.lws ho anche lasciato la saldatura dei vertici prima della dissoluzione perchè in assenza di essa si creano fastidiose inversioni di normali quando si lavora su buchi "complessi".

Per chiunque sia interessato questo è il sorgente funzionante (in attesa di trovare qualcosa di più elegante di una traslazione perdi tempo...) del capHoles per xsi 4.2 have fun! :)

Function capHoles( )
dim localVar
set localVar=getvalue("selectionlist")
DuplicateMeshComponent localVar
Translate localVar, 0, 0, 0
SelectAdjacent,"point"
set localVar=getvalue("selectionlist")
WeldPoints localVar
set localVar=getvalue("selectionlist")
ApplyTopoOp "DissolveComponent", localVar, siUnspecified, siPersistentOperation
DeselectAll
ActivateRaycastEdgeSelTool
End Function