Autore Topic: Collisioni di oggetti 2d  (Letto 5683 volte)

Offline Thejuster

  • Nibble
  • **
  • Post: 6
  • Karma: +0/-0
    • Mostra profilo
Collisioni di oggetti 2d
« il: 19 Dicembre 2014, 16:51:29 »
Salve a tutti specialmente a TheKaneB :D

chiedo a lui specialmente, essendo un esperto in questo settore può aiutarmi.

Ho un piccolo problemino con il mio algoritmo di collisioni di 2 oggetti in DirectX
e non capisco perché non funziona a dovere

Struttura degli ostacoli

Codice: [Seleziona]
List<_obstacle> Ostacoli = new List<_obstacle>();
 
public struct _obstacle
{
   public int id;
   public int x;
   public int y;
 
}




semplice algoritmo


Codice: [Seleziona]


for(int i = 0; i < Ostacoli.Count; i++)
{
 
   //Verifica
 
  if( Tizio_X >= Ostacoli[i].x && Tizio_X <= Ostacoli[i].x + 32 && Tizio_Y >= Ostacoli[i].y && Tizio_Y <= Ostacoli[i].y + 32)
{
 
 // Collisione
 
}
 
 
}




Cosa succede?

Succede che la collisione su asse Y viene rilevata ma su X no.
Quindi il player gli passa per mezzo ma non lo supera.

ecco un esempio di cosa succede





Cosa c'è di sbagliato?

PS: Il player misura 32x64 px   gli ostacoli  32x32

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3498
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re:Collisioni di oggetti 2d
« Risposta #1 il: 19 Dicembre 2014, 19:13:46 »
Benvenuto :)

Potrebbe essere che non prendi in considerazione le dimensioni di Tizio?
Codice: [Seleziona]
Pseudo codice
If Tizio.x+Tizio.w > Ostacolo.x And
   Tizio.x < Ostacolo.x+Ostacolo.w And
   Tizio.y+Tizio.h > Ostacolo.y And
   Tizio.y < Ostacolo.y+Ostacolo.h

COLLISIONE

EndIf

Offline Thejuster

  • Nibble
  • **
  • Post: 6
  • Karma: +0/-0
    • Mostra profilo
Re:Collisioni di oggetti 2d
« Risposta #2 il: 20 Dicembre 2014, 09:52:45 »
Salve allanon.  ;D

Non ci avevo pensato di fare un questo modo.

Appena posso provo subito grazie ancora  :D

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3498
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re:Collisioni di oggetti 2d
« Risposta #3 il: 20 Dicembre 2014, 10:24:28 »
@legacy
metti dei sensori di "scassamento" così se ne accorge subito!  ;D

Offline Thejuster

  • Nibble
  • **
  • Post: 6
  • Karma: +0/-0
    • Mostra profilo
Re:Collisioni di oggetti 2d
« Risposta #4 il: 20 Dicembre 2014, 21:32:31 »
Grazie mille Allanon funziona pefettamente  ;D ;D ;D

Se cmq puo interessare ecco io mio prpgettino

 http://m.youtube.com/#/watch?v=6sQInPfAQhU

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3498
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re:Collisioni di oggetti 2d
« Risposta #5 il: 20 Dicembre 2014, 21:42:22 »
Mi sembra un progetto molto ambizioso e complesso, mi ricorda molto RPGMaker :)
Sei in un team o lo stai sviluppando da solo?

Offline Thejuster

  • Nibble
  • **
  • Post: 6
  • Karma: +0/-0
    • Mostra profilo
Re:Collisioni di oggetti 2d
« Risposta #6 il: 21 Dicembre 2014, 11:40:44 »
No, lo sto portando avanti da solo   ;D
 È vero, è molto complesso ed articolato.
 Infatti ho interfacciato come linguaggio di scripting il lua
 Nel video viene illustrato un tol esterno per generare le mappe normali
 ma ho quasi completato l'algoritmo interno per generare le mappe normali.


 Ma in realtà un team c'è, ma come programmatore principale del tool di sviluppo sono solo.
 Gli altri membri si occupano solo di grafica e ho imparato ad alcuni di loro ad utilizzare il lua script e creare script per il programma stesso.

 Oramai il lavoro più grande è fatto.
 Mancano solo piccole accortezze ed aggiustare eventuali bug ed altri problemi di poco conto
 Il tutto è free and open Sorce potete trovare tutti i sorgenti su Github

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3498
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re:Collisioni di oggetti 2d
« Risposta #7 il: 21 Dicembre 2014, 12:16:27 »
@legacy
il link postato è per la versione mobile, ecco quello corretto -> link

Offline Nonefonow

  • Guru
  • *****
  • Post: 1979
  • Karma: +36/-3
    • Mostra profilo
Re:Collisioni di oggetti 2d
« Risposta #8 il: 22 Dicembre 2014, 03:02:05 »
ho imparato ad alcuni di loro ad utilizzare

 :o :o :o

perche' usi il verbo "imparare" in quel modo ?
io ho imparato, tu hai imparato, essi hanno imparato

non ammette la forma "io ho imparato a te"
io ho insegnato a te -> ti ho insegnato

* * * * * * * * * * * * * * * * * * * * *
ho insegnato ad alcuni di loro ad utilizzare
* * * * * * * * * * * * * * * * * * * * *

Forse voleva dire "Ho imparato da alcuni di loro.."

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re:Collisioni di oggetti 2d
« Risposta #9 il: 22 Dicembre 2014, 07:17:35 »
E' tipicamente siciliano utilizzare imparare al posto di insegnare. Un errore classico che si commette quando si parla italiano (false friend). Forse è questo il motivo. :P

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re:Collisioni di oggetti 2d
« Risposta #10 il: 22 Dicembre 2014, 10:32:33 »
Ciao caro Thejuster, quanto tempo! :D

Vedo che i ragazzi hanno già risolto il problema, ottimo :)

Bel progetto quello su cui stai lavorando, immagino sarà un lavoro epico finirlo tutto a dovere.
Un piccolo suggerimento di usabilità: Il processo di creazione delle mappe è un po' troppo manuale, sarebbe utile automatizzare tutti i passaggi di generazione delle normals e compilazione con un solo tasto, visto che tutte le informazioni necessarie sono già all'interno dell'editor.

Offline Thejuster

  • Nibble
  • **
  • Post: 6
  • Karma: +0/-0
    • Mostra profilo
Re:Collisioni di oggetti 2d
« Risposta #11 il: 22 Dicembre 2014, 10:59:15 »
TheKaneee ;D

Mi inginocchio sempre al tuo cospetto. essendo stato in passato il mio maestro  ;D ed avermi aiutato su tantissimi problemi.

Il progetto continua da tanto tempo ormai.
E da pochi giorni ho appunto implementato un algoritmo per generare le normali.

Ma ho un problemino di piccole proporzioni.

forse sbaglio qualcosa, Ma sicuramente tu ne capisci molto più di me su questi argomenti e magari riesci ad aiutarmi. ( non si sà mai :D )

Con l'editor oramai sono a 2000 e passa righe.

Allora proprio per il piccolo problemi che dici tu "Di usare tool esterni" ho evitato questo utilizzando un algoritmo interno.

uso il vodi unsafe per velocizzare il calcolo

Codice: [Seleziona]

  unsafe private void GenerateNormalMap()
        {
            int x = 0, y = 0, kx = 0, ky = 0, src_stride = 0, dst_stride = 0, sumX = 128, sumY = 128, sumZ = 0;
            PixelData* p_src = null, p_dst = null;
            int[,] kernelX = new int[,] { { 1, 2, 1 }, { 0, 0, 0 }, { -1, -2, -1 } };
            int[,] kernelY = new int[,] { { 1, 0, -1 }, { 2, 0, -2 }, { 1, 0, -1 } };
            int[,] offsetX = new int[,] { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };
            int[,] offsetY = new int[,] { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };

            System.Drawing.Imaging.BitmapData bd_src = m_bmp_image.LockBits(new Rectangle(0, 0, m_bmp_image.Width, m_bmp_image.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            System.Drawing.Imaging.BitmapData bd_dst = m_bmp_nmap.LockBits(new Rectangle(0, 0, m_bmp_nmap.Width, m_bmp_nmap.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            p_src = (PixelData*)bd_src.Scan0.ToPointer();
            p_dst = (PixelData*)bd_dst.Scan0.ToPointer();

            src_stride = bd_src.Stride / 4;
            dst_stride = bd_dst.Stride / 4;

            for (y = 0; y < bd_src.Height; y++)
            {

               //Setto l'offeset dell'immagine ai margini
                if (y == 0)
                {
                    offsetY[0, 0] = (bd_src.Height - 1) * src_stride;
                    offsetY[1, 0] = (bd_src.Height - 1) * src_stride;
                    offsetY[2, 0] = (bd_src.Height - 1) * src_stride;
                    offsetY[0, 2] = 0;
                    offsetY[1, 2] = 0;
                    offsetY[2, 2] = 0;
                }
                else if (y == bd_src.Height - 1)
                {
                    offsetY[0, 0] = 0;
                    offsetY[1, 0] = 0;
                    offsetY[2, 0] = 0;
                    offsetY[0, 2] = -((bd_src.Height - 1) * src_stride);
                    offsetY[1, 2] = -((bd_src.Height - 1) * src_stride);
                    offsetY[2, 2] = -((bd_src.Height - 1) * src_stride);
                }
                else if (y == 1 || y == bd_src.Height - 2)
                {
                    offsetY[0, 0] = 0;
                    offsetY[1, 0] = 0;
                    offsetY[2, 0] = 0;
                    offsetY[0, 2] = 0;
                    offsetY[1, 2] = 0;
                    offsetY[2, 2] = 0;
                }

                for (x = 0; x < bd_src.Width; x++)
                {
                    (p_dst + (y * dst_stride) + x)->a = 255;

                    //Setto l'offset X dell'imagine ai margini
                    if (x == 0)
                    {
                        offsetX[0, 0] = bd_src.Width - 1;
                        offsetX[0, 1] = bd_src.Width - 1;
                        offsetX[0, 2] = bd_src.Width - 1;
                        offsetX[2, 0] = 0;
                        offsetX[2, 1] = 0;
                        offsetX[2, 2] = 0;
                    }
                    else if (x == bd_src.Width - 1)
                    {
                        offsetX[0, 0] = 0;
                        offsetX[0, 1] = 0;
                        offsetX[0, 2] = 0;
                        offsetX[2, 0] = -bd_src.Width;
                        offsetX[2, 1] = -bd_src.Width;
                        offsetX[2, 2] = -bd_src.Width;
                    }
                    else if (x == 1 || x == bd_src.Width - 2)
                    {
                        offsetX[0, 0] = 0;
                        offsetX[0, 1] = 0;
                        offsetX[0, 2] = 0;
                        offsetX[2, 0] = 0;
                        offsetX[2, 1] = 0;
                        offsetX[2, 2] = 0;
                    }

                    sumX = 128;
                    for (kx = -1; kx <= 1; kx++)
                        for (ky = -1; ky <= 1; ky++)
                            sumX += kernelX[kx + 1, ky + 1] * (((p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->r + (p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->g + (p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->b) / 3);

                    sumY = 128;
                    for (kx = -1; kx <= 1; kx++)
                        for (ky = -1; ky <= 1; ky++)
                            sumY += kernelY[kx + 1, ky + 1] * (((p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->r + (p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->g + (p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->b) / 3);

                    //Assegno il clamped X e sommo al canale R
                    if (sumX < 0)
                        (p_dst + (y * dst_stride) + x)->r = 0;
                    else if (sumX > 255)
                        (p_dst + (y * dst_stride) + x)->r = 255;
                    else
                        (p_dst + (y * dst_stride) + x)->r = (Byte)sumX;

                    // Assign clamped Y sum to G channel
                    if (sumY < 0)
                        (p_dst + (y * dst_stride) + x)->g = 0;
                    else if (sumY > 255)
                        (p_dst + (y * dst_stride) + x)->g = 255;
                    else
                        (p_dst + (y * dst_stride) + x)->g = (Byte)sumY;

                    //Calcolo e assegno il canale B al data
                    sumZ = ((Math.Abs(sumX - 128) + Math.Abs(sumY - 128)) / 4);
                    if (sumZ < 0)
                        sumZ = 0;
                    if (sumZ > 64)
                        sumZ = 64;
                    (p_dst + (y * dst_stride) + x)->b = (Byte)(255 - (Byte)sumZ);
                }
            }

            m_bmp_image.UnlockBits(bd_src);
            m_bmp_nmap.UnlockBits(bd_dst);
        }



Il problema e che i contorni sono molto accentuati,
Ho provato ad ammorbidirli utilizzando un'altro algoritmo quello del Blur per sfocare un pò l'immagine ed ammorbidire i tratti.
Ma comunque restano un pò forti ed in rilievo.

Sbaglio qualcosa nel calcolo?


Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re:Collisioni di oggetti 2d
« Risposta #12 il: 22 Dicembre 2014, 11:06:43 »
L'algoritmo mi sembra corretto, è giusto che siano molto accentuate le normals. Per avere delle normal "realistiche" l'artista deve costruirsele a partire da un modello 3D, da cui verrà renderizzata una scena particolare contenente le normali per ciascun pixel (lo fanno tutti i programmi 3D). Se invece si parte da immagini, e per di più sono immagini "sintetiche" quindi non fotografiche e contenenti stacchi di colore netti, è assolutamente fisiologico che vengano fuori delle cose un po' brutte.

Non ti preoccupare di questa cosa, lascia l'algoritmo così e al massimo lascia all'utente la possibilità di generarle o di importare delle normal maps esterne, così in caso se le sistema lui tramite il programma di grafica che preferisce.

Offline Thejuster

  • Nibble
  • **
  • Post: 6
  • Karma: +0/-0
    • Mostra profilo
Re:Collisioni di oggetti 2d
« Risposta #13 il: 22 Dicembre 2014, 12:11:33 »
L'algoritmo mi sembra corretto, è giusto che siano molto accentuate le normals. Per avere delle normal "realistiche" l'artista deve costruirsele a partire da un modello 3D, da cui verrà renderizzata una scena particolare contenente le normali per ciascun pixel (lo fanno tutti i programmi 3D). Se invece si parte da immagini, e per di più sono immagini "sintetiche" quindi non fotografiche e contenenti stacchi di colore netti, è assolutamente fisiologico che vengano fuori delle cose un po' brutte.

Non ti preoccupare di questa cosa, lascia l'algoritmo così e al massimo lascia all'utente la possibilità di generarle o di importare delle normal maps esterne, così in caso se le sistema lui tramite il programma di grafica che preferisce.

Giusto a questo non avevo pensato.
Allora oltre al compilatore dei normali interno, dò anche la possibilità come nel video di utilizzare altri tool esterni esempio (CrazyBump) che a mio parare, è il migliore.

@Thejuster
non mi hai risposto, ma sotto hai un algoritmo di pathplanner ?
il repo di questo progetto ?



Legacy intendi forse l'algoritmo della AStar ( A* Pathfinding ) o simili?

Al momento ancora nulla, Ma ho intenzione di scriverlo per l'IA dei nemici in modalità MMO ( Massive Multiplayer Online)

Al momento il mio quaderno dei ToDo è ancora lungo per arrivare a questo punto.
E non vorrei saltare passaggi per incasinare ulteriormente il sorgente.

Ma più in là ci sarà sicuramente  :D

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3498
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re:Collisioni di oggetti 2d
« Risposta #14 il: 22 Dicembre 2014, 17:34:43 »
...
(1) un robot mobile si fa sempre 3 domande

-1- dove sono ?
-2- dove devo andare ?
...
In pratica si fa le domande esistenziali che prima o poi ci facciamo tutti  ;D

Tags: