Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/levelloader/src/camera.cc @ 3943

Last change on this file since 3943 was 3746, checked in by chris, 20 years ago

orxonox/branches/levelloader: Merged trunk into branch… still not working though…

File size: 4.0 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"
[3746]19
[2100]20#include "world.h"
21#include "world_entity.h"
[3746]22#include "vector.h"
[2068]23
24using namespace std;
25
[3746]26////////////
27// CAMERA //
28////////////
29
[2096]30/**
31   \brief creates a Camera
32*/
[3746]33Camera::Camera(void)
[2068]34{
[3746]35  this->setClassName("Camera");
36  this->target = new CameraTarget();
[2551]37
[3746]38  this->setFovy(90);
39  this->setAspectRatio(1.2f);
40  this->setClipRegion(.1, 2000);
[3365]41
[3746]42  this->setViewMode(VIEW_NORMAL);
[2068]43}
44
[2096]45/**
46   \brief default destructor
47*/
[3746]48Camera::~Camera(void)
[2068]49{
50}
51
[2096]52/**
[3746]53   \brief focuses the Camera onto a Target
54   \param target the new PNode the Camera should look at.
[2096]55*/
[3746]56void Camera::lookAt(PNode* target)
[2068]57{
[3746]58  this->target->setParent(target);
[2068]59}
60
[2096]61/**
[3746]62   \returns The PNode of the Target (from there you can get position and so on
[2096]63*/
[3746]64PNode* Camera::getTarget(void)
[2068]65{
[3746]66  return (PNode*)this->target;
67}
[2551]68
69
[3746]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}
[2551]78
[3746]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}
[2551]87
[3746]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}
[2551]98
[3746]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);
[2551]107      break;
[3746]108    case VIEW_BEHIND:
109      this->toFovy = 120.0;
110      this->toRelCoor = Vector(-7, 0, 0);
[2551]111      break;
[3746]112    case VIEW_FRONT:
113      this->toFovy = 95.0;
114      this->toRelCoor = Vector(12, 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    case VIEW_TOP:
125      this->toFovy= 120;
126      this->toRelCoor = Vector(0, 4, 0);
[2551]127    }
[2068]128}
129
[3746]130
[2096]131/**
[3746]132   \brief Updates the position of the camera.
133   \param dt The time that elapsed.
134*/
135void Camera::tick(float dt)
136{
137  dt /= 500;
138  float tmpFovy = (this->toFovy - this->fovy) * dt;
139  if (tmpFovy > .001)
140    this->fovy += (this->toFovy - this->fovy) * dt;
141  Vector tmpPos = (this->toRelCoor - *this->getRelCoor()) * dt;
142  if (tmpPos.len() >= .001)
143    {
144      tmpPos = tmpPos + *this->getRelCoor();
145      this->setRelCoor(&tmpPos);
146    }
147}
148
149
150/**
[2551]151   \brief initialize rendering perspective according to this camera
[2096]152   
[2551]153   This is called immediately before the rendering cycle starts, it sets all global
154   rendering options as well as the GL_PROJECTION matrix according to the camera.
[2096]155*/
[2068]156void Camera::apply ()
157{
[3746]158  // switching to Projection Matrix
[2551]159  glMatrixMode (GL_PROJECTION);
[2112]160  glLoadIdentity ();
[2115]161
[3746]162  // setting up the perspective
163  gluPerspective(this->fovy,
164                 this->aspectRatio,
165                 this->nearClip,
166                 this->farClip);
[3365]167
[3746]168  // speed-up feature
169  Vector cameraPosition = this->getAbsCoor();
170  Vector targetPosition = this->target->getAbsCoor();
171  Vector up = Vector(0, 1, 0);
172  up = this->getAbsDir().apply(up);
[2551]173
[3746]174  // Setting the Camera Eye, lookAt and up Vectors
175  gluLookAt(cameraPosition.x, cameraPosition.y, cameraPosition.z,
176            targetPosition.x, targetPosition.y, targetPosition.z,
177            up.x, up.y, up.z);
[3365]178
[3746]179  // switching back to Modeling Matrix
[2068]180  glMatrixMode (GL_MODELVIEW);
181}
182
183
[3365]184
[3746]185///////////////////
186// CAMERA-TARGET //
187///////////////////
[2636]188
189
[3746]190CameraTarget::CameraTarget()
[2636]191{
[3746]192  this->setClassName("CameraTarget");
193  this->setMode(PNODE_MOVEMENT);
[2636]194}
[3213]195
[3746]196CameraTarget::~CameraTarget()
197{
[3213]198
[3746]199}
Note: See TracBrowser for help on using the repository browser.