Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/parenting/src/track.cc @ 3340

Last change on this file since 3340 was 3302, checked in by patrick, 20 years ago

orxonox/branches/parenting: implemented parenting and added to framework. sill got some problems with how to pass events through the new entity list (now part of the parenting-framework). changed to a more accurate way of coordinat-ing, the openGL coord-orientation. therefore the world is realy strange because it flies into the wrong direction.

File size: 4.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
[3005]15   co-programmer: ...
[2068]16*/
17
18#include "track.h"
19
20using namespace std;
21
[2141]22/**
[3232]23   \brief creates a null Track part
[2141]24*/
[2101]25Track::Track ()
26{
[3232]27  this->ID = 0;
28  this->offset = NULL;
29  this->end = NULL;
30  this->nextID = 0;
[3302]31  this->setClassName ("Track");
[2101]32}
33
[2141]34/**
[3232]35   \brief creates a functional base Track part
36   \param number: the ID if this Track part
37   \param next: the ID of the next Track part
38   \param start: pointer to an anchor point (Vector) representing the offset of this part
39   \param finish: pointer to an anchor point (Vector) representing the end of this part
[2141]40*/
[2080]41Track::Track (Uint32 number, Uint32 next, Vector* start, Vector* finish)
[2068]42{
[3232]43  this->ID = number;
44  this->offset = start;
45  this->end = finish;
46  this->nextID = next;
[3302]47  this->setClassName ("Track");
[2068]48}
49
[2141]50/**
[3232]51   \brief removes the Track part from memory
[2141]52*/
[2068]53Track::~Track ()
54{
55}
56
[2636]57void Track::init()
58{
59 
60}
61
62
[2141]63/**
[2551]64   \brief calculate a camera Placement from a "look at"-Location
65   \param lookat: the Location the camera should be centered on
66   \param camplc: pointer to a buffer where the new camera Placement should be put into
67   
68   Theoretically you can place the camera wherever you want, but for the sake of
69   common sense I suggest that you at least try to keep the thing that should be looked
70   at inside camera boundaries.
[2141]71*/
[3232]72void Track::mapCamera (Location* lookat, Placement* camplc)
[2068]73{
[2551]74  Line trace(*offset, *end - *offset);
75  float l = trace.len ();
76 
77  //    camplc->r = *offset + Vector(0,0,0.5);
78  //    camplc->w = Quaternion (trace.a, Vector(0,0,1));
[3005]79  float r = (lookat->dist)*PI / l;
[2551]80  camplc->r = trace.r + (trace.a * ((lookat->dist-10.0) / l)) + Vector(0,0,5.0);
81 
82  Vector w(0.0,0.0,0.0);
83  w=Vector(0,0,0) - ((trace.r + (trace.a * ((lookat->dist) / l)) - camplc->r));
84  //Vector up(0.0,sin(r),cos(r)); // corrupt...
85  Vector up(0.0, 0.0, 1.0);
86
87  camplc->w = Quaternion(w, up);
88
89  //printf("\n------\nup vector: [%f, %f, %f]\n", up.x, up.y, up.z);
90  //printf("direction: [%f, %f, %f]\n", w.x, w.y, w.z);
91  //printf("quaternion: w[ %f ], v[ %f, %f, %f ]\n", camplc->w.w, camplc->w.v.x, camplc->w.v.y, camplc->w.v.z);
[2068]92}
93
[2141]94/**
[2551]95   \brief calculate a Placement from a given Location
96   \param loc: the Location the entity is in
97   \param plc: a pointer to a buffer where the corresponding Placement should be put
98   into
99   \return: true if track changes - false if track stays
100   
101   There are no limitations to how you transform a Location into a Placement, but for
102   the sake of placement compatibility between track parts you should make sure that
103   the resulting Placement at dist == 0 is equal to the offset Vector and the Placement
104   at dist == len() is equal to the end Vector. Elseway there will be ugly artifacts
105   when transfering between track parts.
[2141]106*/
[3232]107bool Track::mapCoords (Location* loc, Placement* plc)
[2068]108{
[3232]109  Line trace(*offset, *end - *offset);
110  float l = trace.len ();
111 
112  /* change to the next track? */
113  if( loc->dist > l)
114    {
115      loc->dist -= l;
116      loc->part = nextID;
117      //FIXME: loc->track = this;
118      return true;
119    }
120 
121  /* this quaternion represents the rotation from start-vector (0,0,1) to the direction of
122   * the track */
123  Quaternion dir(trace.a, Vector(0,0,1)); 
124 
125  plc->r = trace.r + (trace.a * ((loc->dist) / l)) + /*dir.apply*/(loc->pos);
126  plc->w = dir * loc->rot;
127 
128  return false;
[2068]129}
130
[3232]131
[2141]132/**
[3232]133   \brief this is called when a WorldEntity enters a Track part
134   \param entity: pointer to the WorldEntity in question
135   
136   You can do stuff like add or remove effects, do some coordinate finetuning
137   or whatever in here.
[2141]138*/
[3232]139void Track::postEnter (WorldEntity* entity)
[2080]140{
141}
[2068]142
[3232]143
[2141]144/**
[3232]145   \brief this is called when a WorldEntity leaves a Track part
146   \param entity: pointer to the WorldEntity in question
147   
148   You can do stuff like add or remove effects, do some coordinate finetuning
149   or whatever in here.
[2141]150*/
[3232]151void Track::postLeave (WorldEntity* entity)
[2080]152{
153}
[2068]154
[3232]155
[2141]156/**
[3232]157   \brief this is called every frame
158   \param deltaT: amount of time passed since the last frame in seconds
159   
160   Do time based or polling scripts here.
[2141]161*/
[2080]162void Track::tick (float deltaT)
163{
164}
[2068]165
166
[2080]167
168
169
Note: See TracBrowser for help on using the repository browser.