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); }
54 Triangle(
const TriangleData& data,
const int _id ) : p(data.a), e1(Vector(data.a, data.b)), e2(Vector(data.a, data.
c)), id(_id) {}
63 Hit intersect(
const Ray &ray,
const float tmax )
const
65 Vector pvec=
cross(ray.d, e2);
66 float det=
dot(e1, pvec);
68 float inv_det= 1 / det;
69 Vector tvec(p, ray.o);
71 float u=
dot(tvec, pvec) * inv_det;
72 if(u < 0 || u > 1)
return Hit();
74 Vector qvec=
cross(tvec, e1);
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);
89 const TriangleData& data= mesh.triangle(hit.triangle_id);
92 float w= 1 - hit.u - hit.v;
97int 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];
108 if(camera.read_orbiter(orbiter_filename) < 0)
114 std::vector<Triangle> triangles;
116 int n= mesh.triangle_count();
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);
128 Transform projection= camera.projection();
132auto start= std::chrono::high_resolution_clock::now();
135 for(
unsigned y= 0; y < image.height(); y++)
136 for(
unsigned 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));
173auto 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.
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet.
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().
bool write_image_hdr(const Image &image, const char *filename, const bool flipY)
enregistre une image au format .hdr
bool write_image(const Image &image, const char *filename, const bool flipY)
enregistre une image au format .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....
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.