gKit2 light
Public Member Functions | Protected Attributes | List of all members

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. More...
 
void lookat (const Point &center, const float size)
 observe le point center a une distance size. More...
 
void lookat (const Point &pmin, const Point &pmax)
 observe le centre d'une boite englobante. More...
 
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. More...
 
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). More...
 
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). More...
 
void rotation (const float x, const float y)
 change le point de vue / la direction d'observation. More...
 
void translation (const float x, const float y)
 deplace le centre / le point observe. More...
 
void move (const float z)
 rapproche / eloigne la camera du centre. More...
 
Transform view () const
 renvoie la transformation vue. More...
 
Transform projection () const
 renvoie la transformation projection actuelle. doit etre initialise par projection(width, height, fov). More...
 
Transform viewport () const
 renvoie la transformation viewport actuelle. doit etre initialise par projection(width, height, fov). More...
 
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. More...
 
int read_orbiter (const char *filename)
 relit la position de l'orbiter depuis un fichier texte. More...
 
int write_orbiter (const char *filename)
 enregistre la position de l'orbiter dans un fichier texte. More...
 
float radius () const
 renvoie le rayon de la scene. More...
 

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.f), m_radius(5.f), 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_size= size;
13  m_radius= size;
14 }
Point center(const Point &a, const Point &b)
renvoie le milieu du segment ab.
Definition: vec.cpp:24
vecteur generique, utilitaire.
Definition: vec.h:131

◆ lookat() [2/2]

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

observe le centre d'une boite englobante.

Definition at line 16 of file orbiter.cpp.

17 {
18  lookat(center(pmin, pmax), distance(pmin, pmax));
19 }
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 47 of file orbiter.cpp.

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

◆ 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 56 of file orbiter.cpp.

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 }
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
representation d'un point 3d.
Definition: vec.h:21

◆ 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 63 of file orbiter.cpp.

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 }

◆ rotation()

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

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

Definition at line 21 of file orbiter.cpp.

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

◆ translation()

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

deplace le centre / le point observe.

Definition at line 27 of file orbiter.cpp.

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

◆ move()

void Orbiter::move ( const float  z)

rapproche / eloigne la camera du centre.

Definition at line 33 of file orbiter.cpp.

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

◆ view()

Transform Orbiter::view ( ) const

renvoie la transformation vue.

Definition at line 40 of file orbiter.cpp.

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 }
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 71 of file orbiter.cpp.

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 }
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
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
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 83 of file orbiter.cpp.

84 {
85  return Viewport(m_width, m_height);
86 }
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 :

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 89 of file orbiter.cpp.

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 }
Transform viewport() const
renvoie la transformation viewport actuelle. doit etre initialise par projection(width,...
Definition: orbiter.cpp:83
Transform view() const
renvoie la transformation vue.
Definition: orbiter.cpp:40
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

◆ position()

Point Orbiter::position ( )

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

Definition at line 108 of file orbiter.cpp.

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 }

◆ read_orbiter()

int Orbiter::read_orbiter ( const char *  filename)

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

Definition at line 116 of file orbiter.cpp.

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 }
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 150 of file orbiter.cpp.

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 }

◆ radius()

float Orbiter::radius ( ) const
inline

renvoie le rayon de la scene.

Definition at line 93 of file orbiter.h.

93 { return m_radius; }

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