Oppure

Loading
06/09/11 20:17
GN
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:
Public Structure oggX
    Public pos As Vector3
    Public rot As Vector3
    Public mesh As Mesh
    Public numX As Integer
    Public tex() As Texture
    Public mat() As Material
End Structure


Codice per calcolare l'avvenuto sparo andato a segno (modificato dopo la risposta di Totem) :
            Dim PuntoInizio As Vector3 = Giocatore.pos
            Dim Direzione As New Vector3(Math.Cos(a), 0, Math.Sin(a))
            If t.Item(Key.Space) = True Then
                For i As Integer = 0 To Nemici.Count() - 1
                    If Nemici.Item(i).mesh.Intersect(PuntoInizio, Direzione) = True Then
                        Nemici.RemoveAt(i)
                        Exit For
                    End If
                Next
            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 18/10/11 20:03
aaa
07/09/11 11:07
Il Totem
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 07/09/11 11:09
aaa
10/09/11 10:13
Il Totem
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.
aaa