gKit2 light
Loading...
Searching...
No Matches

representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet. More...

#include <orbiter.h>

Public Member Functions

 Orbiter ()
 cree une camera par defaut. observe le centre (0, 0, 0) a une distance 5.
void lookat (const Point &center, const float size)
 observe le point center a une distance size.
void lookat (const Point &pmin, const Point &pmax)
 observe le centre d'une boite englobante.
Transform projection (const int width, const int height, const float fov)
 fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres.
float znear () const
 renvoie le plan proche de la projection. distance min des points dans le frustum de la camera (valeur dans le repere camera).
float zfar () const
 revnvoie le plan loin de la projection. distance max des points dans le frustum de la camera (valeur dans le repere camera).
void rotation (const float x, const float y)
 change le point de vue / la direction d'observation.
void translation (const float x, const float y)
 deplace le centre / le point observe.
void move (const float z)
 rapproche / eloigne la camera du centre.
Transform view () const
 renvoie la transformation vue.
Transform projection () const
 renvoie la transformation projection actuelle. doit etre initialise par projection(width, height, fov).
Transform viewport () const
 renvoie la transformation viewport actuelle. doit etre initialise par projection(width, height, fov).
void frame (const float z, Point &dO, Vector &dx, Vector &dy) const
Point position ()
 renvoie la position de la camera dans le repere du monde.
vec3 translation ()
 renvoie la translation de l'orbiter
vec2 rotation ()
 renvoie les angles de rotation de l'orbiter
int read_orbiter (const char *filename)
 relit la position de l'orbiter depuis un fichier texte.
int write_orbiter (const char *filename)
 enregistre la position de l'orbiter dans un fichier texte.
float radius () const
 renvoie le rayon de la scene.

Protected Attributes

Point m_center
vec2 m_position
vec2 m_rotation
float m_size
float m_radius
float m_width
float m_height
float m_fov

Detailed Description

representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet.

Definition at line 16 of file orbiter.h.

Constructor & Destructor Documentation

◆ Orbiter()

Orbiter::Orbiter ( )
inline

cree une camera par defaut. observe le centre (0, 0, 0) a une distance 5.

Definition at line 20 of file orbiter.h.

20: m_center(), m_position(), m_rotation(), m_size(5), m_radius(5), m_width(1), m_height(1), m_fov(45) {}

Member Function Documentation

◆ lookat() [1/2]

void Orbiter::lookat ( const Point & center,
const float size )

observe le point center a une distance size.

Definition at line 7 of file orbiter.cpp.

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}
Point center(const Point &a, const Point &b)
renvoie le milieu du segment ab.
Definition vec.cpp:24

◆ lookat() [2/2]

void Orbiter::lookat ( const Point & pmin,
const Point & pmax )

observe le centre d'une boite englobante.

Definition at line 17 of file orbiter.cpp.

18{
19 lookat(center(pmin, pmax), distance(pmin, pmax));
20}
void lookat(const Point &center, const float size)
observe le point center a une distance size.
Definition orbiter.cpp:7
float distance(const Point &a, const Point &b)
renvoie la distance etre 2 points.
Definition vec.cpp:14

◆ projection() [1/2]

Transform Orbiter::projection ( const int width,
const int height,
const float fov )

fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres.

Definition at line 48 of file orbiter.cpp.

49{
50 m_width= width;
51 m_height= height;
52 m_fov= fov;
53
54 return projection();
55}
Transform projection() const
renvoie la transformation projection actuelle. doit etre initialise par projection(width,...
Definition orbiter.cpp:72

◆ znear()

float Orbiter::znear ( ) const

renvoie le plan proche de la projection. distance min des points dans le frustum de la camera (valeur dans le repere camera).

Definition at line 57 of file orbiter.cpp.

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}

◆ zfar()

float Orbiter::zfar ( ) const

revnvoie le plan loin de la projection. distance max des points dans le frustum de la camera (valeur dans le repere camera).

Definition at line 64 of file orbiter.cpp.

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}

◆ rotation() [1/2]

void Orbiter::rotation ( const float x,
const float y )

change le point de vue / la direction d'observation.

Definition at line 22 of file orbiter.cpp.

23{
24 m_rotation.x= m_rotation.x + y;
25 m_rotation.y= m_rotation.y + x;
26}

◆ translation() [1/2]

void Orbiter::translation ( const float x,
const float y )

deplace le centre / le point observe.

Definition at line 28 of file orbiter.cpp.

29{
30 m_position.x= m_position.x - m_size * x;
31 m_position.y= m_position.y + m_size * y;
32}

◆ move()

void Orbiter::move ( const float z)

rapproche / eloigne la camera du centre.

Definition at line 34 of file orbiter.cpp.

35{
36 m_size= m_size - m_size * 0.01f * z;
37 if(m_size < 0.001f)
38 m_size= 0.001f;
39}

◆ view()

Transform Orbiter::view ( ) const

renvoie la transformation vue.

Definition at line 41 of file orbiter.cpp.

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}
Transform RotationX(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe X.
Definition mat.cpp:230
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition mat.cpp:242
Transform Translation(const Vector &v)
renvoie la matrice representant une translation par un vecteur.
Definition mat.cpp:216

◆ projection() [2/2]

Transform Orbiter::projection ( ) const

renvoie la transformation projection actuelle. doit etre initialise par projection(width, height, fov).

Definition at line 72 of file orbiter.cpp.

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}
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 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

◆ viewport()

Transform Orbiter::viewport ( ) const

renvoie la transformation viewport actuelle. doit etre initialise par projection(width, height, fov).

Definition at line 84 of file orbiter.cpp.

85{
86 return Viewport(m_width, m_height);
87}
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
Definition mat.cpp:357

◆ frame()

void Orbiter::frame ( const float z,
Point & dO,
Vector & dx,
Vector & dy ) const

renvoie les coordonnees de l'origine d0 et les axes dx, dy du plan image dans le repere du monde. permet de construire un rayon pour le pixel x, y :

  • l'extremite : un point dans le plan image avec z = 1 :
    Point d1;
    Vector dx1, dy1;
    camera.projection(width, height, fov);
    camera.frame(1, d1, dx1, dy1);
    Point e= d1 + x*dx1 + y*dy1;
    representation d'un point 3d.
    Definition vec.h:21
    representation d'un vecteur 3d.
    Definition vec.h:67
  • l'origine :
    Point o= camera.position();

ou autre solution, reproduire la projection openGL :

  • extremite : un point dans le plan image avec z = 1 :
    Point d1;
    Vector dx1, dy1;
    camera.projection(width, height, fov);
    camera.frame( 1, d1, dx1, dy1);
    Point e= d1 + x*dx1 + y*dy1;
  • origine : un point dans le plan image avec z = 0 :
    Point d0;
    Vector dx0, dy0;
    camera.projection(width, height, fov);
    camera.frame(0, d0, dx0, dy0);
    Point o= d0 + x*dx0 + y*dy0;

Definition at line 90 of file orbiter.cpp.

91{
92 Transform v= view();
93 Transform p= projection();
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}
Transform viewport() const
renvoie la transformation viewport actuelle. doit etre initialise par projection(width,...
Definition orbiter.cpp:84
Transform view() const
renvoie la transformation vue.
Definition orbiter.cpp:41
Transform inverse() const
renvoie l'inverse de la matrice.
Definition mat.cpp:399

◆ position()

Point Orbiter::position ( )

renvoie la position de la camera dans le repere du monde.

Definition at line 109 of file orbiter.cpp.

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}

◆ translation() [2/2]

vec3 Orbiter::translation ( )

renvoie la translation de l'orbiter

Definition at line 117 of file orbiter.cpp.

118{
119 return {-m_position.x, -m_position.y, -m_size };
120}

◆ rotation() [2/2]

vec2 Orbiter::rotation ( )

renvoie les angles de rotation de l'orbiter

Definition at line 122 of file orbiter.cpp.

123{
124 return m_rotation;
125}

◆ read_orbiter()

int Orbiter::read_orbiter ( const char * filename)

relit la position de l'orbiter depuis un fichier texte.

Definition at line 127 of file orbiter.cpp.

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}
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

◆ write_orbiter()

int Orbiter::write_orbiter ( const char * filename)

enregistre la position de l'orbiter dans un fichier texte.

Definition at line 161 of file orbiter.cpp.

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}

◆ radius()

float Orbiter::radius ( ) const
inline

renvoie le rayon de la scene.

Definition at line 97 of file orbiter.h.

97{ return m_radius; }

Member Data Documentation

◆ m_center

Point Orbiter::m_center
protected

Definition at line 100 of file orbiter.h.

◆ m_position

vec2 Orbiter::m_position
protected

Definition at line 101 of file orbiter.h.

◆ m_rotation

vec2 Orbiter::m_rotation
protected

Definition at line 102 of file orbiter.h.

◆ m_size

float Orbiter::m_size
protected

Definition at line 103 of file orbiter.h.

◆ m_radius

float Orbiter::m_radius
protected

Definition at line 104 of file orbiter.h.

◆ m_width

float Orbiter::m_width
protected

Definition at line 106 of file orbiter.h.

◆ m_height

float Orbiter::m_height
protected

Definition at line 107 of file orbiter.h.

◆ m_fov

float Orbiter::m_fov
protected

Definition at line 108 of file orbiter.h.


The documentation for this class was generated from the following files: