Pagina 3 di 3 primaprima 1 2 3
Visualizzazione dei risultati da 21 a 30 su 30

Discussione: rimbalzare

  1. #21
    Il tau è solamente un "mezzuccio" che serve per non far rieseguire la funzione più volte in riferimento allo stesso urto. Infatti succede che la palla, al momento dell'urto, non sia esattamente tangente al piano, ma che "gli entri un pò dentro", perché ovviamente la palla si muove a passi finiti. In questo caso, all'istante dopo l'urto, la palla sarà probabilmente ancora a contatto con il piano, e quindi la funzione si ritroverebbe ad invertire di nuovo la velocità, causando un errore. Il tau fa in modo che questo non avvenga, impendendo l'esecuzione ripetuta (a meno di tau istanti di tempo) della funzione.

    Esiste una soluzione molto più raffinata a questo problema (soluzione che ho implementato per un altro mio progetto), che consiste nello spostare al momento dell'urto la palla in una posizione che sia realmente tangente al piano. Non avevo tempo per metterla nel tuo esempio né sapevo se ti interessasse, per cui ho lasciato il tau. Se ti serve e non sai come fare ti do una mano, per ora non entro nei dettagli perché non è semplice.

    Veniamo alla funzione hitControl.
    La prima cosa da fare è capire *se* sta avvenendo un urto o meno. Logicamente non vogliamo banalmente usare la funzione hitTest di Flash perché è alquanto imprecisa.

    Allora ho ragionato così:
    Calcolo in qualche modo la distanza fra la palla e il piano, poi se quasta distanza è minore o uguale al raggio della palla, ne deduco che siamo in presenza dell'urto. Chiaro fin qui?
    Per calcolare questa distanza ho fatto un paio di considerazioni algebriche, che vado a scriverti:

    L'equazione del piano su cui batte la palla (che poi è una retta) è questa:
    y = wy + tan(theta)*(x - wx)
    dove wx e wy sono le coordinate di un punto qualsiasi della retta (ad esempio, in flash, wx = _root.piano._x e wy = _root.piano._y) e theta è l'angolo di rotazione della retta

    L'equazione della traiettoria della palla è invece:
    (x - px)/vx = (y - py)/vy
    dove px = _root.palla._x e py = _root.palla._y

    Si possono mettere queste due equazioni a sistema per trovare l'intersezione. Ti risparmio i passaggi algebrici, ma i valori che si trovano alla fine sono proprio quelli che ho scritto nel codice associati alle variabili hitx e hity.

    // calcolo dell'intersezione della tangente alla traiettoria della palla con il piano
    hitx = (vy/vx*px - py + wy - wx*Math.tan(theta))/(vy/vx - Math.tan(theta)); // ascissa
    hity = Math.tan(theta)*(hitx - wx) + wy; // ordinata


    Calcoliamo ora la distanza fra questo punto (la proiezione della palla sulla retta) e la palla, con il teorema di pitagora:

    // distanza fra l'intersezione e la palla:
    dist = Math.sqrt(Math.pow(px-hitx,2) + Math.pow(py-hity,2));


    Se questa distanza risulterà inferiore o uguale al raggio della palla, allora abbiamo un urto, altrimenti no:

    // controlla se è avvenuto l'urto:
    if (dist <= raggio) // l'urto è avvenuto
    {


    Tutto chiaro?

    Ora non resta da capire cosa c'è da fare per rendere realistico il rimbalzo.
    Nel codice è tutto sintetizzato, ma la teoria che ci sta dietro è questa:
    Inizialmente ci spostiamo nel sistema di riferimento del piano, moltiplicando il vettore della velocità per la matrice di rotazione per un angolo pari a theta.
    A questo punto, abbiamo la velocità espressa in queste due componenti: una parallela alla retta ed una perpendicolare.
    Adesso semplicemente invertiamo il segno della componente perpendicolare.
    Non ci resta ora che ruotare al contrario il nostro vettore velocità e il gioco è fatto. Nel codice è riportato soltanto un passaggio, con tutte le operazioni concentrate in un'istruzione sola.
    Mi rendo conto che queste cose possono non essere facili da capire (né da spiegare per scritto via forum!) se nonsi conosce un pò di trigonometria... io ci ho provato

    Spara pure altre domande se ne hai

  2. #22
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    306
    ringrazio per la spiegazione

    ora non ho tempo (programma serata: doccia --> nanna), ma domani cercherò di capire tutto, anche se di primo acchito ho un po' di difficoltà


    imprecando contro tutto ciò che può avere tre angoli,( ) saluto tutti e ringrazio per l'aiuto

  3. #23
    La spiegazione di Marsellus rafforza la mia idea che convenga sempre tenersi un libro di fisica e uno di matematica a portata di mano quanto capita di dover fare lavori di questo genere (a meno che non le si conosca a memoria )

  4. #24
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    306
    io purtroppo non ho ancora fatto tutta quella roba a scuola, quindi anche con il libro avrei difficoltà, cmq ci proverò ugualmente

  5. #25
    Manco io , ma una volta che hai alcune formule puoi comunque "riportarle" in flash ... insomma ti faciliti le cose e non devi per forza aspettare uno bravo come Marsellus con matematica & c

    Ciao, alla prossima

  6. #26
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    306
    Capito tutto!!!

    dopo 10 giorni di lontananza da flash, finalmente ho trovato il tempo di ragionare un po' seriamente su quanto mi hai consigliato

    grazie di tutto

  7. #27

  8. #28
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    306
    grazie di tutto Marsellus!
    ora il mio lavoro procede spedito
    questo è ciò che sono riuscito a fare

  9. #29
    Eheheh bravo, pare che funzioni
    Ho guardato un pò il codice, e forse ho dei suggerimenti da darti. Io te li butto là, poi vedi te

    Ho visto che fai chiamare hitControl da ogni linea (insomma da ogni "muro". Perché invece non la chiami una volta sola, e metti un ciclo for che scorra tutte le linee? Potresti creare una matrice avente una riga per ogni linea, e nelle colonne le informazioni che riguardano quella specifica riga. Ovvero:

    codice:
    M = [
        [wx1, wy1, rotazione1], // riferita al "muro" 1
        [wx2, wy2, rotazione2], // riferita al "muro" 2
        .
        .  // eccetera...
        .
    ]
    Così potresti semplificare le cose e far sì che ogni volta che aggiungi un muro, tu debba semplicemente aggiungere una riga in questa tabella.
    Comunque funziona anche così, tutto dipende da quello che ti serve Io spesso mi diverto a fare le cose fini a sé stesse, ma di solito è una perdita di tempo

    Altra cosa: come ti accennai a suo tempo, se hai necessità di rendere il codice perfettamente funzionante in ogni circostanza dovresti eliminare quel parametro "time" e sostituirlo con qualcosa di meno approssimativo. La cosa non è impossibile ma neanche immediata, fammi sapere se ti serve o se puoi farne a meno. Il risultato sarebbe che la palla non entra più dentro ai muri, ma si ferma sempre sulla superifice (al contrario di quello che avviene ora).

    In ogni caso buon lavoro

  10. #30
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    306
    chiaramente tutto questo non è fine a se stesso, mi serve come studio per un mio piccolo lavoro
    rifletterò sui tuoi consigli
    grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.