Nu er det meget lettere at styre firkanten! Der er stor forskel på om du først rotere og dernæst flytter en geometri eller omvendt. Prøv eventuelt at bytte om på de to kald og se selv forskellen. Bliver en geometri først flyttet for dernæst at blive roteret, vil den rotere omkring sig selv. Men bliver den derimod først roteret for dernæst at blive flyttet, vil den rotere rundt om viewporten!
Når vi laver et spil har vi ofte brug for en slags kamera. Det findes bare ikke en egentlig kamera i OpenGL! Det eneste du kan gøre er at flytte og rotere rundt på geometrien. Men som jeg lige nævnte, så er der stor forskel på om du først rotere og dernæst flytter en geometri. Dette kan vi udnytte. Så i stedet for at vi bevæger os rundt om geometrien, lader vi geometrien flytte rundt om os! Da vi naturligvis ikke kan se andet end dét geometri vi har tegnet, vil man ikke kunne ane forskel i lige vel. Men hvordan kan vi så komme til at bevæge os rundt i en 3D verden, ligesom eksempelvis Doom og Quake? Hemmeligheden er Sinus og Cosinus. Det unikke for netop de to matematiske begreber, er, at når den ene er 0 er den anden 1, hvis vel og mærket, vi bruger samme værdier for dem begge. Da vi ønsker at bevæge os rundt, som om vi faktisk går, inde i en 3D verden, behøver vi kun at koncentrere os om X of Z akserne for vores Translation. Da vi yderligere kun kan dreje til højre og venstre, behøver vi derfor kun at koncentrere os om Y aksen i vores Rotation. Lad os derfor prøve at lave en stor firkant som gulv, som vi kan bevæge os hen over. Før du kompiler, skal du lige huske at tilføje "Math" under uses, da vi benytter DegToRad() (Degrees to Radians):
For at kigge op og ned kan vi gøre det meget enkelt bare ved at rotere rundt om X aksen. Jeg har valgt at bruge Insert og Delete tasterne til dette formål:
Hvis du kompiler, vil du se at det faktisk føles som om du går rundt på det nye gulv! Lad os forestille os, at vi også gerne ville kunne hoppe ligesom i Quake. Der er bare dét problem, at når man hopper, sker der en hel automatisk bevægelse. Indtil nu har vi ladet OpenGL rendere nye frames for, hver gang vi tastede en tast. For at løses dette problem, bliver vi nødt til at få et eller andet til autoimatisk at rendere vores 3D verden. Til dette formål er vores applikations OnIdle indelysende. Så lad os lave en Idle procedure, der tage sig af den automatiske rendering. Skriv dette under din TForm1's Private Declarations. Hvis du bruger en højere version end Delphi 4, må du se i din hjælpfil, hvordan man laver en Idle procedure til din Delphi kompiler:
Tilføj følgende kode i din FormCreate() procedure og fjern din FormPaint(nil) i din FormKeyDown procedure:
Prøv at kompile og se om ikke din Idle procedure opdatér din FormPaint() procedure korrekt. Hvis det virker som før, virker det korrekt! Det vil være meget brugbart i fremtiden at kunne se, hvor mange gange i sekundet OpenGL rendere vores kode. Dette kan gøres meget hurtig ved at trække en TTimer komponent ned på vores form. Tilføj to globale varianter: FPS og I som Integer, og skriv følgende i din Idle procedure:
Kompile nu koden. Du vil forhåbentligt kunne se, at et tal dukker op i din forms caption. Dette tal viser hvor mange gange i sekundet (FPS - Frames Per Second) vores kode vil blive renderet af OpenGL - på min computer er det omkring 60 (Da min skærms Refresh Rate er sat til 60). Det er ikke helt præcist, da TTimer'en ikke helt præcists timer for hvert sekund, men det er præcists nok for os. Da vi nu hele tiden får vores kode renderet har vi nu mulighed for at lave vores ønskede hoppe bevægelse. Da vi ikke kan lave selve hoppe "animationen" i vores OnKeyDown procedure alene, har jeg valgt at skrive den i Idle proceduren. Tilføj derfor en ny variant: Jump som en Boolean. Når Jump er true bliver hoppe bevægelsen aktiveret i Idle proceduren.
Som du kan se bliver gulvet presset -1 unit ned langs Y aksen (med et interval på -0.1 unit), hvilket får det til at se ud som om, at vi hopper op ad!. Jeg har valgt at bruge min Space tast til at aktivere hoppe bevægelsen med, skriv derfor følgende kode i OnKeyDown proceduren:
Kommentarer (58)
WooooW... Her kan jeg ikke sig andet en flot arbejde... Det er fandme en Nice artikel... Du har ændret 2 ting i mit liv:
1. Du har lært mig om mulighederne med OpenGL
2. Du har givet mig MEGET lyst til at prøve Delphi
Fandme en flot artikel
Den har sQ nok taget langtid om at lave men jeg har fandme fået løst til at sætte mig til OpenGL istedet at programmere programmere browsere .mm
Mange tak skal I havde...
En rigtig, rigtig god artikel. Tak for det!
Håber virklig der kommer flere artikler fra dig af med OpenGL
God, enkel og detaljeret artikel :o)
Virkelig god artikel! Håber meget på at vi snart får nogle flere af den slags - spilprogrammering må vist være noget af det mest populære man kan skrive om
. Keep up the good work!
Endnu engang mange tak for rosen! Jeg vil lige nævne at hele kildekoden jeg brugte til denne artikel, kan downloades fra min site. Det kan måske være lettere at overskue de mange procedure i en Delphi unit.
Fed artikel!!
Men jeg har et problem... Hvis jeg sætter min forms WindowState til WsMaximized bliver gulvet, loftet og vægen usynelige.. hvorfor??
Jeg har undladt at nævne det i denne artikel, Da jeg syntes den allerede fyldte ret meget. Men jeg burde nok havde inkluderet den, siden flere har spurgt mig. Det er beskrevet som det første i den NYE artikel, (som jeg er halvvejs med). Så hvis du kan leve med det indtil da
Det er helt i orden
Så øver jeg mig bare lidt mere i OpenGL i mellem tiden...
Jeg synes virkelig denne artikel er meget god! Og den fortjener virkelig at få top karakter. Jeg glæder mig til at komme videre med mit spil
Håber der snart kommer en efterfølger af dig! Bliv ved med det!
Imponerende artikel!
Præcist, hvad skal man bruge til denne her tutorial??? jeg har Delphi, men hvad ellers???
jeg er lidt af en n00b
Det er det eneste! En Delphi kompiler er såmænd nok
Det er blandt andet derfor jeg foretrækker OpenGL!
Så mangler vi bare at der er en der omskriver artiklen til os der programere c++ i borland
Kanon artikel ellers
"Jeg vil lige nævne at hele kildekoden jeg brugte til denne artikel, kan downloades fra min site. " - Hvorhenne på din side? Jeg kan ikke lige finde den...
Men, fandme en nice artikel! Hvis alle skrev sådanne artikler, havde der overhovedet ikke været behov for rating system, da alle ville ligge til et 13-tal (5-tal, men altså
)
!
Så til Søren Klit Lambæk: Godt arbejde, og bliv endelig ved med det
Sidst i artiklen er en link til den! ellers er det:
http://www.opengl-delphi.dkDet glæder mig meget at I kan bruge min artikel! Det er ikke tit man ser artikler om 3D udvikling på dansk, men nu ved jeg, at det i hvert fald IKKE er fordi, at folk ikke værdsætter det
Gerne direkte link, kan ikke lige finde kildekoden
Kunne ikke forstå et eneste ord.
Det her er det jeg ikke forstår:'
1) for ikke at hvide hvor komomenterne ligger...
2) Den første kode er et elle andet sted hvor der står type. Hvor er det...
3) Nr. 2's sted skriver du navnet på de 2 kompomenter. Kan ikke skrive det før at kompomenterne er fundet.
Resten læste jeg ikke da det ikke ville hjælpe mig.
Kan i ikke lige hjælpe mig...
Tak
Theis>> Helt ærligt så ved jeg ikke hvad du mener! Hvis du er usikker med at programmere Delphi, så vil denne artikel være en stor mundfuld for dig, så det kan være at du skal vente til du ved lidt mere om Delphi.
Jeg har i ligevel prøvet at besvare så godt jeg kunne forstå:
1-2) En Type skal selvfølig altid defineres før selve typen blive anvendt i en kodesammensætning. Præcis hvor en type skal defineres er meget afhænig af dit formål med typen. I dette eksempel ville en global definering være meget indelysende!
3) Jeg ved ikke hvad det er for nogen 2 komponenter du mener!
NB: Prøv ar være mere præcis næste gang
)
Tja...
Søren Klit Lambæk
Vis du syns at jeg skal vænte efter jeg har læst en bog på 500 sider, en anden på 200 og en 3'ge på 140 sider, vil jeg sige nej.
Jeg ved udmærket meget om delphi.
Men jeg fårstår ikke rigtigt hvor de første 2 koder skal insættes...
Der er måske ikke 2 komomenter men jeg kunne bare ikke få det til at virke...
Kan i hjælpe???????
He he det var bestemt ikke for at fornærme dig, men siden du ikke er sikker på hvor det første kode skal skrives fik jeg den opfattelse at du ikke var helt inde i Delphi - hvilket jo ville havde været en ærlig sag
Du kan downloade kildekoden fra min site:
http://www.opengl-delphi.dk/source1.zipDer vil du hurtig kunne overskue hvordan jeg har sat det sammen.
Men det gør faktisk ligemeget hvor du implementere de 2 første kode eksempler, så længe de kan identificeres af din forms OnCreate property!
NB: Desuden vil jeg sige at en bog på 500 sider, en bog på 200 og en på 140 ikke er særligt meget! Jeg har 7 x 500 siders bøger liggende omkring Delphi, og føler stadig jeg mangler at vide meget endnu!
Søren Klit.
Im sorry. Det var ikke negativt ment. Det er sådan, at jeg bare godt tror at jeg ville kunne klare det. Jeg får også somme tider hjælp af en ekspert jeg kender...
Og jo 500 side, 200, 150 er ikke helt utrolig meget. Men jeg syns dog at det er nok til dette.
Jeg syns heller ikke selv at jeg ved nok om delphi. Men dog en masse...
Jeg kigger lidt på hjemmesiden...
Kanon artikel! Det må jeg sige... Klart et 5 tal herfra! Synes der er 1 ting som er dårligt! Det er at du kun har fået 2000 UP for den! Come on Admin's, den er da mindst 10.000 værd!
Kepp Up The Good Work!!!!!
Hej Søren Klit Lambæk.
Nu prøver jeg igen efter at have kigget på noget andet.
Dog har jeg et spr. efter dine første 30 linier.
Det lyder jo let. Og jeg kan fortå at jeg bare skal skrive det der (mener det er
OpegGL i user listen.
Men da jeg læste den ble jeg usikker om der er noget kompoment der skal fides frem fra kompomentpalleten? Er der det. Der står ingen adresse så det skal i såfald ikke hentes...
Nå Men Tak
type
TContext = record
RenderContext, DeviceContext : THandle;
end;
--------
Skal denne ikke ned i vores kode der oppe vor der allerede står
type
TForm1 = class(TForm)?
Vis ja, skal jeg slætte TForm1 = class(TForm). For så vil jo den ikke starte. Det er klart?
Bleger det ikke altid at være en liste over vilke kompoments der er brugt der står der oppe?
Hvis ja, hvor ligger så de kompomenter?
Engang for ALLE! Nej, der er ikke brug for komponenter eller at installere nogen komponenter, eller hentes findes nogen frem fra komponentpanelleten, for at bruge OpenGL i mine artikler! Så er det vist sat på plads! Alt du skal gøre for at kunne benytte OpenGL kald er at tilføje "OpenGL" under uses, som jeg har nævnt op til flere gange!
Når man skriver noget under uses, linker man en unit (.pas eller .dcu) til sit projekt! Dette er ikke nogen komponent, det er bare en anden unit med noget kode!
Du må selv om hvor du definere dine typer og varianter, så længe de kan identifiseres af de forskellige procedure og funktioner der har brug for dem!
Du skal ikke på nogen måder slette din forms klasse! Hvis du gør det vil du jo ikke havde nogen form, og dermed ikke kunne se grafikken! Du skal forøvrigt slet ikke slette noget af det kode som din Delphi kompiler for-skriver for dig!
Hvilken Delphi kompiler bruger du? Jeg har hørt at der skulle være problemer med de helt nye kompiler fra Borland, da de bruger et helt nyt filsystem! Men hvis du har en kompiler fra version 7 og ned efter, skulle der ikke være nogen problemer overhovedet!
Med venlig hilsen
Søren Klit Lambæk
Tillykke.
Jeg bruger Delphi 7 Enterprice (eller hvad det hedder).
Du behøver ikke at hisse dig op. Husk på at jeg spør da jeg er en noob. Og jeg må indrømme at jeg burde kunne havde lidt mere viden om hvad du taler om, får at jeg kan arbejde med det.
Men en 13 årigs drøm er da 100% at kunne lave fede 3d spil. Så jeg kan ikke vændte.
Men vis du syns det er irrigterende at jeg spør. Så må du lade vær at svare. Som dog ikke er pænt og jeg vil heller ikke blive glad.
Men så har jeg da heller ikke spurt så meget.
Men er det så umuligt at få lavet OpenGL med mit delphi version igennem din artikel.
Så må du da lave en for de folk som ejer den nyeste version.
Ellers må jeg da købe en af de gamle.
MEN SÅ ER JEG SUR VIS DET IKKE VIRKER!!!
Den er i såfald ikke glad for den første kode...
Tag det roligt.
Hilsen Theis F. Hinz (Shafh)
Jeg har bestemt ikke hidset mig op (Så skulle du høre når jeg hidser mig rigtigt op he he...)
Jeg er ikke træt af at folk spørger og slet ikke noob, men det kan måske være lidt trættende at få samme spørgsmål igen og igen... når jeg ikke kan gøre det mere klart end - INGEN KOMPONENTER!
Nå, men nok om det!
Selvom man er 13 år skal man selvfølgelig også havde en chance for at lave sine egne 3D Spil. Denne artikel henvender sig derfor til alle uanset alder, køn og race!
Du bruger Delphi 7, og den skulle altså hvad jeg har fået fortalt virke til mine artikler. Men du kan selv tjekke det ved at se hvad efternavne dine projekt filer hedder. Hvis de enten hedder DCR, PAS eller DCU skulle der være rimlig garanti for at det virker. Men hvis du siger at mit kode ikke virker så gør den det jo selvfølgelig ikke! Jeg har aldrig haft version 7 selv (bruger den gamle version 4 standard), så jeg kan med gode grunde ikke vide det med sikkerhed!
Prøv at oprette et nyt projekt og skriv "OpenGL" under uses, uden at skrive andet. Hvis det viser sig at din kompiler allerede brokker sig der er der noget galt!
Hvis den skriver: "OpenGL.Pas unidentified" eller lign. er det fordi filen OpenGL.pas ikke ligger, hvor den skal eller slet ikke findes!
OpenGL.Pas filen er en interface til OpenGL32.DLL filen som Windows bruger til at få kontakt til dit grafikkort med. OpenGL.pas filen skulle følge med din kompiler som standard! Ellers prøv at lade Windows foretage en fil-søgning efter denne fil!
Hvis det viser sig at du ikke kan finde denne fil kan du helt sikkert downloade den fra nettet. Der findes en anden fil kaldet OpenGL12.Pas det er ikke den! Det er en nyere version, og bliver ikke brugt i mine artikler, men den kan dog fint bruges, hvis man har lidt forstand på OpenGL!
Hvis intet af dette virker, så spørg igen. Og vi vil finde ud af en anden løsning! For 3D udvikling er noget af det sjoveste der findes, og det må du ikke gå glip af, hvis du hat lyst til det!
Held og Lykke
Med venlig hilsen
Søren Klit Lambæk
Tak.
det var et dejligt svar.
Men det virker med OpenGL i user listen.
Men koderne du skriver på artiklen virker ikke...
Men mine filer er også: .dmf, .dpr og .Pas.
Jeg prøver mig at andskaffe en gratis udgave af delphi 4, 5 eller 6.
Du behøver ikke at svare.
Du har været til fantastisk hjælp, og jeg kan ikke vendte til at prøve!!!
Svare måske om en et godt stykke tid, og siger om det virker.
Du behøver ikke at skifte kompiler! Det skulle virke, jeg har fundet ud af at jeg kender en som bruger Delphi 7, og han kan sagtens kompile min artikel!
Prøv at downloade kildekoden fra artiklen!
kopiere indholdet fra .pas filen men KUN det jeg skriver i artiklen, og ikke noget af det der er pre-skrevet af Delphi! og tilføj derefter OpenGL under uses!
Så skulle det virke! Kom tilbage, hvis det ikke virker, og fortæl mig præcis det din Delphi kompiler skriver af fejlbesked!
Jeg tror grunden er at Delphi 7 bruger nogle units filer som Delphi 4 ikke behøver! Så hvis du kopiere hele min .pas fil og vil kompile det i Delphi 7, mangler den nogle af de units!
Theis tror du ikke du skulle passe lidt på med at sige at dine artiklens koder ikke virker!...
Somregl er det jo en selv som har tastet forkert...
Jeg ved godt du har læst 999999999 sider om delphi... det er også godt... men kan du bruge alt det du har lært? eller har du bare læst det?...
Jeg har arbejdet med delphi i ca. 1, 2 uger nu... sådan for sjovt.... og jeg kan sagtens få denne artikel til at virke...
jeg bruger også Delphi 7 EnterPrise...
Så der skulle ikke være noget der!
Men tænk lige en ekstre gang når du siger at en kode ikke virker!
måske er det dig som har lavet fejlen!
Til Søren.....
Damn en god artikel! kan det gøres bedre?
Jo, tak.
Men nu har jeg også fået delphi 6. Men det virker ikke.
Jeg vil meget gerne sende dig et screenshot af det. Men alt det du skriver har jeg gjordt...
Kasper Svendsen>> Mange tak
Theis>> Send mig lige din kildekode! Der må absolut være noget du helt har misforstået med denne artikel eller Delphi generalt!
Kan jeg skrive det i en mail, ellers vil det fylde total meget. Og det vil både fylde på din artikel, og gør det måske lidt ufedt. Og også da det ikke interresere andre. Kan du ikke give en mail?
Heyyyy.
Jeg har fundet ud af det sådan set.
Fedt.
Og Søren jeg må undskylde alt den tid jeg har brugt....
Har kommet langt i denne artikel (helt hen og fået lavet en firkant.¨
Men mystisk nok at efter jeg har fået lavet det første med en firkant (den der er lidt lang), og jeg bliver ved med at bruge artiklen, vil den i de næste koder i artikelen kun komme den sorte baggrund på formen nå jeg afprøver det.
Why?
Men tak...
Nu er jeg kommet længere igen.
Jeg undskylder...
Men er der en der kan forklare hvordan idle kan laves i delphi 6 og 7?
har fundet ud af det igen...
Hej Drenge og Piger,
Sidder lige en sen Lørdag nat, og prøver denne fantastiske tutorial... men der kommer et problem jeg aldrig har set før.... Jeg er nogenlunde kendt i delphi, men har lige set det her før, er nået til første compile, og så kommer fejlen: EResNotFound???
Hvad er det og hvor kommer det fra, er det en fejl i installationen af Delphi? Eller er det mig
God weekend!
HA HA typist.... havde kommet til at slette linien: {$R *.dfm}
Undskyld drenge og piger..!!!
Hav en god aften...
I lige maade... Det var da godt at du fandt ud af problemet selv!
Hejsa igen drenge og piger, hvis I bare ønsker at BitMappet skal være i det samme bibliotek som dit program (EXE fil) så skal I skrive følgende ved LoadTexture delen:
Bitmap.LoadTexture('./Gulv.Bmp');
rigtig god artikel. men jeg har et lille problem,
min væg og mit loft er helt hvidt.
Kan du hjælpe?
Hejsa Tobias... Det kan vi jo ikke ha' ;-) Send lige dit kode til min mail, og jeg vil straks se på sagen!
Søren
jeg tror jeg har løst det selv.
Hej Søren,
Virkelig god artikel, men når man nu først kigger på artiklen nu her, og egentlig gerne ville se HELE koden, som du tidligere har haft liggende på dit website, er dette jo ikke muligt. Har du mulighed for at lægge koden op på nettet igen?
Med venlig hilsen
Daniel Juhl Mogensen
Jeg har skiftet hjemmeside da jeg ikke laengere bruger Delphi som mit hovedsprog! Jeg vil proeve at finde koden frem igen og evt. uploade den til mit nye site! Jeg skriver igen naar dette er sket!
Ikke for at skynde på dig, Søren, men det burde ikke tage over et år at finde en kode frem
Thomas>> ehhh, ikke helt sikker paa hvad du mener??? Har jeg lovet noget jeg ikke har holdt?
Naa, oki nu tror jeg at jeg er med igen! He he... du mener hele kilde koden for denne artikel? Ja, det har jeg altsaa fuldstaendigt glemt drenge! Er faktisk ikke sikker paa at jeg har den laengere!
Pyt med det
Hvad er dit nye hovedsprog?
Mit hovedsprog er C/C++. Jeg bruger stadig Delphi men dog i begrænset omfang. Egenligt kan jeg godt lide begge sprog på hver deres måde. Når det kommer til stykket er de stort set meget ens! Jeg er derfor ved at udvikle en spil motor der understøtter begge sprog. Det kan være jeg en dag skriver et par artikler/tutorials om hvordan man bruger den med de forskellige programmerings sprog. Hvis du er interesseret så kig en smut forbi
http://www.pixie3d.com
Rigtig godt skrevet!!
Kunne ikke gøres bedre
Dit Pixie3D projekt ser rigtigt interessant ud, og jeg tror at jeg vil tjekke det ud
Du skal være
logget ind for at skrive en kommentar.