[ < ]

[ > ]

 

[ << ]

[ Up ]

[ >> ]

 

 

 

 

[Top]

[Contents]

[Index]

[ ? ]

4.3.1.4 A kamera

A Crystal Space -ben létezik egy 'iView' nevű interfész, ami magába foglal egy az 'iCamera' és egy 'iClipper2d' példányt. Elvileg használhatod ezeket osztályokat külön is, de az 'iView' használata egyszerűbb. Most szerkeszük a 'simple.h' -t, hogy használni tudjuk az 'iView'-et:



 

...
class Simple
{
private:
  ...
  csRef<iView> view;
  ...
  void ProcessFrame ();
  void FinishFrame ();
  ...

Aztán szerkeszd a 'simple.cpp' fájt és tedd meg az alábbi változtatásokat az Application() függvény végén:

 

bool Simple::Application ()
{
  ...
  view.AttachNew(new csView (engine, g3d));
  iGraphics2D* g2d = g3d->GetDriver2D ();
  view->SetRectangle (0, 0, g2d->GetWidth (), g2d->GetHeight ());
  ...
  view->GetCamera ()->SetSector (room);
  view->GetCamera ()->GetTransform ().SetOrigin (csVector3 (0, 5, -3));

  return true;
}

Tehát elsőként létrehozunk egy nézetet a világunkban, és egy különáló 3D renderert. A nézetnek saját szektora van, ami a kamerához tartozik és a SetSector() segítségével állítható be. Emellett a kamerának pozíciója van a szektorban, amit be lehet állítani, ehhez venni kell a kamerát a GetCamera() segítségével és ezután be lehet állítani a pozíciót (ami egy csVector3) a SetPosition() A nézet tárol egy vágási területet, ami a világot kirajzoló ablakba illeszkedik. A Crystal Space támogatja a konvex poligonokat, mint nézőteret, deebben az esetben egy egyszerű téglalapot használunk, aminek a mérete megegyezik az ablak méretével. Ezt a nézeti téglalapot a SetRectangle() függvénnyel állítjuk be.

Egy új nézet létrehozásának a meghívása egy kicsit különleges. Lásd a gyors pointereket részletesebben bemutató részt. Correctly Using Smart Pointers

Ez még mindig nem elég. Van egy kameránk, de még nem használjuk azt. Meg kell írnunk azt a kódot, ami a tulajdonképpeni képernyőre rajzolást végzi. Ezt a ProcessFrame() és FinishFrame() függvényekben végezzük el. Megjegyezzük,hogy a Crystal Space eseményvezérelt, tehát a rajzolás frissítését az eseménykezelő idézi elő. Add a következő kódot a a forrásfájlhoz:



 

void Simple::ProcessFrame ()
{
  // Tell 3D driver we're going to display 3D things.
  if (!g3d->BeginDraw(
    engine->GetBeginDrawFlags() | CSDRAW_3DGRAPHICS))
    return;

  // Tell the camera to render into the frame buffer.
  view->Draw ();
}

void Simple::FinishFrame ()
{
  g3d->FinishDraw ();
  g3d->Print (0);
}

A képernyőre rajzolás két lépésben történik. Az első rész a ProcessFrame() függvényben zajlik l. Itt töltjük ki a megjelenítést. Ebben az esetben az engine-t kérjük meg, hogy végezze ezt el a view->Draw() meghívásával. De elméletileg bármilyen rajz műveletet el tudsz it végezni.

A ProcessFrame() függvényben ekőször jelezzük a 3D raszterizálónak, hogy el akarjuk indítani a 3D grafika kirajzolását. Ez a hívás biztossá teszi, hogy a szükséges bufferek elő vannak készíve és megtörtént minden szükséges inicializálás.Az engine gyakran igényel további beállításokat ezért meg kell hínod az engine->GetBeginDrawFlags() függvényt ezeknek a jelzőbitekenek az eléréséhez.

A második rész a FinishFrame(), ahol a képkockát (frame) a képernyőre helyezzük. Ez a megosztás azért van, mert más Crystal Space konponensek (pluginok) válaszhatják azt, hogy lehallgatájk az eseményeket és további dolgkat rajzolnak a 3D nézet tetejére a ProcessFrame() függvényben. Ha egy képkocákt renderelni kell, a Crystal space keretrendszer négy üzenetet fog elküldeni:

Fordítsd le és futtasd az alkalmazást! Ez az első alkalom hogy látniis fogsz vlaamit, egy szilárd falat. Gratulálunk, megalkottad az első majdnem használható Crystal Space alkalmazásodat.


[ < ]

[ > ]

 

[ << ]

[ Up ]

[ >> ]

This document was generated using texi2html 1.76.