Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 3547 was 3544, checked in by bensch, 20 years ago

orxonox/trunk: now the delete-process is as inteded by c++
virtual ~ClassName extends deletion and deletes also the MasterClass

File size: 6.4 KB
RevLine 
[2068]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:
[2080]14   main-programmer: Christian Meyer
[2068]15   co-programmer: ...
16*/
17
18#include "camera.h"
[2100]19#include "world.h"
20#include "world_entity.h"
[2068]21
22using namespace std;
23
[2096]24/**
25   \brief creates a Camera
26   
27   This standard constructor sets all parameters to zero
28*/
[2636]29Camera::Camera (World* world)
[2068]30{
[2636]31  this->world = world;
[3215]32  this->bound = NULL;
[2551]33  /* give it some physical live */
[3215]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;
[2551]43
[3365]44
45  this->setDrawable (false);
[2068]46}
47
[2096]48/**
49   \brief default destructor
50*/
[2068]51Camera::~Camera ()
52{
[3543]53  this->bound = NULL;
54  this->world = NULL;
55
56}
57
58/**
[2096]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*/
[3225]65void Camera::timeSlice (Uint32 deltaT)
[2068]66{
[3215]67  if( this->t <= deltaTime)
68    {this->t += deltaT;}
[2551]69  //printf("time is: t=%f\n", t );
[3236]70  updateDesiredPlace();
[3365]71  //jump(NULL);
[2068]72}
73
[2096]74/**
[2551]75   \brief this calculates the location where the track wants the camera to be
[2096]76   
[2551]77   This refreshes the placement the camera should have according to the
78   bound entity's position on the track.
[2096]79*/
[3228]80void Camera::updateDesiredPlace ()
[2068]81{
[2551]82  switch(cameraMode)
83    {
84     
85    case ELLIPTICAL:
86      {
[3365]87        /*
[2551]88        //r = actual_place.r
89        Orxonox *orx = Orxonox::getInstance();
90        Location lookat; 
91        Placement plFocus;
92        if( bound != NULL)
93          {
[3236]94            bound->getLookat (&lookat);
[3228]95            orx->getWorld()->calcCameraPos (&lookat, &plFocus);
[2551]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);
[2068]103               
[2551]104                Vector op(1.0, 0.0, 0.0);
[3228]105                float angle = angleDeg(op, *start);
[2551]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();
[3365]124            if(t < 30)
[2551]125              {
126                ka = rAbs / deltaTime*deltaTime;
127              }
[3365]128
[2551]129            res->quatSlerp(to, from, t/deltaTime, res);
130
131            Vector ursp(0.0, 0.0, 0.0);
[3365]132            desiredPlace.r =  ursp - res->apply(r);
[2551]133
[3228]134            printf("desired place is: %f, %f, %f\n", desiredPlace.r.x, desiredPlace.r.y, desiredPlace.r.z);
[2551]135            //plLastBPlace = *bound->get_placement();
[3365]136           
[2551]137          }
[3365]138      */
[2551]139      }
140      break;
141    case SMOTH_FOLLOW:
142      {
[3365]143        /*
[3228]144        Placement *plBound = bound->getPlacement();
[2551]145        Location lcBound;
146        if(bound != null)
147          {
[3228]148            bound->getLookat(&lcBound);
[2551]149            Vector vDirection(0.0, 0.0, 1.0);
150            vDirection = plBound->w.apply(vDirection);
[3365]151            desiredPlace.r = (vDirection * ((lcBound.dist-10.0))) + Vector(0,0,5.0);
[2551]152          }
[3365]153        */
[2551]154        break;
155      }
156      /* this is a camera mode that tries just to follow the entity. */
157    case STICKY:
158      {
[3365]159        /*
[2551]160        if(bound != null)
161          {
[3236]162            Placement *plBound = bound->getPlacement();
[2551]163            Vector vDirection(0.0, 0.0, 1.0);
164            Vector eclipticOffset(0.0, 0.0, 5.0);
165            vDirection = plBound->w.apply(vDirection);
[3228]166            desiredPlace.r = plBound->r - vDirection*10 + eclipticOffset;
[2551]167          }
[3365]168        */
[2551]169        break;
170      }
171      /* the camera is handled like an entity and rolls on the track */
172    case NORMAL:
[2636]173      if( bound != NULL && world != NULL )
[2551]174        {
[3365]175          //FIXME: camera should be made via relative coordinates
[3537]176
[2551]177        } 
178      else
179        {
[3365]180          /*
[3228]181          desiredPlace.r = Vector (0,0,0);
182          desiredPlace.w = Quaternion ();
[3365]183          */
[2551]184        }
185      break;
186    }
[2068]187}
188
[2096]189/**
[2551]190   \brief initialize rendering perspective according to this camera
[2096]191   
[2551]192   This is called immediately before the rendering cycle starts, it sets all global
193   rendering options as well as the GL_PROJECTION matrix according to the camera.
[2096]194*/
[2068]195void Camera::apply ()
196{
[2551]197  glMatrixMode (GL_PROJECTION);
[2112]198  glLoadIdentity ();
[2551]199  // view
200  // TO DO: implement options for frustum generation
[3175]201  //glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 250.0);
202  gluPerspective(60, 1.2f, 0.1, 250);
203 
[2551]204  //Vector up(0,0,1);
205  //Vector dir(1,0,0);
206  //Quaternion q(dir,up);
207  //float matrix[4][4];
208  //q.conjugate().matrix (matrix);
209  //glMultMatrixf ((float*)matrix);
210  //glTranslatef (10,0,-5);
211  //
212  //dir = Vector(-1,-1,0);
213  //q = Quaternion( dir, up);
214  //glMatrixMode (GL_MODELVIEW);
215  //glLoadIdentity ();
216  //q.matrix (matrix);
217  //glMultMatrixf ((float*)matrix);
218  //glTranslatef (2,2,0);
219  //
220  //glBegin(GL_TRIANGLES);
221  //glColor3f(1,0,0);
222  //glVertex3f(0,0,0.5);
223  //glColor3f(0,1,0);
224  //glVertex3f(-0.5,0,-1);
225  //glColor3f(0,0,1);
226  //glVertex3f(0.5,0,-1);
227  //glEnd();   
[2115]228
[2551]229  // ===== first camera control calculation option
230  // rotation
[2112]231  float matrix[4][4];
[3365]232  //this->absDirection.conjugate().matrix (matrix);
[2551]233  /* orientation and */
[3365]234  //glMultMatrixf ((float*)matrix);
235
[2551]236  /*  translation */
[3365]237  //glTranslatef (this->absCoordinate.x, this->absCoordinate.y, this->absCoordinate.z );
[2551]238
[3365]239
[2551]240  // ===== second camera control calculation option
[3365]241 
242  gluLookAt(this->absCoordinate.x, this->absCoordinate.y, this->absCoordinate.z, 
243            this->parent->getAbsCoor ().x, this->parent->getAbsCoor ().y, this->parent->getAbsCoor ().z,
244            0.0, 1.0, 0.0);
245 
[2551]246
[2068]247  glMatrixMode (GL_MODELVIEW);
[2080]248  glLoadIdentity ();
[2068]249}
250
251
[3365]252
[2096]253/**
254  \brief bind the camera to an entity
255  \param entity: The enitity to bind the camera to
256       
[3213]257  This sets the focus of the camera to the given entity. This means that it will use the given WorldEntity's
258  Location and get_lookat() to determine the viewpoint the camera will render from.
259  Note that you cannot bind a camera to a free entity.
[2096]260*/
[2068]261void Camera::bind (WorldEntity* entity)
262{
[2551]263  if( entity != NULL)
264    {
[3213]265      if( entity->isFree()) printf("Cannot bind camera to free entity");
[2551]266      else 
[2080]267        {
[3213]268          this->bound = entity;
[2551]269        }
270    } 
[2068]271}
[2636]272
273
274void Camera::setWorld(World* world)
275{
276  this->world = world;
277}
[3213]278
279
Note: See TracBrowser for help on using the repository browser.