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