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

Diskuse k blogu

Zatím nikdo nevložil komentář. Chcete být první? Přidání příspěvku
©PC-guru.cz 2000-2008 | Optimalizováno pro 1024*768