OpenGL (3.) - Procházení scénou
V minulých článcích jsem Vám ukázal možnost jak vytvářet programy v Delphi využívající knihovnu OpenGL. Dnešním tématem bude vytvořit jednoduchou 3D scénu (prostě nějakou obyčejnou místnost), ve které se budete moci různě pohybovat a dívat.
Textury pro tuto scénu jsem použil z webu 3D cafe, jen jsem je mírně upravil pro požadovanou velikost. Na tomto serveru jich je opravdu mnoho a v případě potřeby je z čeho vybírat.
Pro základ této scény jsem použil zdroják z minulého článku. Je v něm vše, co potřebujeme pro tvorbu naší scény. Je však nutné upravit proceduru ctverec. Její název jsem změnil na TForm1.Scene a nadefinoval jsem ji pro zobrazení celé scény (čtyři čtverce pro stěny a dva na podlahu a strop). Těmto čtvercům jsem přiřadil také opakující se textury. Toho jsem docílil tak, že že jsem vhodně nastavil hodnoty u procedury glTexCoord2f.
![]() |
V neposlední řadě jsem také mnohem vylepšil funkce pro pohyb ve scéně a rozhlížení. V přiloženém programu se pohybujete šipkama nahoru a dolu (krok dopředu a dozadu), šipkama vlevo a vpravo (krok doleva a doprava) a natáčíte a díváte se pohybem myši. Tady je procedura pro pohyb klávesami UP, DOWN, LEFT, RIGHT:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_UP: begin //šipka nahoru
Z := Z + ((-sin((UhelY - 90) * (Pi/180))) * keys_sensitivity/50);
X := X - ((sin((UhelY) * (Pi/180))) * keys_sensitivity/50);
end;
VK_DOWN: begin //šipka dolu
Z := Z - ((-sin((UhelY - 90) * (Pi/180))) * keys_sensitivity/50);
X := X + ((sin((UhelY) * (Pi/180))) * keys_sensitivity/50);
end;
VK_LEFT: begin //šipka dolu
Z := Z - ((-sin((UhelY) * (Pi/180))) * keys_sensitivity/50);
X := X - ((sin((UhelY - 90) * (Pi/180))) * keys_sensitivity/50);
end;
VK_RIGHT: begin //šipka dolu
Z := Z + ((-sin((UhelY) * (Pi/180))) * keys_sensitivity/50);
X := X + ((sin((UhelY - 90) * (Pi/180))) * keys_sensitivity/50);
end;
VK_ESCAPE: begin
Application.Terminate;
end;
end;
end;
Podle úhlu natočení a sensitivity kláves vypočteme nové x-ové a y-ové souřadnice. Přidáme také funkci ukončení programu pomocí klávesy ESC. Takhle vypadá moje nová procedura pro ovládání myší:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; DX, DY: Integer); var pozice:TPoint; begin if bool then begin oldx:=dx;oldy:=dy;bool:=false;end; UhelY := UhelY + (mouse_sensitivity_y/10*(dx-oldx)); Uhelx := Uhelx + (mouse_sensitivity_x/10*(dy-oldy)); if Uhelx>70 then Uhelx:=70; if Uhelx<-70 then Uhelx:=-70; GetcursorPos(pozice); if ((ABS(pozice.x-(left+round(width/2)))>100) OR (ABS(pozice.y-(top+200))>100)) then begin dx:=0;dy:=0; SetcursorPos(left+round(width/2),top+200); bool:=true; end; oldx:=dx;oldy:=dy; end;
Rotaci provedeme v proceduře VlastnostiObjektu následovně:
procedure TForm1.VlastnostiObjektu; begin glMatrixMode(GL_MODELVIEW); glLoadIdentity; glTranslatef(0,0,0); //pozice kamery glRotatef(UhelX, 1, 0, 0); //rotace objektu v ose X glRotatef(UhelY, 0, 1, 0); //rotace objektu v ose Y glRotatef(UhelZ, 0, 0, 1); //rotace objektu v ose Z glTranslatef(X,Y,Z); end;
![]() |
| Popis obrázku |
Tady (25 kB) si můžete stáhnout zdroják dnešního výtvoru - bez textur - Ty si můžete stáhnout s příkladem na glDrawElements. Vím, že tento program by šel optimalizovat mnohem a mnohem lépe, než jsem to udělal já. Hodně věcí by šlo též udělat v assembleru. Já jsem však chtěl na dnešním příkladu ukázat, jak lze jednoduše v Delphi vytvořit v třeba jednoduchou 3D hru.
Vyšlo 05.11.2001, v blogu: 0 1 2 3 4 5 6 7 8
Děkuji, že jste se rozhodl(a) přečíst tento článek. Budu rád i za komentář. Pokud Vás tento článek zaujal a rádi byste jej doporučili ostatním, podpořte mně prosím tím, že věnujete minutku svého času a uděláte mi reklamu na linkuj.cz, vybrali.sme.sk či jagg.cz. Přeji příjemné čtení
Poslední články
- OpenGL (7.) - Detekce kolizí, načtení mapy a textury v jpg souboru
- OpenGL (6.) - Co je to MiniGL
- OpenGL (5.) - Urychlení pomocí glDrawElements
- Delphi (7.) - Syst. repro a autodestrukce souboru
- OpenGL (4.) - FullScreen
- 3D Studio MAX (8.) - Tvorba hořící zápalky
- 'DOOM' 3D Engine techniques
- OpenGL (3.) - Procházení scénou
- 3D Studio MAX (7.) - 3D text
- 3D Studio MAX (6.) - Vznášející se dým
- Adobe Photoshop (3.) - Textura vodní hladiny
- Jak se dostat do BIOSů
- Delphi (6.) - Grafika a zvuky
- Delphi (5.) - Zajímavé zdrojáky 2.
- 3D Studio MAX (5.) - Přízemní mlha ve 3D Studiu MAX

