Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET][Direct3D 9]Collisioni e bounding box
Forum - C# / VB.NET - [VB.NET][Direct3D 9]Collisioni e bounding box

Avatar
GN (Member)
Guru


Messaggi: 770
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 12:37
Sabato, 01/10/2011
Allora, sto sviluppando un gioco in 3D con DirectX9 in VB.NET e sto implementando la gestione delle collisioni. Ho scritto questo codice, che però non va:
Codice sorgente - presumibilmente VB.NET

  1. Function Collisione(ByVal mesh1 As oggX, ByVal mesh2 As List(Of oggX)) As Boolean
  2.         For Each i As oggX In mesh2
  3.             If CollisioneOggetto(mesh1, i) Then
  4.                 Return True
  5.                 Exit Function
  6.             End If
  7.         Next
  8.         Return False
  9.     End Function
  10.  
  11.     Sub BoundingBox(ByVal corrMesh As oggX, ByRef min As Vector3, ByRef max As Vector3)
  12.         Dim descr As VertexBufferDescription = corrMesh.mesh.VertexBuffer.Description
  13.         Dim vertexData As GraphicsStream = corrMesh.mesh.VertexBuffer.Lock(0, 0, LockFlags.ReadOnly)
  14.         Geometry.ComputeBoundingBox(vertexData, corrMesh.mesh.NumberVertices, descr.VertexFormat, min, max)
  15.         corrMesh.mesh.VertexBuffer.Unlock()
  16.         Return
  17.     End Sub
  18.  
  19.     Function CollisioneOggetto(ByVal m1 As oggX, ByVal m2 As oggX) As Boolean
  20.         Dim min1 As New Vector3()
  21.         Dim max1 As New Vector3()
  22.         Me.BoundingBox(m1, min1, max1)
  23.         Dim min2 As New Vector3()
  24.         Dim max2 As New Vector3()
  25.         Me.BoundingBox(m2, min2, max2)
  26.         Dim r1 As New RectangleF(min1.X, min1.Z, max1.X - min1.X, max1.Z - min1.Z)
  27.         Dim r2 As New RectangleF(min2.X, min2.Z, max2.X - min2.X, max2.Z - min2.Z)
  28.         Return r1.IntersectsWith(r2)
  29.     End Function


La funzione Collisione() dovrebbe restituirmi un booleano che indichi se un oggetto passato come parametro sia in collisione con anche uno solo di quelli passati nell' altro parametro, ma non funziona. La struttura oggX non contiene altro che una mesh e qualche altra informazione:
Codice sorgente - presumibilmente VB.NET

  1. Public Structure oggX
  2.     Public pos As Vector3
  3.     Public rot As Vector3
  4.     Public mesh As Mesh
  5.     Public numX As Integer
  6.     Public tex() As Texture
  7.     Public mat() As Material
  8. End Structure


Grazie mille a chiunque mi aiuterà.

EDIT 1: dimenticavo di dire che ho usato i Rectangle perchè le collisioni mi bastano in 2D perchè gli oggetti hanno tatti la stessa posizione so Y.

EDIT 2: ho notato che avevo fatto una cavolata, cioè:
Codice sorgente - presumibilmente Plain Text

  1. Me.BoundingBox(m1, min1, max1)
  2. Me.BoundingBox(m2, min1, max1)


invece che
Codice sorgente - presumibilmente Plain Text

  1. Me.BoundingBox(m1, min1, max1)
  2. Me.BoundingBox(m2, min2, max2)


Però non ho risolto.

Ultima modifica effettuata da GN il 03/10/2011 alle 21:51


PM
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Up
1
Down
V
Segnala al moderatore
Postato alle 1:23
Domenica, 02/10/2011
Se vuoi prova ad usare il mio sistema.

hai una lista di oggetti esempio

Codice sorgente - presumibilmente C++

  1. list<ogg> Oggetti  = new <ogg>();
  2. struct ogg {
  3.  
  4. public int id;
  5. public int x;
  6. public int y;
  7. }




ti basta fare semplicemente in questo modo

Se oggetto in movimento e nell'area dell'oggetto della lista[n]
x >= x  && X <= x + width stessa cosa per asse Y allora restitusce true

Codice sorgente - presumibilmente C# / VB.NET

  1. int coll = false;
  2.  
  3. void rendering() {
  4.  
  5.  
  6. for( int i = 0; i < Oggetti.Count; i++) {
  7.  
  8. if(player.x >= Oggetti[i].x && player.x <= Oggetti.x + width && player.y >= Oggetti[i].y && player.y <= Oggetti[i].y + Height)
  9. {
  10.  
  11. coll = true; //Collisione
  12. }
  13.  
  14. }
  15.  
  16. }



Width e Height sarebbe la grandezza dell'oggeto che player il và ad interscarsi con l'oggetti statico: Guarda grafico



                                   Oggetti.Y                                  
Oggetti.X       |-----------------|   Oggetti.X  + Width
                     |          Player   |         |
                     |          <==     |
                     |                      |
                     |____________|
                                  Oggetti.Y + Height

Grazie per l'attenzione, ma ho scoperto che il problema è nella funzione BoundingBox (vedi il commento alla risposta di Totem). - GN - 02/10/11 21:42
Perfetto ho sistemato!!! Dopo aver seguito i consigli di Totem ho implementeto il tuo codice in vb.net, non sono collisioni precisissime ma mi accontento. Grazie mille a tutti quelli che mi hanno aiutato :) . - GN - 03/10/11 22:05


PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 13:16
Domenica, 02/10/2011
Non so quale struttura Rectangle tu stia usando, ma di solito il terzo e il quarto parametro sono width e height, corrispondenti a |max1.X - min1.X| e |max1.Z - min1.Z|, non alla somma.

Ho modificato come mi hai suggerito, ma ora la funzione restituisce sempre true (quindi non posso più muovere l'oggetto); in debug ho notato che quando costruisco la BoundingBox della seconda mesh mi viene sempre restituito (0,0,0), quindi credo che il problema sia li. - GN - 02/10/11 21:41
Non so perché ti dia sempre (0,0,0), però ricordati che le bounding boxes sono sempre allineate agli assi e mai ruotate. - Il Totem - 03/10/11 19:39


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Up
-1
Down
V
Segnala al moderatore
Postato alle 12:50
Sabato, 01/10/2011

con tutti i motori fisici che integrano già la collisione detection perchè stare a riscrivercela?

Perchè è un gioco semplice, l'ho quasi finito e non vorrei appesantirlo con un motore fisico per una sola cosa; poi mi interessa imparare come gestire,appunto, le collisioni. - GN - 01/10/11 21:27


Ingegnere Informatico
https://ldlagency.it
PM