Blender Italia forums ArtWork Work in Progress [wip]Script Grid Cap

Status della richiesta: Non è una richiesta di supporto
Stai visualizzando 25 post - dal 1 a 25 (di 73 totali)
  • Autore
    Post
  • LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #17885

    Sono molto fiero di presentare questo mio progetto, più che altro perchè ci sto lasciando mezzo cervello sopra, e poi perchè a quanto pare se ad uno serve uno script se lo deve fare, e io ci sto riuscendo. Premetto che è un wip, e quindi non è ancora completo. Ma credo di aver superato la parte più difficile.

    Si tratta di uno script che permette di chiudere un buco di una mesh (o più in generale una certa selezione), con una griglia di facce che sia il più geometricamente corretta possibile rispetto alla forma del bordo della selezione fornita dall'utente.

    Il punto a cui sono arrivato è quello di far riconoscere a Blender la selezione fornita e dirgli come mettere in ordine i vertici da unire in base al lato del buco in cui si trovano.

    Posto delle immagini in modo che si capisca bene cosa intendo. Lo script al momento non crea ancora le facce, ma si limita ad unire i vertici corretti con un singolo edge.

    Caso1: il caso più semplice. Gli angoli della griglia che dovrà  formarsi sono vertici con 4 edge uniti. E' relativamente facile dire a Blender che saranno loro gli angoli della griglia, e di conseguenza distribuire i vertici corretti nei lati corretti. A fianco il risultato dopo l'esecuzione dello script.

    [attachment=7443:Caso1.JPG][attachment=7442:Caso1 ok.JPG]

    Caso2: forse un'altro caso semplice ma di tipo diverso. In questo caso i vertici hanno tutti le stesse caratteristiche. E' l'utente che decide quali saranno gli angoli della griglia lasciandoli deselezionati. Lo script lo vede e abbina i vertici di conseguenza.

    [attachment=7445:Caso2.JPG][attachment=7444:Caso2 ok.JPG]

    caso3: un misto fra i primi due. L'utente deve deselezionare solo i vertici che hanno 3 lati attaccati, mentre non serve che deselezioni quelli con 4. Se vuole però li può deselezionare anche quelli. Più difficile degli altri due perchè altri vertici esterni potrebbero influire nello script.

    [attachment=7447:Caso3.JPG][attachment=7446:Caso3 ok.JPG]

    caso4: un esempio con lati della griglia di lunghezze diverse. Al momento supporta solo se i lati opposti hanno lo stesso numero di segmenti, ma lo farò che funziona anche con lati di segmenti totalmente diversi.

    [attachment=7449:caso4.JPG][attachment=7448:caso4 ok.JPG]

    Prossimo step sarà  fare in modo che tutti i lati della griglia possano essere diversi, e che l'utente possa nascondere la parte di mesh esterna al bordo del buco in modo che non possa unfluire nei calcoli dello script nei casi di mesh più incasinate.

    Poi invece chiedo l'aiuto dei matematici in ascolto. Uno dei problemi che dovrò affrontare sarà  quello di trovare le coordinate di due punti di due rette sghembe più vicini fra loro. Se qualcuno mi può aiutare mi faccia sapere! Grazie! https://www.blender.it/uploads/monthly_01_2012/post-1616-0-72349700-1327693431.jpg https://www.blender.it/uploads/monthly_01_2012/post-1616-0-06376000-1327693433.jpg https://www.blender.it/uploads/monthly_01_2012/post-1616-0-52603600-1327693434.jpg https://www.blender.it/uploads/monthly_01_2012/post-1616-0-84920000-1327693435.jpg https://www.blender.it/uploads/monthly_01_2012/post-1616-0-22344200-1327693438.jpg https://www.blender.it/uploads/monthly_01_2012/post-1616-0-95779300-1327693439.jpg https://www.blender.it/uploads/monthly_01_2012/post-1616-0-34154500-1327693442.jpg https://www.blender.it/uploads/monthly_01_2012/post-1616-0-73835500-1327693443.jpg

    andcamp
    Partecipante
    @andcamp
    #201096
    Quote:
    le coordinate di due punti di due rette sghembe più vicini fra loro

    di due rette o di due segmenti appartenenti a rette sghembe? (poi se sono segmenti complanari penso si guardi allora solo la differenza tra i due punti estremi da una parte e dall'altra e si vede qual'è la minore)


    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201097

    effettivamente sono segmenti, ma siccome a me interessano solo le coordinate dei due punti, mi va bene anche solo pensarli come rette. Probabilmente è anche più facile. Ma se tu sai dirmelo solo come segmenti, allora va bene anche quello! E comunque penso sempre ai casi più complessi, quindi non complanari. Voglio che lo script sia flessibile!

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201098

    Un problema risolto! Ora lo script unisce correttamente anche lati con numero di segmenti diversi. Starà  all'utente decidere se gli andrà  bene ottenere un risultato con triangoli o no. Nel secondo caso dovrà  modificare la mesh in modo da ottenere il risultato corretto.

    Ora non mi resta che calcolare le coordinate di tutti i vertici della griglia da disegnare, ma come detto per far questo avrei bisogno dell'aiuto di un matematico. https://www.blender.it/uploads/monthly_01_2012/post-1616-0-07787300-1327698396.jpg

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201099

    Risolto anche il problema dei casi incasinati. Se l'utente si trova in un caso come il caso 5 (dove lo script non riesce a decifrare quali siano i vertici da usare come angoli della griglia), non dovrà  far altro che nascondere quello che non fa parte del bordo del buco. Poi deselezionare i vertici che vuole usare come angoli della griglia ed eseguire lo script per riempire il buco.

    [attachment=7452:Caso5_1.JPG][attachment=7453:Caso5_2.JPG][attachment=7454:Caso5_3.JPG] https://www.blender.it/uploads/monthly_01_2012/post-1616-0-16964800-1327699925.jpg https://www.blender.it/uploads/monthly_01_2012/post-1616-0-55226600-1327699926.jpg https://www.blender.it/uploads/monthly_01_2012/post-1616-0-12156200-1327699928.jpg

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201100

    Sarà  anche utile per chiudere un cerchio con una topologia corretta.

    [attachment=7457:caso6.JPG][attachment=7456:caso6 ok.JPG] https://www.blender.it/uploads/monthly_01_2012/post-1616-0-68716900-1327701139.jpg https://www.blender.it/uploads/monthly_01_2012/post-1616-0-76489400-1327701140.jpg

    shingo_t
    Membro
    • Blenderista
    • Post sul Forum 152
    @shingo_t
    #201101
    'Lell' wrote:

    effettivamente sono segmenti, ma siccome a me interessano solo le coordinate dei due punti, mi va bene anche solo pensarli come rette. Probabilmente è anche più facile. Ma se tu sai dirmelo solo come segmenti, allora va bene anche quello! E comunque penso sempre ai casi più complessi, quindi non complanari. Voglio che lo script sia flessibile!

    Provo a dire la anche se non sono un matematico :smile: io farei cosi':

    1) calcolo l'equazione delle 2 rette proiettate nel piano con l'eq. classica: (x-x1)/(x2-x1)= (y-y1)/(y2-y1)

    2) trovo la proiezione del punto di intersezione sul piano

    3) calcolo la distanza piana tra i due punti d(xy) (ovvero considero la proiezione sul piano xy) e la differenza di quota DQ=(z2-z1)

    4) con i dati ricavati dal punto 3 calcolo la pendenza della retta p=DQ/d(xy)

    5) calcolo la distanza tra il punto P1 e il punto intersezione Pi (di)

    6) ricavo la quota del punto intersezione come z=z1+ p * di

    ripeto il procedimento dei punti 3, 4, 5, 6 per entrambe le rette, e alla fine impongo che la z del punto sia pari alla media delle z trovate

    Spero che questo mio ragionamento possa esserti utile.

    Massimiliano

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201102

    Queste cose mi confondono non poco, più che altro perchè non riesco ad abbinare certi termini ad un'immagine concreta nella mia testa. E quell'aquazione per me non è poi così classica! :mrgreen:

    Io nello script avrò bisogno di una funzione alla quale fornire 4 vertici (di cui conosco le coordinate). Due appartengono ad una retta, e gli altri due all'altra. Che in pratica sono ciascuno degli edge che attualmente il mio script disegna. E in pratica la funzione deve trovare i due punti più vicini per ogni intersezione di edge. Se il contorno fosse complanare basterebbe fare un sistema fra le due rette, ma siccome voglio che lo script possa affrontare tutti i possibili casi, il sistema non è sufficiente. Quando ho trovato quelle coordinate (dei due punti più vicini) allora riesco a proseguire da solo.

    Quindi la funzione inizierebbe così:

    Code:
    def trova_due_punti(vert1, vert2, vertA, vert:cool: #passo gli indici dei vertici delle rette. I primi due della prima retta, i secondi della seconda.
    c_vert1 = me.vertices[vert1].co #assegno le coordinate di ogni vetice a variabili
    c_vert2 = me.vertices[vert2].co
    c_vertA = me.vertices[vertA].co
    c_vertB = me.vertices[vertB].co

    Lì poi non so come proseguire. Si consideri che in python è possibile eseguire operazioni con tutta la tripletta di coordinate in un solo colpo.

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201103

    Sono venutoa conoscenza del fatto che i punti che cerco sono i punti di intersezione fra le due rette sghembe e la retta a entrambe perpendicolare e incidente.

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201104

    Mi hanno indicato questa pagina, nella quale sembrerebbe esserci quello che cerco, ma non riesco a decifrare un gran che. http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm

    Qualcuno ci riesce?

    gionavvi
    Membro
    • Blenderista
    • Post sul Forum 151
    @gionavvi
    #201105

    Io sono al primo anno di matematica! :smile:

    Non ho idea di quanto ti possa aiutare ma ho capito il problema solo che non ho idea dei dati di cui sei a disposizione… Tu conosci 4 vertici giusto? Con coordinate 3D… Sai quali dei due fanno parte di una retta e quali dell'altra? O hai bisogno di un auto riconoscimento?

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201106

    Sì, so tutto dei vertici degli edge. Ti sarei grato se riuscissi a fare qualcosa! Se guardi nell'altra pagina ho messo l'inizio della funzione che devo creare, dove preparo i dati che ho a disposizione in variabili.

    gionavvi
    Membro
    • Blenderista
    • Post sul Forum 151
    @gionavvi
    #201107

    Il link che hai postato mi ha illuminato… Io so programmare (e pure poco) solo in C… Ora provo a scrivere una funzione che restituisce il punto cercato…. Prima vediamo se ci riesco poi la convertiamo! :smile:

    shingo_t
    Membro
    • Blenderista
    • Post sul Forum 152
    @shingo_t
    #201108

    Provo a spiegare il mio procedimento forse a quell'ora il mio cervello non si era ancora svegliato del tutto :oops:

    consideriamo di avere i 4 vertici (punti) P1(x1,y1,z1), P1(x2,y2,z2), P3(x3,y3,z3) e P4(x4,y4,z4)

    In principio considero le due rette come se fossero nel piano XY, tralasciando la Z, e scrivo l'equazione per le due rette e risolvo il sistema per trovarne l'intersezione:

    (x-x1)/(x2-x1) = (y-y1)/(y2-y1) e (x-x3)/(x4-x3) = (y-y3)/(y4-y4)

    in questo modo ho trovato le coordinate x e y del punto d'intersezione Pi(xi,yi), a questo punto calcolo le distanze P1P2, P1Pi, P3P4 e P3Pi e le differenze di quota Delta(z1,z2) = z2 – z1 e analogamente Delta(z3,z4).

    Calcolo le pendenze delle rette come p1 = Delta(z1,z2)/P1P2 e p2 =Delta(z3,z4)/P3P4, ora calcolo la z sulle due rette:

    zi1 = p1 * P1Pi e zi2 = p2 * P3Pi a questo punto impongo che la z del punto Pi sia pari a zi = (zi1 + zi2)/2

    Spero che cosi' il ragionamento sia un po' piu' chiaro (ma sopratutto sia matematicamente corretto :razz: ) parte di questo procedimento proviene dalla teoria per il calcolo degli spianamenti (eh il geometra e' sempre geometra, anche quando non serve :mrgreen:

    Massimiliano

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201109
    'shingo_t' wrote:

    Provo a spiegare il mio procedimento forse a quell'ora il mio cervello non si era ancora svegliato del tutto :oops:

    consideriamo di avere i 4 vertici (punti) P1(x1,y1,z1), P1(x2,y2,z2), P3(x3,y3,z3) e P4(x4,y4,z4)

    In principio considero le due rette come se fossero nel piano XY, tralasciando la Z, e scrivo l'equazione per le due rette e risolvo il sistema per trovarne l'intersezione:

    (x-x1)/(x2-x1) = (y-y1)/(y2-y1) e (x-x3)/(x4-x3) = (y-y3)/(y4-y4)

    in questo modo ho trovato le coordinate x e y del punto d'intersezione Pi(xi,yi), a questo punto calcolo le distanze P1P2, P1Pi, P3P4 e P3Pi e le differenze di quota Delta(z1,z2) = z2 – z1 e analogamente Delta(z3,z4).

    Calcolo le pendenze delle rette come p1 = Delta(z1,z2)/P1P2 e p2 =Delta(z3,z4)/P3P4, ora calcolo la z sulle due rette:

    zi1 = p1 * P1Pi e zi2 = p2 * P3Pi a questo punto impongo che la z del punto Pi sia pari a zi = (zi1 + zi2)/2

    Spero che cosi' il ragionamento sia un po' piu' chiaro (ma sopratutto sia matematicamente corretto :razz: ) parte di questo procedimento proviene dalla teoria per il calcolo degli spianamenti (eh il geometra e' sempre geometra, anche quando non serve :mrgreen:

    Massimiliano

    Poi rileggo tutto con calma per vedere se capisco qualcosa. Però prima ti chiedo: questo tuo sistema va bene anche con rette che invece di essere su piani xy sono su piani yz o inclinati in qualunque modo? Perchè sarebbe stato più facile anche per me calcolare l'intersezione xy (senza considerare le inclinazioni), e poi trovare i punti incidenti della retta verticale con le altre due, ma questo sistema non mi garantisce, almeno da quello che ho capito, che i punti trovati siano quelli più vicini. Almeno questa è la mia impressione. Se invece mi rassicuri dicendo che è tutto apposto allora provo a mettere giù qualcosa.

    Quote:

    Il link che hai postato mi ha illuminato… Io so programmare (e pure poco) solo in C… Ora provo a scrivere una funzione che restituisce il punto cercato…. Prima vediamo se ci riesco poi la convertiamo! :smile:

    Attendo fiducioso! Poi a tradurre penso di potercela fare anche io.

    shingo_t
    Membro
    • Blenderista
    • Post sul Forum 152
    @shingo_t
    #201110
    'Lell' wrote:

    ti chiedo: questo tuo sistema va bene anche con rette che invece di essere su piani xy sono su piani yz o inclinati in qualunque modo?

    Si dovrebbe essere giusto, io ho considerato le proiezioni delle rette nel piano xy per comodita' mia ma vanno bene anche per gli altri piani, basta usare le coordinate del piano a cui ci si vuole riferire, comunque per sicurezza mi guardo bene quel link e il libro di matematica (appena lo trovo! :smile:)

    Massimiliano

    shingo_t
    Membro
    • Blenderista
    • Post sul Forum 152
    @shingo_t
    #201111

    Ho visto bene adesso il link e calcola la distanza minima fra due rette, e cio' non vuol dire che il punto di minima distanza sia quello che tu stai cercando, tieni anche presente il fatto che due rette sghembe sono parallele rispetto ad almeno uno dei piani coordinati.

    Appena ho novita' ti faccio sapere.

    Massimiliano

    gionavvi
    Membro
    • Blenderista
    • Post sul Forum 151
    @gionavvi
    #201112

    Scusami shingo_t, ne so meno di te quindi non voglio sembrare presuntuoso :) , ma il tuo metodo non rischia di founzionare solo per rette che sono incrociate rispetto al pavimento? Mi spiego meglio, immagina di avere una grossa X sul pvimento, quello è il tuo caso, ora prendi la stessa X ma disegnata su una parete, in quel caso separando le due rette della X ottieni il caso che intendo sottolineare io, dove hai una proiezione incidente ma non rispetto all'asse Z…

    Certamente è possibile sfruttare i blocchi logici per lasciare che lo script analizzi quale asse trascurare all'inizio quindi credo che sia una buona strada…

    Io sto cercando di trovare una relazione esplicita, mi vengono grossi calcoli, sbagliati, però ho fatto qualche test e i punti risultanti c'entrano un sacco con le rette di partenza (tipo appartengono a piani paralleli in corrispondenza di dove si “incrociano” o robba simile), forse cambiando qualcosina riesco a farlo funzionare! Vediamo :wink: …

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201113

    Grazie per l'impegno ragazzi!

    Io intanto proseguo con le parti successive impostando al momento due punti a piacere, così non appena avete la soluzione la inserisco e il gioco è fatto!

    Valerio
    Membro
    • Blenderista
    • Post sul Forum 107
    @valerio
    #201114

    Lell…io non ho capito cosa stai cercando?

    Cosa devi calcolare delle due rette sghembe?

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201115

    Le coordinate dei due punti più ravvicinati fra le due rette. O detta in modo più tecnico, gli estremi del segmento di minima distanza fra le due rette.

    Valerio
    Membro
    • Blenderista
    • Post sul Forum 107
    @valerio
    #201116

    ho fatto una breve ricerca….

    questi sono i link che ci portano alla soluzione del problema….

    http://areeweb.polito.it/didattica/polymath/htmlS/argoment/CABRI/Cabri_Giu08/MinDistSghembe.htm

    http://it.wikipedia.org/wiki/Distanza_fra_due_rette_nello_spazio

    http://www.matematicamente.it/formulario_dizionario/formulario/geometria_analitica_nello_spazio%3A_retta_200804072650/

    vista l'ora tarda non mi sembra il caso di sviluppare le nozioni per vedere di tirarci fuori qualcosa di utile…

    a mente fredda vedo se ci metto la testa…

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201117

    Il terzo link è interessante, anche perchè in italiano e scritto in modo relativamente semplice. Ma ancora troppo per me. Però butto là  delle idee. Ho capito che la retta che cerchiamo deve essere perpendicolare sia ad una che all'altra retta. Quindi penso sia da creare un sistema che comprende le 3 rette per calcolare i punti in comune. In pratica si prende il piano perpendicolare ad una delle rette, e fra tutte le rette di questo piano si deve trovare quella incidente con la seconda retta. Più facile a dirsi che a farsi forse! Ma intanto cerco di ragionare un po' per vedere se in qualche modo ne esco.

    Valerio
    Membro
    • Blenderista
    • Post sul Forum 107
    @valerio
    #201118

    lell…la soluzione al tuo problema si ottiene unendo la descrizione geometrica del primo link alle definizioni algebriche del terzo link…

    non penso che sia necessario un sistema che comprende 3 rette…crede che alla fine sia anche meno complesso di quello che sembra…

    dovrei trovare il tempo di svilupparti il sistema….(anche la voglia…la matematica mi piace ma non la trovo così divertente da riempire la mia domenica pomeriggio)..

    senza impegno spero domani mattina di potermici mettere un po'…mandami in PVT la tua mail (magari scrivimi anche il tuo vero nome)

    appena riesco vedo se lo sviluppo, lo scannerizzo e te lo invio…

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #201119

    Ok, grazie mille!

Stai visualizzando 25 post - dal 1 a 25 (di 73 totali)
  • Devi essere connesso per rispondere a questo topic.