Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/camera.cc @ 3642

Last change on this file since 3642 was 3642, checked in by bensch, 19 years ago

orxonox/trunk: no more comments

File size: 3.8 KB
Line 
1
2
3/*
4   orxonox - the future of 3D-vertical-scrollers
5
6   Copyright (C) 2004 orx
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2, or (at your option)
11   any later version.
12
13   ### File Specific:
14   main-programmer: Christian Meyer
15   co-programmer: ...
16*/
17
18#include "camera.h"
19
20#include "world.h"
21#include "world_entity.h"
22#include "vector.h"
23
24using namespace std;
25
26////////////
27// CAMERA //
28////////////
29
30/**
31   \brief creates a Camera
32*/
33Camera::Camera(void)
34{
35  this->setClassName("Camera");
36  this->target = new CameraTarget();
37
38  this->setFovy(90);
39  this->setAspectRatio(1.2f);
40  this->setClipRegion(.1, 2000);
41
42  this->setViewMode(VIEW_NORMAL);
43}
44
45/**
46   \brief default destructor
47*/
48Camera::~Camera(void)
49{
50}
51
52/**
53   \brief focuses the Camera onto a Target
54   \param target the new PNode the Camera should look at.
55*/
56void Camera::lookAt(PNode* target)
57{
58  this->target->setParent(target);
59}
60
61/**
62   \returns The PNode of the Target (from there you can get position and so on
63*/
64PNode* Camera::getTarget(void)
65{
66  return (PNode*)this->target;
67}
68
69
70/**
71   \brief sets a new AspectRatio
72   \param aspectRatio the new aspect ratio to set (width / height)
73*/
74void Camera::setAspectRatio(float aspectRatio)
75{
76  this->aspectRatio = aspectRatio;
77}
78
79/**
80   \brief sets the Field of View to fofy
81   \param fovy new field of view factor (in degrees)
82*/
83void Camera::setFovy(float fovy)
84{
85  this->fovy = fovy;
86}
87
88/**
89  \brief Sets a new clipping region
90  \param nearClip The near clip plane
91  \param farClip The far clip plane
92*/
93void Camera::setClipRegion(float nearClip, float farClip)
94{
95  this->nearClip = nearClip;
96  this->farClip = farClip;
97}
98
99void Camera::setViewMode(ViewMode mode)
100{
101  switch (mode)
102    {
103    default:
104    case VIEW_NORMAL:
105      this->toFovy = 60.0;
106      this->toRelCoor = Vector (-10, 5, 0);
107      break;
108    case VIEW_BEHIND:
109      this->toFovy = 90.0;
110      this->toRelCoor = Vector (-6, 2, 0);
111      break;
112    case VIEW_FRONT:
113      this->toFovy = 95.0;
114      this->toRelCoor = Vector (10, 5, 0);
115      break;
116    case VIEW_LEFT: 
117      this->toFovy = 90;
118      this->toRelCoor = Vector (0, 2, -10);
119      break;
120    case VIEW_RIGHT:
121      this->toFovy = 90;
122      this->toRelCoor = Vector (0, 2, 10);
123      break;
124    }
125}
126
127
128/**
129   \brief Updates the position of the camera.
130   \param dt The time that elapsed.
131*/
132void Camera::tick(float dt)
133{
134  dt /= 1000;
135  this->fovy += (this->toFovy - this->fovy) * dt;
136  Vector tmp = this->getRelCoor() + (this->toRelCoor - this->getRelCoor()) * dt;
137  this->setRelCoor(&tmp);
138}
139
140
141/**
142   \brief initialize rendering perspective according to this camera
143   
144   This is called immediately before the rendering cycle starts, it sets all global
145   rendering options as well as the GL_PROJECTION matrix according to the camera.
146*/
147void Camera::apply ()
148{
149  // switching to Projection Matrix
150  glMatrixMode (GL_PROJECTION);
151  glLoadIdentity ();
152
153  // setting up the perspective
154  gluPerspective(this->fovy,
155                 this->aspectRatio,
156                 this->nearClip,
157                 this->farClip);
158
159  // speed-up feature
160  Vector cameraPosition = this->getAbsCoor();
161  Vector targetPosition = this->target->getAbsCoor();
162  Vector up = Vector(0, 1, 0);
163  up = this->getAbsDir().apply(up);
164
165  // Setting the Camera Eye, lookAt and up Vectors
166  gluLookAt(cameraPosition.x, cameraPosition.y, cameraPosition.z,
167            targetPosition.x, targetPosition.y, targetPosition.z,
168            up.x, up.y, up.z);
169
170  // switching back to Modeling Matrix
171  glMatrixMode (GL_MODELVIEW);
172}
173
174
175
176///////////////////
177// CAMERA-TARGET //
178///////////////////
179
180
181CameraTarget::CameraTarget()
182{
183  this->setClassName("CameraTarget");
184  this->setMode(PNODE_MOVEMENT);
185}
186
187CameraTarget::~CameraTarget()
188{
189
190}
Note: See TracBrowser for help on using the repository browser.