Gå til innhold
🎄🎅❄️God Jul og Godt Nyttår fra alle oss i Diskusjon.no ×

Visual Basic Roundup!


Anbefalte innlegg

Tanks

 

I ferien har jeg jo selfølgelig tatt med laptopen og småpusla litt når jeg ikke har noe å gjøre :p

Men jeg kunne ikke klart det uten jajajalla og aadnk. Takk skal dere ha :)

 

Edit: Du styrer med piltastene og skyter med Space

Kunne jeg få sett kildekoden til den der? :)

Endret av opix
Lenke til kommentar
Videoannonse
Annonse
Prøver å lage en "3d-motor" her nå, men det stopper når det kommer til paint-funksjonen. Hvordan skal jeg få ut X-Y utifra Z-X-Y og Player-Z-X-Y-Vinkel ? Hva er den ultimate formelen?

Lag en tegning eller noe som viser hvordan du vil ha det. Kanskje jeg kan hjelpe

Lenke til kommentar

Jo, se her!

 

Spillerens posisjon er slik:

player.gif

Vinkel brukes slik at spilleren kan snu seg rundt osv

 

Jeg tenkte jeg skulle begynne med å bare tegne prikker. Alle prikkene har 3 verdier:

vector.gif

 

Dette skal regnes sammen, masse vannskelig matte, og ut skal to verdier komme (altså skjerm kordinater):

skjerm.gif

Endret av Jonas
Lenke til kommentar
Slik som det er utformet nå bruker programmet mye unødvendig RAM for kun å lagre et fåtall med elementer i tabellene. Eksempelvis tar hver element i tablellen "Unit" 42 byte, som ganget med 9999 elementer blir hele 419958 byte eller ca. en halv MB. Dette er ganske mye for å kun bruke en brøkdel av dette til å lagre litt informasjon. Dermed blir dynamisk allokering av elementer i en tabell SVÆRT mye bedre enn å sette en fast grense. Dessuten øker programmets tilpassningsdyktighet i stor grad ved konverteringen, ettersom den ikke lenger får noen grense på hvor mange elementer som kan lagres.

Okey, jeg skal prøve å bruke det fra nå av, men jeg har et problem:

Option Explicit

Dim noe() As String

Private Sub Form_Load()

ReDim noe(0 To 4)

noe(1) = "drgrgrg"

ReDim noe(0 To 5)

MsgBox noe(1)

End Sub

Noe() blir jo clear'a når man ReDim'er! Hvordan skal jeg beholde eksisterende verdier?

 

Edit: redim preserve ja ... Det skrev jo aadnk :blush:

Endret av Jonas
Lenke til kommentar
Jo, se her!

 

Spillerens posisjon er slik:

player.gif

Vinkel brukes slik at spilleren kan snu seg rundt osv

 

Jeg tenkte jeg skulle begynne med å bare tegne prikker. Alle prikkene har 3 verdier:

vector.gif

 

Dette skal regnes sammen, masse vannskelig matte, og ut skal to verdier komme (altså skjerm kordinater):

skjerm.gif

:hmm:

Har fundert litt på hvordan det skal gjøres, men jeg kommer ikke på noen god løsning. Litt vanskelig å forestille seg nøyaktig hva du har i tankene. Selve den matematiske delen er ikke vanskelig, så lenge man vet hva man skal gjøre... :roll:

 

EDIT: Har du hørt om vektorer? Vektorregning er kanskje løsningen her. Men hvordan? *tenke mer*

Edit2:Du vil at det skal være et "kamera" som roterer på en måte. Der y-verdien er vinkelen på "kameraet" i forhold til x.

 

Orker ikke å tenke mer i natt... Får se på det i morra

Endret av 86Fredrik
Lenke til kommentar

edit, oops. visste ikke at det var så sucky formatering. skal prøve å fikse. ooops. leste heller ikke at du skal gjøre om dette til 2d-koordinater igjen. da blir det veldig mye mer komplisert matrise matte med perspektiv osv. trodde du bare skulle rotere rundt en akse.

 

jonas, les om matriser. det kan du gjøre her http://skal.planet-d.net/demo/matrixfaq.htm

 

det gjør det utrolig lett å rotere objekter rundt en akse.

 

her er matrisene for rotasjon rundt x, y og z-aksen.

rotasjon rundt x:

1  0  0

0  cos(a)  -sin(a)

0  sin(a)  cos(a)

 

rotasjon rundt y:

cos(a)  0  -sin(a)

 0  1  0

sin(a)  0  cos(a)

 

rotasjon rundt z:

cos(a)  -sin(a)       0

 sin(a)  cos(a)  0

0  0  1

 

 

si at du vil rotere rundt 90 grader rundt z-aksen f.eks da er det bare å fylle inn 90 grader (pi/4 i radianer siden cos og sin tar radianer, ihvertfall i c++ som er det jeg bruker)

 

cos(pi/4) -sin(pi/4) 0

sin(pi/4) cos(pi/4) 0

0 0 1

 

hvis du så vil rotere videre 45 grader rundt x-aksen tar du bare å setter opp en ny matrise på samme måte, og ganger de to matrisene sammen. da får du en ny matrise, og det punktet du vil rotere (et punkt kan du kalle en 3d-vektor fra origo til punktet) så ganger du bare den vektoren med matrisen.

 

jeg har bare matrisemultiplikasjon i c++-kode men det er ganske lett å "porte" til vb. her er den iaf.

mat4& mat4::operator*=(const mat4& rhs)
{
for(int i = 0; i < 4; ++i) {
 for(int j = 0; j < 4; ++j) {
 	real[i][j] = real[i][0] * rhs.real[0][j] + real[i][1] * rhs.real[1][j] + real[i][2] * rhs.real[2][j] + real[i][3] * rhs.real[3][j];
 }
}
return *this;
}

 

denne matrisen har 4 dimensjoner da, så du kan kutte bort den ene dimensjonen. finner ikke noe vektor*matrise kode, så det må du nesten lage selv, les på url'en jeg sa så er det ikke så pes.

Endret av iobas
Lenke til kommentar

som sagt, jeg leste feil, trodde du bare skulle rotere et punkt og spurte etter den "ultimate formelen". hvis du skal drive med rotasjon i 3d er matriser den "ultimate formelen". uansett, hvis du skal få en 2d-posisjon fra et 3d punkt er også matriser den "ultimate formelen", det er bare veldig mye mer komplisert.

Lenke til kommentar

Sitter å tester ut ReDim Preserve på variabler, men jeg har støtt på et problem..

 

Vanlighvis gjør jeg slik:

ReDim Preserve NowEffect(0 To UBound(NowEffect) + 1)

Men jeg har en variabel med 2 dimensjoner! Hvordan kan jeg finne ubound til en og en?

 

Edit: 1662 linjer :wow: Tror aldri jeg har skrevet noe så stort før.

Endret av Jonas
Lenke til kommentar

For å finne størrelsen til flerdimensjonerte variabler må man bruke en gjemt paramenter i kallet. Denne spesifiserer hvilken dimensjon det gjelder, telt fra 1. Følgelig må man bruke Ubound og LBound slik:

 

Dim aVar(5, 6) As String

MsgBox "aVar = " & LBound(aVar, 1)  & " To " & UBound(aVar, 1) & ", " & LBound(aVar, 2) & " To " & UBound(aVar, 2)

Endret av aadnk
Lenke til kommentar
Prøver å lage en "3d-motor" her nå, men det stopper når det kommer til paint-funksjonen. Hvordan skal jeg få ut X-Y utifra Z-X-Y og Player-Z-X-Y-Vinkel ? Hva er den ultimate formelen?

Jeg kunne dette når jeg hadde vektor matematikk på høyskolen. Nå husker jeg selvfølgelig ingenting av det, så jeg må nok friske opp kunnskapene hvis jeg skal kunne hjelpe deg. Har heldigvis bøkene liggende på loftet.

 

Uansett så kan jeg iallefall forklare deg såpass mye som dette:

For å vise 3d koordinater på en skjerm (2d plan) så må du forestille deg at du står på et punkt i 3d rommet og ser på koordinatene gjennom et plan. Alle punktene du ser vil da ha et krysningpunkt med 2d planet, og det er disse koordinatene som gir deg xy koordinatene på skjermen.

 

Det enkleste er å stille seg selv i origo (0,0,0) og plassere 2d planet (skjemen) et stykke nedover z-aksen med senter av skjermen på denne aksen.

 

Formelen for å transformere 3d koordinater til 2d koordinater blir da:

skjerm.x = distanse*(punkt.x / punkt.z)

skjerm.y = distanse*(punkt.y / punkt.z)

 

"distanse" i formelen er avstanden fra origo til skjemen (z verdien).

 

 

Denne siden forklarer litt bedre.

 

 

Jeg laget et eksempel for lenge siden i dhtml som viser dette i levende live. Her er et annet eksempel.

Endret av kaffenils
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...