gKit2 light
orbiter.cpp
1 
2 #include <cstdio>
3 #include <algorithm>
4 
5 #include "orbiter.h"
6 
7 void Orbiter::lookat( const Point& center, const float size )
8 {
9  m_center= center;
10  m_position= vec2(0, 0);
11  m_rotation= vec2(0, 180);
12  m_size= size;
13  m_radius= size;
14 }
15 
16 void Orbiter::lookat( const Point& pmin, const Point& pmax )
17 {
18  lookat(center(pmin, pmax), distance(pmin, pmax));
19 }
20 
21 void Orbiter::rotation( const float x, const float y )
22 {
23  m_rotation.x= m_rotation.x + y;
24  m_rotation.y= m_rotation.y + x;
25 }
26 
27 void Orbiter::translation( const float x, const float y )
28 {
29  m_position.x= m_position.x - m_size * x;
30  m_position.y= m_position.y + m_size * y;
31 }
32 
33 void Orbiter::move( const float z )
34 {
35  m_size= m_size - m_size * 0.01f * z;
36  if(m_size < 0.001f)
37  m_size= 0.001f;
38 }
39 
41 {
42  return Translation( -m_position.x, -m_position.y, -m_size )
43  * RotationX(m_rotation.x) * RotationY(m_rotation.y)
44  * Translation( -m_center.x, -m_center.y, -m_center.z );
45 }
46 
47 Transform Orbiter::projection( const int width, const int height, const float fov )
48 {
49  m_width= width;
50  m_height= height;
51  m_fov= fov;
52 
53  return projection();
54 }
55 
56 float Orbiter::znear( ) const
57 {
58  // calcule la distance entre le centre de l'objet et la camera
59  float d= distance(m_center, Point(m_position.x, m_position.y, m_size));
60  return std::max(float(0.1), d - m_radius);
61 }
62 
63 float Orbiter::zfar( ) const
64 {
65  // calcule la distance entre le centre de l'objet et la camera
66  float d= distance(m_center, Point(m_position.x, m_position.y, m_size));
67  return std::max(float(1), d + m_radius);
68 }
69 
70 
72 {
73  // calcule la distance entre le centre de l'objet et la camera
74  //~ Transform t= view();
75  //~ Point c= t(m_center);
76  //~ float d= -c.z;
77  //~ float d= distance(m_center, Point(m_position.x, m_position.y, m_size)); // meme resultat plus rapide a calculer
78 
79  // regle near et far en fonction du centre et du rayon englobant l'objet
80  return Perspective(m_fov, m_width / m_height, znear(), zfar());
81 }
82 
84 {
85  return Viewport(m_width, m_height);
86 }
87 
88 //~ void Orbiter::frame( const float width, const float height, const float z, const float fov, Point& dO, Vector& dx, Vector& dy ) const
89 void Orbiter::frame( const float z, Point& dO, Vector& dx, Vector& dy ) const
90 {
91  Transform v= view();
92  Transform p= projection();
93  Transform viewport= Viewport(m_width, m_height);
94  Transform t= viewport * p * v; // passage monde vers image
95  Transform tinv= t.inverse(); // l'inverse, passage image vers monde
96 
97  // origine du plan image
98  dO= tinv(Point(0, 0, z));
99  // axe x du plan image
100  Point d1= tinv(Point(1, 0, z));
101  // axe y du plan image
102  Point d2= tinv(Point(0, 1, z));
103 
104  dx= Vector(dO, d1);
105  dy= Vector(dO, d2);
106 }
107 
109 {
110  Transform t= view(); // passage monde vers camera
111  Transform tinv= t.inverse(); // l'inverse, passage camera vers monde
112 
113  return tinv(Point(0, 0, 0)); // la camera se trouve a l'origine, dans le repere camera...
114 }
115 
116 int Orbiter::read_orbiter( const char *filename )
117 {
118  FILE *in= fopen(filename, "rt");
119  if(in == NULL)
120  {
121  printf("[error] loading orbiter '%s'...\n", filename);
122  return -1;
123  }
124 
125  printf("loading orbiter '%s'...\n", filename);
126 
127  bool errors= false;
128  if(fscanf(in, "c %f %f %f \n", &m_center.x, &m_center.y, &m_center.z) != 3)
129  errors= true;
130  if(fscanf(in, "p %f %f\n", &m_position.x, &m_position.y) != 2)
131  errors= true;
132  if(fscanf(in, "r %f %f\n", &m_rotation.x, &m_rotation.y) != 2)
133  errors= true;
134  if(fscanf(in, "s %f %f\n", &m_size, &m_radius) != 2)
135  errors= true;
136 
137  if(fscanf(in, "f %f %f %f\n", &m_fov, &m_width, &m_height) != 3)
138  errors= true;
139 
140  fclose(in);
141  if(errors)
142  {
143  printf("[error] loading orbiter '%s'...\n", filename);
144  return -1;
145  }
146 
147  return 0;
148 }
149 
150 int Orbiter::write_orbiter( const char *filename )
151 {
152  FILE *out= fopen(filename, "wt");
153  if(out == NULL)
154  return -1;
155 
156  printf("writing orbiter '%s'...\n", filename);
157 
158  fprintf(out, "c %f %f %f\n", m_center.x, m_center.y, m_center.z);
159  fprintf(out, "p %f %f\n", m_position.x, m_position.y);
160  fprintf(out, "r %f %f\n", m_rotation.x, m_rotation.y);
161  fprintf(out, "s %f %f\n", m_size, m_radius);
162  fprintf(out, "f %f %f %f\n", m_fov, m_width, m_height);
163 
164  fclose(out);
165  return 0;
166 }
void lookat(const Point &center, const float size)
observe le point center a une distance size.
Definition: orbiter.cpp:7
void frame(const float z, Point &dO, Vector &dx, Vector &dy) const
Definition: orbiter.cpp:89
int read_orbiter(const char *filename)
relit la position de l'orbiter depuis un fichier texte.
Definition: orbiter.cpp:116
Transform viewport() const
renvoie la transformation viewport actuelle. doit etre initialise par projection(width,...
Definition: orbiter.cpp:83
void move(const float z)
rapproche / eloigne la camera du centre.
Definition: orbiter.cpp:33
float znear() const
renvoie le plan proche de la projection. distance min des points dans le frustum de la camera (valeur...
Definition: orbiter.cpp:56
void translation(const float x, const float y)
deplace le centre / le point observe.
Definition: orbiter.cpp:27
float zfar() const
revnvoie le plan loin de la projection. distance max des points dans le frustum de la camera (valeur ...
Definition: orbiter.cpp:63
void rotation(const float x, const float y)
change le point de vue / la direction d'observation.
Definition: orbiter.cpp:21
Transform projection() const
renvoie la transformation projection actuelle. doit etre initialise par projection(width,...
Definition: orbiter.cpp:71
Point position()
renvoie la position de la camera dans le repere du monde.
Definition: orbiter.cpp:108
int write_orbiter(const char *filename)
enregistre la position de l'orbiter dans un fichier texte.
Definition: orbiter.cpp:150
Transform view() const
renvoie la transformation vue.
Definition: orbiter.cpp:40
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition: text.cpp:140
Point center(const Point &a, const Point &b)
renvoie le milieu du segment ab.
Definition: vec.cpp:24
Point max(const Point &a, const Point &b)
renvoie la plus grande composante de chaque point. x, y, z= max(a.x, b.x), max(a.y,...
Definition: vec.cpp:35
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
Definition: mat.cpp:357
Transform RotationX(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe X.
Definition: mat.cpp:230
float distance(const Point &a, const Point &b)
renvoie la distance etre 2 points.
Definition: vec.cpp:14
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition: mat.cpp:242
Transform Perspective(const float fov, const float aspect, const float znear, const float zfar)
renvoie la matrice representant une transformation projection perspective.
Definition: mat.cpp:329
Transform Translation(const Vector &v)
renvoie la matrice representant une translation par un vecteur.
Definition: mat.cpp:216
representation d'un point 3d.
Definition: vec.h:21
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition: mat.h:21
Transform inverse() const
renvoie l'inverse de la matrice.
Definition: mat.cpp:399
representation d'un vecteur 3d.
Definition: vec.h:59
vecteur generique, utilitaire.
Definition: vec.h:131