Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/old.dave/src/track.cc @ 3300

Last change on this file since 3300 was 3279, checked in by dave, 20 years ago

branches/old.dave: Die Neigung des Raumschiffes ist jetzt nicht mehr so stark, und jetzt kann man auch 2 Tasten aufs mal drücken, ohne dass das Raumschiffsche jedes mal anhält:)

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