19 Ray(
const Point& _o,
const Point& _e ) : o(_o), d(Vector(_o, _e)), tmax(1) {}
20 Ray(
const Point& _o,
const Vector& _d ) : o(_o), d(_d), tmax(FLT_MAX) {}
21 Ray(
const Point& _o,
const Vector& _d,
const float _tmax ) : o(_o), d(_d), tmax(_tmax) {}
35 Hit( ) : t(FLT_MAX), u(), v(), instance_id(-1), mesh_id(-1), primitive_id(-1), triangle_id(-1) {}
36 Hit(
const Ray& ray ) : t(ray.tmax), u(), v(), instance_id(-1), mesh_id(-1), primitive_id(-1), triangle_id(-1) {}
38 Hit(
const float _t,
const float _u,
const float _v,
const int _mesh_id,
const int _primitive_id,
const int _id ) : t(_t), u(_u), v(_v),
39 instance_id(-1), mesh_id(_mesh_id), primitive_id(_primitive_id), triangle_id(_id) {}
41 operator bool ( ) {
return (triangle_id != -1); }
54 Triangle(
const vec3& a,
const vec3& b,
const vec3&
c,
const int _mesh_id,
const int _primitive_id,
const int _id ) :
55 p(a), e1(Vector(a, b)), e2(Vector(a,
c)),
56 mesh_id(_mesh_id), primitive_id(_primitive_id), triangle_id(_id) {}
65 Hit intersect(
const Ray &ray,
const float htmax )
const
67 Vector pvec=
cross(ray.d, e2);
68 float det=
dot(e1, pvec);
70 float inv_det= 1 / det;
71 Vector tvec(p, ray.o);
73 float u=
dot(tvec, pvec) * inv_det;
74 if(u < 0 || u > 1)
return Hit();
76 Vector qvec=
cross(tvec, e1);
77 float v=
dot(ray.d, qvec) * inv_det;
78 if(v < 0 || u + v > 1)
return Hit();
80 float t=
dot(e2, qvec) * inv_det;
81 if(t < 0 || t > htmax)
return Hit();
83 return Hit(t, u, v, mesh_id, primitive_id, triangle_id);
88int main(
const int argc,
const char **argv )
90 const char *filename=
"data/cornell.glb";
95 GLTFScene scene= read_gltf_scene(filename);
98 std::vector<Triangle> triangles;
99 for(
unsigned node_id= 0; node_id < scene.nodes.size(); node_id++)
101 const GLTFNode& node= scene.nodes[node_id];
106 const GLTFMesh& mesh= scene.meshes[mesh_id];
107 for(
unsigned primitive_id= 0; primitive_id < mesh.primitives.size(); primitive_id++)
110 for(
unsigned i= 0; i +2 < primitives.indices.size(); i+= 3)
113 int a= primitives.indices[i];
114 int b= primitives.indices[i+1];
115 int c= primitives.indices[i+2];
118 Point pa= primitives.positions[a];
119 Point pb= primitives.positions[b];
120 Point pc= primitives.positions[c];
127 triangles.push_back(
Triangle(pa, pb, pc, mesh_id, primitive_id, i/3) );
131 assert(triangles.size());
134 assert(scene.cameras.size());
136 Transform projection= scene.cameras[0].projection;
139 unsigned width= 1024;
140 unsigned height= width / scene.cameras[0].aspect;
141 Image image(width, height);
149 for(
unsigned y= 0; y < image.height(); y++)
150 for(
unsigned x= 0; x < image.width(); x++)
155 Ray ray(origine, extremite);
159 for(
unsigned i= 0; i < triangles.size(); i++)
161 if(
Hit h= triangles[i].intersect(ray, hit.t))
169 image(x, y)=
Color(1 - hit.u - hit.v, hit.u, hit.v);
representation d'une image.
int mesh_index
indice du maillage.
Transform model
transformation model pour dessiner le maillage.
description d'un maillage.
position et orientation d'un maillage dans la scene.
groupe de triangles d'un maillage. chaque groupe est associe a une matiere.
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 Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
Transform Identity()
construit la transformation identite.
float dot(const Vector &u, const Vector &v)
renvoie le produit scalaire de 2 vecteurs.
Vector cross(const Vector &u, const Vector &v)
renvoie le produit vectoriel de 2 vecteurs.
representation d'une couleur (rgba) transparente ou opaque.
intersection avec un triangle.
representation d'un point 3d.
triangle pour le bvh, cf fonction bounds() et intersect().