Der Player blickt in der 3D-Raum durch eine (imaginaere) Kamera, die sich an der Spitze des Frustums befindet. Ueber Tastatur und Maus wird die Kamera im Raum bewegt.
More...
Public Types |
enum | STEP_DIR {
STOP,
STEP_FORWARD,
STEP_BACKWARD,
STRAFE_LEFT,
STRAFE_RIGHT,
LIFT_UP,
LIFT_DOWN,
ROTATE_LEFT,
ROTATE_RIGHT,
LOOK_UP,
LOOK_DOWN
} |
Public Member Functions |
virtual | ~Camera () |
| Destruktor - Speichert auch die aktuelle Kameraposition.
|
void | action () |
| Wird in der Gameloop vor jedem Frame aufgerufen um die Kameraposition zu berechnen.
|
void | move (STEP_DIR step) |
| Setter fuer die auszufuehrende Vorwaerts-/Rueckwaertsbewegeung.
|
STEP_DIR | isMoving () |
| Getter fuer die auszufuehrende Vorwaerts-/Rueckwaertsbewegeung.
|
void | lift (STEP_DIR step) |
| Setter fuer die auszufuehrende Hoch-/Runterbewegeung.
|
STEP_DIR | isLifting () |
| Getter fuer die auszufuehrende Hoch-/Runterbewegeung.
|
void | strafe (STEP_DIR step) |
| Setter fuer die auszufuehrende Seitwaertsbewegeung.
|
STEP_DIR | isStrafing () |
| Getter fuer die auszufuehrende Seitwaertsbewegeung.
|
void | rotate (STEP_DIR step) |
| Setter fuer die auszufuehrende Drehbewegung.
|
STEP_DIR | isRotating () |
| Getter fuer die auszufuehrende Drehbewegung.
|
void | look (STEP_DIR step) |
| Setter fuer die auszufuehrende Drehbewegung.
|
STEP_DIR | isLooking () |
| Getter fuer die auszufuehrende Drehbewegung.
|
int | getZoneID () |
| Liefert die aktuelle Zonen-ID zurueck, in der sich die Camera befindet.
|
void | setZoneID (int zoneID) |
| Setzt die ZoneID fuer die Camera.
|
void | setPos (float x, float y, float z) |
| Setter fuer die Cameraposition im 3D Raum.
|
void | setDir (float x, float y, float z) |
| Setter fuer die Bewegungsvektor der Camera im 3D Raum.
|
void | stepForward () |
| Ein Step nach vorne (inkl. Kollisionserkennung)
|
void | stepBackward () |
| Ein Step zurueck (inkl. Kollisionserkennung)
|
void | stepStrafeRight () |
| Ein Step nach Rechts (inkl. Kollisionserkennung)
|
void | stepStrafeLeft () |
| Ein Step nach Links (inkl. Kollisionserkennung)
|
void | liftUp () |
| Ein Step nach Oben (ohne Kollisionserkennung)
|
void | liftDown () |
| Ein Step nach Unten (ohne Kollisionserkennung)
|
void | stepTurnRight () |
| Nach rechts drehen.
|
void | stepTurnLeft () |
| Nach links drehen.
|
void | lookUp () |
| Nach oben blicken.
|
void | lookDown () |
| Nach unten blicken.
|
void | setDir (float xw, float yw) |
void | setFrameRate (float fps) |
| Bei einer (angenommen) konstanten Framerate von 30 fps, liegt die konstante Rotationsgeschwindigkeit bei 2 Grad pro Frame.
|
void | incMove () |
| Simulation der Pendelbewegung beim laufen: Beim laufen und beim gehen unterliegt der menschliche Koerper einer leichten Auf- und Abbewegung. Die daraus resultierende Kamerapendeln wird durch eine Sinusfunktion simuliert.
|
bool | collision (int typ, int dir) |
| Testet auf eine Kollision.
|
float | getLevel () |
| getLevel
|
void | dump () |
| Dump-Methode fuer debuging.
|
void | load (DataInputStream &dataIn) |
| Liest das Camera-Objekt aus dem Inputstream.
|
void | save (DataOutputStream &dataOut) |
| Serialisiert das Camera-Objekt in den Outputstream.
|
void | load (void) |
| Liest das Camera-Objekt aus dem Inputstream.
|
void | save (void) |
| Liest das Camera-Objekt aus dem Inputstream.
|
Static Public Member Functions |
static Camera * | getInstance () |
| Liefert die Singleton-Instanz.
|
Public Attributes |
Vec | m_vecPos |
Vec | m_vecDir |
Vec | m_vecLook |
float | m_turn |
float | m_look |
Protected Member Functions |
| Camera () |
| Konstruktor.
|
Private Attributes |
STEP_DIR | m_moving |
STEP_DIR | m_lifting |
STEP_DIR | m_strafing |
STEP_DIR | m_rotating |
STEP_DIR | m_looking |
Vec | m_vecPosNext |
Vec | m_vecDirNext |
Vec | m_vecPosColl |
Vec | m_vecDirColl |
float | m_stepColl |
float | m_stepAnim |
float | m_step |
int | m_zoneID |
int | m_HOG |
int | m_moverCount |
float | m_moverDeltaY |
Static Private Attributes |
static Camera * | _instance = 0 |
Der Player blickt in der 3D-Raum durch eine (imaginaere) Kamera, die sich an der Spitze des Frustums befindet. Ueber Tastatur und Maus wird die Kamera im Raum bewegt.
Nach einem 'Move' wird die Transformationsmatrix der Camera bezogen zum zum Ursprung berechnet um anschliessend die Weltobjekte in das Frustum zu transformieren.
Ausserdem erfolgt vor jedem Move eiene Kollisionsabfrage mit der umliegenden Objekten:
Bei den Kollsisionsabfragen wird aus dem aktuellen Standpunkt und dem naechsten Standpunkt ein Strahl ermittelt. Schneidet dieser Strahl eine Tile, so hat eine Kollision stattgefunden. Die Kamera darf sich dann NICHT zu diesem neuen Standpunkt bewegen. Um eine rel. langsame und weiche Bewegung im Raum zu erreichen, ist die Distanz pro Step recht kurz. Daraus folgt, das die Camera sich auch sehr nah an eine WALL annaehern kann, was aber zu Render- bzw. Clippingproblemen fuehrt. Deshalb wird fuer die Collisionsabfrage eine groessere Distanz gefordert. Dazu gibt es hier die m_vecPosColl, m_vecDirColl und m_stepColl. Fuer die Kollision gegen ein PORTAL muss allerdings wieder die normale Schrittweite genommen werden, da sonst ein Portaluebergang zu frueh angezeigt wird, obwohl die Camera sich mit dem naechsten Step noch in der alten Zone befindet.
void Camera::setFrameRate |
( |
float |
fps | ) |
|
Bei einer (angenommen) konstanten Framerate von 30 fps, liegt die konstante Rotationsgeschwindigkeit bei 2 Grad pro Frame.
Weil die tatsaechliche Framerate analog zur Komplexitaet der Szene schwankt, muss die Geschwindigkeit angepasst werden:
fps const v const * --------- = v x fps
- Parameters:
-