Gå til innhold

Still spørsmål innen spill og grafikk programmering


Anbefalte innlegg

Videoannonse
Annonse

Hmm... Begynner å se på texture-mapping i GL, men alle eksemplene jeg skjønner er skrevet i GLUT, og glut ser ut til å være veldig callback-basert, noe som passer meg dårlig. Er det mulig å bare bruke glut til å åpne et fiks ferdig vindu (vet du har slitt mye med GLX :D fått det til?), og bruke GL "synkront" der jeg selv flusher til skjermen?

Lenke til kommentar

Jeg bruker selv ikke GLUT, og det ser ut til at du må bruke callback funksjonaliteten. Det finnes derimot alternativer til GLUT, som for eksempel GLFW.

Her er en mer komplett liste:http://www.opengl.org/resources/libraries/windowtoolkits/

 

Jeg bruker ingen av delene fordi Glorg skal kunne kjøre under Any CPU, og jeg må derfor enten finne et .NET/Mono bibliotek for OpenGL Window opplegg, eller skrive det selv. Foreløpig har jeg skrevet det selv, men glX er dårlig dokumentert i forhold til wgl som det finnes tusenvis av tutrials til. Dessuten vet jeg mer eller mindre ingenting om X programmering, og det virker til at jeg er langt ifra alene om det. ^^

 

edit: hmmm jeg tror jeg fant på en måte å kunne dynamisk lenke 32-bit eller 64-bit så jeg kan bruke et window API istedet for å slite med dette selv...

Endret av GeirGrusom
Lenke til kommentar

Rein Xlib er noe man helst ikke bør drive med :') Svart magi. At glX er dårlig dokumentert hjelper heller ikke :\ Litt synd egentlig.

 

GLFW ser derimot veldig lovende ut.

 

EDIT: VELDIG lovende. Dette ser ut til å være akkurat det jeg har lett etter.

Endret av TheMaister
Lenke til kommentar

Rein Xlib er noe man helst ikke bør drive med :') Svart magi. At glX er dårlig dokumentert hjelper heller ikke :\ Litt synd egentlig.

 

GLFW ser derimot veldig lovende ut.

 

EDIT: VELDIG lovende. Dette ser ut til å være akkurat det jeg har lett etter.

 

Xlib er ikke så dårlig dokumentert. Jeg fikk opp OpenGL på under en time med Xlib. Du kan følge denne tutorialen her http://www.opengl.org/wiki/Programming_OpenGL_in_Linux:_GLX_and_Xlib, men hvis du ikke gidder å lære deg Xlib så kan du bruke SDL som kan ta imot input og vise bilder i mange formater.

Den støtter også lydfiler og nettverkprogrammering.

 

-Tapped

Lenke til kommentar

Er det noen som har fungerende kode i C++ for en matrix inverse av en 4x4 homogen matrise? Den koden under ser ikke ut til å gjøre noe som helst med matrisene mine...

 

float Mat4::determinant() const
{
return
	m_m14 * m_m23 * m_m32 * m_m41 - m_m13 * m_m24 * m_m32 * m_m41 -
	m_m14 * m_m22 * m_m33 * m_m41 + m_m12 * m_m24 * m_m33 * m_m41 +
	m_m13 * m_m22 * m_m34 * m_m41 - m_m12 * m_m23 * m_m34 * m_m41 -
	m_m14 * m_m23 * m_m31 * m_m42 + m_m13 * m_m24 * m_m31 * m_m42 +
	m_m14 * m_m21 * m_m33 * m_m42 - m_m11 * m_m24 * m_m33 * m_m42 -
	m_m13 * m_m21 * m_m34 * m_m42 + m_m11 * m_m23 * m_m34 * m_m42 +
	m_m14 * m_m22 * m_m31 * m_m43 - m_m12 * m_m24 * m_m31 * m_m43 -
	m_m14 * m_m21 * m_m32 * m_m43 + m_m11 * m_m24 * m_m32 * m_m43 +
	m_m12 * m_m21 * m_m34 * m_m43 - m_m11 * m_m22 * m_m34 * m_m43 -
	m_m13 * m_m22 * m_m31 * m_m44 + m_m12 * m_m23 * m_m31 * m_m44 +
	m_m13 * m_m21 * m_m32 * m_m44 - m_m11 * m_m23 * m_m32 * m_m44 -
	m_m12 * m_m21 * m_m33 * m_m44 + m_m11 * m_m22 * m_m33 * m_m44;
}

Mat4 Mat4::inverse() const
{
float det = determinant();
if (det == 0)
	throw std::runtime_error("Attempt to invert degenerate matrix.");
return *this * (1 / det); // Returnerer denne matrisen multiplisert med en skalar invers determinant.
}

Lenke til kommentar

Er det noen som har fungerende kode i C++ for en matrix inverse av en 4x4 homogen matrise? Den koden under ser ikke ut til å gjøre noe som helst med matrisene mine...

 

float Mat4::determinant() const
{
return
	m_m14 * m_m23 * m_m32 * m_m41 - m_m13 * m_m24 * m_m32 * m_m41 -
	m_m14 * m_m22 * m_m33 * m_m41 + m_m12 * m_m24 * m_m33 * m_m41 +
	m_m13 * m_m22 * m_m34 * m_m41 - m_m12 * m_m23 * m_m34 * m_m41 -
	m_m14 * m_m23 * m_m31 * m_m42 + m_m13 * m_m24 * m_m31 * m_m42 +
	m_m14 * m_m21 * m_m33 * m_m42 - m_m11 * m_m24 * m_m33 * m_m42 -
	m_m13 * m_m21 * m_m34 * m_m42 + m_m11 * m_m23 * m_m34 * m_m42 +
	m_m14 * m_m22 * m_m31 * m_m43 - m_m12 * m_m24 * m_m31 * m_m43 -
	m_m14 * m_m21 * m_m32 * m_m43 + m_m11 * m_m24 * m_m32 * m_m43 +
	m_m12 * m_m21 * m_m34 * m_m43 - m_m11 * m_m22 * m_m34 * m_m43 -
	m_m13 * m_m22 * m_m31 * m_m44 + m_m12 * m_m23 * m_m31 * m_m44 +
	m_m13 * m_m21 * m_m32 * m_m44 - m_m11 * m_m23 * m_m32 * m_m44 -
	m_m12 * m_m21 * m_m33 * m_m44 + m_m11 * m_m22 * m_m33 * m_m44;
}

Mat4 Mat4::inverse() const
{
float det = determinant();
if (det == 0)
	throw std::runtime_error("Attempt to invert degenerate matrix.");
return *this * (1 / det); // Returnerer denne matrisen multiplisert med en skalar invers determinant.
}

 

Jeg tror jeg ser hva feilen er. Det du returnerer er en over determinanten ganger med selve matrisen, men det du egentlig skal gange med er adjointen til matrisen ikke selve matrisen.

 

Du finner adjointen ved å transponere kofaktorene til matrisen.

 

Formelen for å finne en inverse matrise er M-1 = adjM / |M|

Fordi at deling er mer krevende enn ganging, på en datamaskin, så setter man 1 over det man skal dele med.

Derfor pleier man å sette 1 over determinanten fordi at ellers så måtte du ha delt svaret 16(4 x 4) ganger for å finne inversen til matrisen.

 

Du kan bruke følgende side for å finne kofaktorene av en 4x4 matrise. http://www.mathisfunforum.com/viewtopic.php?id=10440

Jeg har ingen kode liggende for 4x4 matrise fordi jeg pleier heller å bruke 4x3 matrise. ;)

 

-Tapped

Endret av Tapped
Lenke til kommentar

Hjertelig takk Tapped. Etter litt godvilje med regex i VS, fikk jeg lagd meg cofactor og adjoint med linken over, og nå funker inverse nydelig. :)

 

Er overrasket over hvor mye regning som må til for å regne ut disse da, så prøver å bruke det minst mulig...bruker f eks transpose et sted i stedet for inverse for å finne inverse matrisen til en homogen rotasjonsmatrise. Dette er mulig pga rotasjonsmatrisers transpose = inverse for samme.

Lenke til kommentar

Tapped: Kan du vise oss noen av dine demoer? Er du med i demoscenen?

Kunne gjerne tenke meg å starte med spillprogrammering igjen, men da enten med Direct X eller OpenGL. Høyst sannsynlig OpenGL for multiplatform.

 

De bøkene du linket til tidligere i tråden, er det «nok» grunnkunnskap for å starte med utvikling av demoer? (Det er primærønsket mitt.)

 

Takk. :)

Lenke til kommentar

De bøkene du linket til tidligere i tråden, er det «nok» grunnkunnskap for å starte med utvikling av demoer? (Det er primærønsket mitt.)

 

 

Ja, de bøkene er bra, men det viktigste er å prøve selv og lære av feilene sine.

Så bøkene skal bare hjelpe deg i å komme igang, du vil aldri lære å bli avansert grafikkprogrammerer med disse bøkene.

 

Den boken jeg har fått mest ut av er "3D Math primer for graphics and game development" :thumbup: . Jeg som er 14 år gammel klarte å komme igjennom matematikken i denne boken.

 

Jeg liker også "Programming Game AI by Example" :) som lærer deg å bruke matte til å lage avansert AI.

 

"Beginning OpenGL Programming" er en bra bok til å starte med, men du må nok gå innom http://nehe.gamedev.net/ for å lære mer.

 

-Tapped

Endret av Tapped
Lenke til kommentar

Tusen takk! :thumbup:

Skaffer meg de bøkene snart. Du har ikke lyst å dele noen demoer med oss?

 

Jeg holder på å lage en Spillmotor nå, men jeg kan jo se på hva jeg får tid til.

 

De fleste av demoene mine har vært for å teste meg selv ikke for å vise andre hva jeg kan lage. Så ingen av demoene er "ekte".

Lenke til kommentar

Hmm jeg trodde inverse funka, men en transponert roteringsmatrise fra en quaternion med vilkårlige verdier gir ikke det samme som den inverse, men på enkle roteringsmatriser (RotateX) gjør den det... Er det egentlig riktig?

 

Sjekk om rotasjonsmatrisen du får fra quaternionen din er ortonormal. Hvis den ikke er det holder det ikke å transponere den. Tror rotasjonsmatrisen skal bli ortonormal hvis du normaliserer quaternionen.

 

Just in case: En ortonormal matrise er en matrise hvor alle kolonnene er ortogonale (dotproduktet mellom de er null), og lengden av hver kolonne er 1.

Lenke til kommentar

Hmm jeg trodde inverse funka, men en transponert roteringsmatrise fra en quaternion med vilkårlige verdier gir ikke det samme som den inverse, men på enkle roteringsmatriser (RotateX) gjør den det... Er det egentlig riktig?

 

Rotasjon og refleksjon matriser skal være ortogonale matriser.

 

En matrise er ortogonal, når matrisen ganger transponeringen av matrisen = Identity matrisen.

 

Matrisen sin transponering = inversen bare når matrisen er ortogonal.

 

Det kan skje at en matrise ikke er ortogonal lenger fordi at du har satt inn feil tall i matrisen eller float-point feil som er kalt matrix-creep.

I din situasjon ser det ut som at du har satt inn feil tall i rotasjonsmatrisen din. Det er en måte å få matrisen til å bli ortogonal igjen ved å ortogonalisere matrisen.

 

Dette gjøres ved å først lage tre rad vektorer( bare hvis det er 3x3 matrise). For hver rad vektor subtraherer du av delen av vektoren som er parallell til de andre vektorene, resultatet vil bli en vinkelrett vektor, som du må normalisere for å få en ortonormal.

Du må nesten se i en mattebok for å finne formelen fordi jeg orket ikke å skrive det inn her.

 

-Tapped

Endret av Tapped
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å
×
×
  • Opprett ny...