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] Problema con IntersectsMesh
Forum - C# / VB.NET - [VB.NET][Direct3D 9] Problema con IntersectsMesh

Avatar
GN (Member)
Guru


Messaggi: 770
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 22:17
Martedì, 06/09/2011
Premesso che è il mio primo gioco con DirectX, ho questo problema: sto sviluppando un gioco 3D in cui il giocatore guida un carro armato e deve eliminare altri carri armati presenti nella scena; per ora riesco a muovere il veicolo del giocatore ma non a sparare contro i nemici usando la funzione IntersectsMesh.
Il codice che uso per calcolare se colpisco il nemico è questo, tenendo presente che ho un oggetto "Giocatore" e una List di oggetti "Nemici"; entrambi rappresentano strutture "oggX", mesh ricavate da un file .x (visto che è poco codice posto anche la struttura):

Struttura oggX:
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



Codice per calcolare l'avvenuto sparo andato a segno (modificato dopo la risposta di Totem) :
Codice sorgente - presumibilmente VB.NET

  1. Dim PuntoInizio As Vector3 = Giocatore.pos
  2.             Dim Direzione As New Vector3(Math.Cos(a), 0, Math.Sin(a))
  3.             If t.Item(Key.Space) = True Then
  4.                 For i As Integer = 0 To Nemici.Count() - 1
  5.                     If Nemici.Item(i).mesh.Intersect(PuntoInizio, Direzione) = True Then
  6.                         Nemici.RemoveAt(i)
  7.                         Exit For
  8.                     End If
  9.                 Next
  10.             End If



Ricordo inoltre che AngoloGiocatore è l'angolo del giocatore a partire dall'asse Z.

Se mi metto in un punto e comincio a girare su me stesso elimino qualche nemico, ma l'angolo da cui sparo è completamente sbagliato.
Sapreste aiutarmi? Grazie mille in anticipo.

EDIT: ho postato il progetto così potete vedere il sorgente completo.

EDIT 2: visto che non serve più rimuovo l'allegato per liberare spazio nel database.

Ultima modifica effettuata da GN il 18/10/2011 alle 22:03


PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 13:07
Mercoledì, 07/09/2011
La direzione è data semplicemente da (cos(angolo), sin(angolo)). Tutti i calcoli che fai con qui vettori sono fuorvianti. Infatti il punto di arrivo è dipendente dal punto di inizio, poiché il proiettile viene sparato da una certa posizione con un certo angolo. Infatti:

PuntoArrivo = PuntoInizio + (100sin(a), 100cos(a))
Direzione = PuntoArrivo - PuntoInizio = (100sin(a), 100cos(a))

Dato che il vettore della direzione può benissimo essere un versore, anche il fattore 100 è inutile.

Noto che nel tuo codice hai scambiato le coordinate x e z: x dovrebbe essere il coseno, secondo le convenzioni che prendono l'angolo uguale a 0 su x e positivo in senso antiorario a partire dall'asse delle ascisse.

Ultima modifica effettuata da Il Totem il 07/09/2011 alle 13:09
Grazie mille, ho sistemato ma non completamente. Ora riesco a sparare, ma non sempre: a volte funziona perfettamente, a volte riesco a colpire i nemici solo dopo aver compiuto un giro su me stesso tenendo premuto il tasto di sparo e altre volte sparandogli all'indietro. Sapresti aiutarmi? Grazie - GN - 07/09/11 21:35
La direzione è giusta, ma rimane da vedere come determini AngoloGiocatore e che relazione c'è tra questo e la matrice View. - Il Totem - 08/09/11 13:39
AngoloGiocatore è l'angolo del giocatore in gradi; la matrice view credo che sia indipendente, infatti anche cambiandola gli effetti sono gli stessi. - GN - 08/09/11 15:25
L'angolo del giocatore da cosa? Calcolato da quale asse? Positivo in che senso? Credi che sia indipendente o lo è? La visuale è in prima o in terza persona? Serve il codice di come questo angolo viene calcolato. Apri una nuova discussione e posta il codice. - Il Totem - 09/09/11 11:18
Ho modificato il topic; inoltre, sono sicuro che la visuale non c'entra perchè per ora è dall'alto (come se il gioco fosse in 2D). - GN - 09/09/11 11:55


"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
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 12:13
Sabato, 10/09/2011
Io ti avevo scritto chiaramente che la mia risposta considera l'angolo dall'asse x, ma tu lo calcoli a partire dall'asse z, quindi mi sembra normale che sia sbagliato. Hai controllato inoltre in che senso viene preso positivo? Ogni framework ha le sue convenzioni.

Stento a capire... il framework è ovviamente il .NET e non capisco nemmeno come calcolare l'angolo dall'asse x... Scusa l'ignoranza ma come ho gia detto sono alle prime armi. - GN - 10/09/11 21:50
Intendevo il framework grafico (Direct3D). Tu hai scritto "Ricordo inoltre che AngoloGiocatore è l'angolo del giocatore a partire dall'asse Z." Mentre seno e coseno sono calcolati come se un segmento spazzasse l'angolo in senso antiorario a partire dall'asse x. - Il Totem - 11/09/11 12:16
Eppure il calcolo di seno e coseno è uguale per il movimento degli oggetti che funziona perfettamente; non capisco perchè per lo sparo causa qualche problema. Potresti spiegarmi come devo modificarlo? Grazie mille ancora. - GN - 11/09/11 22:00
Forse ti sembra uguale ma potresti aver scambiato seno e coseno da qualche parte. - Il Totem - 12/09/11 11:55
E' vero, rispetto a quelli del movimento erano invertiti. Gli ho sistemati ma comunque non funziona sempre; solo da alcuni punti(giusti) ma non da tutti. - GN - 12/09/11 21:58
Mmhh... potresti fare un video affinché vediamo come si comporta il programma? - Il Totem - 13/09/11 11:58
Visto che sono solo 7 kb ho postato l'intero progetto, così puoi vedere anche tutto il sorgente. Per provarlo i comandi sono: frecce per muoversi, spazio per provare a sparare. Ovviamente è incompleto, manca ancora la gestione delle collisioni ma ora sono bloccato su questo problema. Grazie ancora! - GN - 13/09/11 21:38
Visto che so che sei esperto su questo argomento, ti segnalo il nuovo topic con cui cerco di risolvere il problema in un altro modo: http://www.pierotofy.it/pages/extras/forum/16/1032564-%5Bvbnet%5Bdirect3d9algoritmo_per_sparo/ Per favore se puoi aiutami perchè non so più cosa fare :(. Grazie! - GN - 18/10/11 22:06


"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