25 Ray(
const Point& origine,
const Point& extremite ) : o(origine), d(
Vector(origine, extremite)), tmax(1) {}
28 Ray(
const Point& origine,
const Vector& direction ) : o(origine), d(direction), tmax(FLT_MAX) {}
31 Point point(
const float t )
const {
return o + t * d; }
41 Hit( ) : t(FLT_MAX), u(), v(), triangle_id(-1) {}
42 Hit(
const float _t,
const float _u,
const float _v,
const int _id ) : t(_t), u(_u), v(_v), triangle_id(_id) {}
45 operator bool ( ) {
return (triangle_id != -1); }
63 Hit intersect(
const Ray &ray,
const float tmax )
const
66 float det=
dot(e1, pvec);
68 float inv_det= 1 / det;
71 float u=
dot(tvec, pvec) * inv_det;
72 if(u < 0 || u > 1)
return Hit();
75 float v=
dot(ray.d, qvec) * inv_det;
76 if(v < 0 || u + v > 1)
return Hit();
78 float t=
dot(e2, qvec) * inv_det;
79 if(t > tmax || t < 0)
return Hit();
81 return Hit(t, u, v,
id);
92 float w= 1 - hit.u - hit.v;
97 int main(
const int argc,
const char **argv )
99 const char *mesh_filename=
"data/cornell.obj";
101 mesh_filename= argv[1];
103 const char *orbiter_filename=
"data/cornell_orbiter.txt";
105 orbiter_filename= argv[2];
114 std::vector<Triangle> triangles;
117 for(
int i= 0; i < n; i++)
118 triangles.emplace_back(mesh.
triangle(i), i);
122 Image image(1024, 768);
125 camera.
projection(image.width(), image.height(), 45);
132 auto start= std::chrono::high_resolution_clock::now();
135 for(
int y= 0; y < image.height(); y++)
136 for(
int x= 0; x < image.width(); x++)
139 Point origine= inv(
Point(x +
float(0.5), y +
float(0.5), 0));
140 Point extremite= inv(
Point(x +
float(0.5), y +
float(0.5), 1));
141 Ray ray(origine, extremite);
145 float tmax= ray.tmax;
146 for(
int i= 0; i < int(triangles.size()); i++)
148 if(
Hit h= triangles[i].intersect(ray, tmax))
160 image(x, y)=
Color(1 - hit.u - hit.v, hit.u, hit.v);
166 Vector n= normal(mesh, hit);
168 image(x, y)=
Color(std::abs(n.x), std::abs(n.y), std::abs(n.z));
173 auto stop= std::chrono::high_resolution_clock::now();
174 int cpu= std::chrono::duration_cast<std::chrono::milliseconds>(stop - start).count();
representation d'une image.
representation d'un objet / maillage.
Mesh & triangle(const unsigned int a, const unsigned int b, const unsigned int c)
int triangle_count() const
renvoie le nombre de triangles.
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet.
int read_orbiter(const char *filename)
relit la position de l'orbiter depuis un fichier texte.
Transform viewport() const
renvoie la transformation viewport actuelle. doit etre initialise par projection(width,...
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...
Transform view() const
renvoie la transformation vue.
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().
int write_image(const Image &image, const char *filename)
enregistre une image dans un fichier png.
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
Transform Identity()
construit la transformation identite.
float dot(const Vector &u, const Vector &v)
renvoie le produit scalaire de 2 vecteurs.
Vector normalize(const Vector &v)
renvoie un vecteur unitaire / longueur == 1.
Vector cross(const Vector &u, const Vector &v)
renvoie le produit vectoriel de 2 vecteurs.
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
int write_image_hdr(const Image &image, const char *filename)
enregistre une image dans un fichier .hdr.
representation d'une couleur (rgba) transparente ou opaque.
intersection avec un triangle.
representation d'un point 3d.
representation d'un triangle.
triangle pour le bvh, cf fonction bounds() et intersect().
representation d'un vecteur 3d.