Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/parenting/src/camera.cc @ 3323

Last change on this file since 3323 was 3323, checked in by patrick, 19 years ago

oroxnox/branches/parenting: turned coordinate system, now using the normal opengl orientation: x: forth, y: up, z: right. tried to turn the landscape, but didnt work. will be remade later

File size: 7.2 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#include "world.h"
20#include "world_entity.h"
21
22using namespace std;
23
24/**
25   \brief creates a Camera
26   
27   This standard constructor sets all parameters to zero
28*/
29Camera::Camera (World* world)
30{
31  this->world = world;
32  this->bound = NULL;
33  /* give it some physical live */
34  this->m = 10;
35  this->a = new Vector(0.0, 0.0, 0.0);
36  this->v = new Vector(0.0, 0.0, 0.0);
37  this->fs = new Vector(0.0, 0.0, 0.0);
38  this->cameraMode = NORMAL;
39  this->deltaTime = 3000.0;
40  this->cameraOffset = 1.0;
41  this->cameraOffsetZ = 10.0;
42  this->t = 0.0;
43
44  this->actualPlace.r.x = 0.0;
45  this->actualPlace.r.y = 10.0;
46  this->actualPlace.r.z = -5.0;
47
48  this->setDrawable (false);
49}
50
51/**
52   \brief default destructor
53*/
54Camera::~Camera ()
55{
56}
57
58/**
59   \brief time based actualisation of camera parameters
60   \param deltaT: The amount of time that has passed in milliseconds
61   
62   This is called by the World in every time_slice, use it to do fancy time dependant effects (such
63   as smooth camera movement or swaying).
64*/
65void Camera::timeSlice (Uint32 deltaT)
66{
67  if( this->t <= deltaTime)
68    {this->t += deltaT;}
69  //printf("time is: t=%f\n", t );
70  updateDesiredPlace();
71  jump(NULL);
72}
73
74/**
75   \brief this calculates the location where the track wants the camera to be
76   
77   This refreshes the placement the camera should have according to the
78   bound entity's position on the track.
79*/
80void Camera::updateDesiredPlace ()
81{
82  switch(cameraMode)
83    {
84     
85    case ELLIPTICAL:
86      {
87        /*
88        //r = actual_place.r
89        Orxonox *orx = Orxonox::getInstance();
90        Location lookat; 
91        Placement plFocus;
92        if( bound != NULL)
93          {
94            bound->getLookat (&lookat);
95            orx->getWorld()->calcCameraPos (&lookat, &plFocus);
96            Quaternion *fr;
97            if(t < 20.0)
98              {
99                Vector *start = new Vector(0.0, 1.0, 0.0);
100                r = *(new Vector(0.0, 5.0, 0.0));
101
102                Vector up(0.0, 0.0, 1.0);
103               
104                Vector op(1.0, 0.0, 0.0);
105                float angle = angleDeg(op, *start);
106                printf("angle is: %f\n", angle);
107
108                //if in one plane
109                from = new Quaternion(angle, up);
110
111                //from = new Quaternion(*start, *up);
112                //&from = &plFocus.w;
113                //fr = &plFocus.w; real quaternion use
114               
115
116
117                Vector vDirection(1.0, 0.0, 0.0);
118                //vDirection = plFocus.w.apply(vDirection);
119                to = new Quaternion(vDirection, *start);
120                res = new Quaternion();
121              }
122            //printf("vector r = %f, %f, %f\n",r.x, r.y, r.z );
123            rAbs = r.len();
124            if(t < 30)
125              {
126                ka = rAbs / deltaTime*deltaTime;
127              }
128
129            res->quatSlerp(to, from, t/deltaTime, res);
130
131            Vector ursp(0.0, 0.0, 0.0);
132            desiredPlace.r =  ursp - res->apply(r);
133
134            printf("desired place is: %f, %f, %f\n", desiredPlace.r.x, desiredPlace.r.y, desiredPlace.r.z);
135            //plLastBPlace = *bound->get_placement();
136           
137          }
138      */
139      }
140      break;
141    case SMOTH_FOLLOW:
142      {
143        /*
144        Placement *plBound = bound->getPlacement();
145        Location lcBound;
146        if(bound != null)
147          {
148            bound->getLookat(&lcBound);
149            Vector vDirection(0.0, 0.0, 1.0);
150            vDirection = plBound->w.apply(vDirection);
151            desiredPlace.r = (vDirection * ((lcBound.dist-10.0))) + Vector(0,0,5.0);
152          }
153        */
154        break;
155      }
156      /* this is a camera mode that tries just to follow the entity. */
157    case STICKY:
158      {
159        /*
160        if(bound != null)
161          {
162            Placement *plBound = bound->getPlacement();
163            Vector vDirection(0.0, 0.0, 1.0);
164            Vector eclipticOffset(0.0, 0.0, 5.0);
165            vDirection = plBound->w.apply(vDirection);
166            desiredPlace.r = plBound->r - vDirection*10 + eclipticOffset;
167          }
168        */
169        break;
170      }
171      /* the camera is handled like an entity and rolls on the track */
172    case NORMAL:
173      Location lookat; 
174      if( bound != NULL && world != NULL )
175        {
176          //bound->getLookat (&lookat);
177          //bound->getAbsCoor ()
178          //world->calcCameraPos (&lookat, &desiredPlace);
179          //FIXME: camera should be made via relative coordinates
180          Vector* cameraOffset = new Vector (-10, 5, 0);
181          this->setRelCoor (cameraOffset);
182        } 
183      else
184        {
185          /*
186          desiredPlace.r = Vector (0,0,0);
187          desiredPlace.w = Quaternion ();
188          */
189        }
190      break;
191    }
192}
193
194/**
195   \brief initialize rendering perspective according to this camera
196   
197   This is called immediately before the rendering cycle starts, it sets all global
198   rendering options as well as the GL_PROJECTION matrix according to the camera.
199*/
200void Camera::apply ()
201{
202  glMatrixMode (GL_PROJECTION);
203  glLoadIdentity ();
204  // view
205  // TO DO: implement options for frustum generation
206  //glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 250.0);
207  gluPerspective(60, 1.2f, 0.1, 250);
208 
209  //Vector up(0,0,1);
210  //Vector dir(1,0,0);
211  //Quaternion q(dir,up);
212  //float matrix[4][4];
213  //q.conjugate().matrix (matrix);
214  //glMultMatrixf ((float*)matrix);
215  //glTranslatef (10,0,-5);
216  //
217  //dir = Vector(-1,-1,0);
218  //q = Quaternion( dir, up);
219  //glMatrixMode (GL_MODELVIEW);
220  //glLoadIdentity ();
221  //q.matrix (matrix);
222  //glMultMatrixf ((float*)matrix);
223  //glTranslatef (2,2,0);
224  //
225  //glBegin(GL_TRIANGLES);
226  //glColor3f(1,0,0);
227  //glVertex3f(0,0,0.5);
228  //glColor3f(0,1,0);
229  //glVertex3f(-0.5,0,-1);
230  //glColor3f(0,0,1);
231  //glVertex3f(0.5,0,-1);
232  //glEnd();   
233
234  // ===== first camera control calculation option
235  // rotation
236  float matrix[4][4];
237  //this->absDirection.conjugate().matrix (matrix);
238  /* orientation and */
239  //glMultMatrixf ((float*)matrix);
240
241  /*  translation */
242  //glTranslatef (this->absCoordinate.x, this->absCoordinate.y, this->absCoordinate.z );
243
244
245  // ===== second camera control calculation option
246 
247  gluLookAt(this->absCoordinate.x, this->absCoordinate.y, this->absCoordinate.z, 
248            this->parent->getAbsCoor ().x, this->parent->getAbsCoor ().y, this->parent->getAbsCoor ().z,
249            0.0, 1.0, 0.0);
250 
251
252  glMatrixMode (GL_MODELVIEW);
253  glLoadIdentity ();
254}
255
256/**
257  \brief set the camera position
258  \param plc: The Placement to set the camera to
259       
260        This will set the actual and desired placement of the camera to plc
261*/
262void Camera::jump (Placement* plc = NULL)
263{
264  if( plc == NULL)
265    {
266      actualPlace = desiredPlace;
267      //printf("Camera|jump: camer@ %f, %f, %f\n\n", actual_place.r.x, actual_place.r.y, actual_place.r.z);
268    }
269  else
270    {
271      desiredPlace = *plc;
272      actualPlace = *plc;
273    }
274}
275
276/**
277  \brief bind the camera to an entity
278  \param entity: The enitity to bind the camera to
279       
280  This sets the focus of the camera to the given entity. This means that it will use the given WorldEntity's
281  Location and get_lookat() to determine the viewpoint the camera will render from.
282  Note that you cannot bind a camera to a free entity.
283*/
284void Camera::bind (WorldEntity* entity)
285{
286  if( entity != NULL)
287    {
288      if( entity->isFree()) printf("Cannot bind camera to free entity");
289      else 
290        {
291          this->bound = entity;
292        }
293    } 
294}
295
296
297void Camera::setWorld(World* world)
298{
299  this->world = world;
300}
301
302
303/**
304   \brief destroy, reset the camera so that it doesn't perform anything anymore
305
306*/
307void Camera::destroy()
308{
309  this->bound = NULL;
310  this->world = NULL;
311}
Note: See TracBrowser for help on using the repository browser.