我们在“Q81”中已经知道怎么用ray tracing的方式生成PLY文件对应的图形。
参考:http://blog.csdn.net/libing_zeng/article/details/61195502
其中采用的方式是:
char* file_name = ".\\PLYFiles\\hand.ply";
Grid* grid_ptr = new Grid(new Mesh);
grid_ptr->read_flat_triangles(file_name);
// grid_ptr->read_smooth_triangles(file_name);
grid_ptr->set_material(phong_ptr1);
grid_ptr->setup_cells();
add_object(grid_ptr);
1,新建一个Mesh对象;
2,新建一个Grid对象,并将Mesh对象的指针传给Grid对象;
3,通过Grid的成员方法读入PLY文件;
4,给Grid对象设置材质;
5,建立Grid对象的小正方体(cell);
6,将Grid对象添加到World中
直接生成PLY文件对应的图形,存在一个问题:
原始图形可能很小、而且位置确定。
所以,我们在生成相应图形时,需要将相机的参数(eye, look_at, distance)调到某个固定(合适)的值,才能生成可以接受的(正常的)图形。
有时候,我们不希望改变相机的参数。
这种情况下,我们只有将PLY文件对应的图形进行仿射变换。
将原始图形进行放大,以便大小合适;将原始图形进行平移,以便位置合适。
之前在“Q84”中也有做过相应的事情:http://blog.csdn.net/libing_zeng/article/details/61916767
现在,我们将“对PLY文件对应的图形进行仿射变换”单独拿出来进行说明,以便加深印象。
相关代码如下:
char* fileName = ".\\PLYFiles\\Bunny4K.ply"; // 4000 triangles
Grid* bunny_ptr = new Grid(new Mesh);
// bunny_ptr->read_flat_triangles(fileName); // read PLY file
bunny_ptr->read_smooth_triangles(fileName); // read PLY file
bunny_ptr->set_material(dielectric_ptr);
bunny_ptr->setup_cells();
Instance* instance_ptr = new Instance;
instance_ptr->set_object(bunny_ptr);
instance_ptr->scale(16.0);
// instance_ptr->rotate_y(45.0);
instance_ptr->translate(3.0, 2.0, 0.0);
add_object(instance_ptr);
1,新建一个Mesh对象;
2,新建一个Grid对象,并将Mesh对象的指针传给Grid对象;
3,通过Grid的成员方法读入PLY文件;
4,给Grid对象设置材质;
5,建立Grid对象的小正方体(cell);
7,将Instance对象对应的几何物体设置为之前的Grid对象;
8,进行仿射变换(先缩放,在平移);
9,将Instance对象添加到World中
接下来,在某固定相机参数的情况下,将Stanford Bunny进行放大和平移。
原始图形,平移到(3,3.5,0)
instance_ptr->scale(1.0);
instance_ptr->translate(3.0, 3.5, 0.0);
放大2倍,平移到(3,3.5,0)
instance_ptr->scale(2.0);
instance_ptr->translate(3.0, 3.5, 0.0);
放大4倍,平移到(3,3.5,0)
instance_ptr->scale(4.0);
instance_ptr->translate(3.0, 3.5, 0.0);
放大8倍,平移到(3,3.5,0)
instance_ptr->scale(8.0);
instance_ptr->translate(3.0, 3.5, 0.0);
放大16被,平移到(3,3.5,0)
instance_ptr->translate(3.0, 3.5, 0.0);
(如上所有图形中的bunny都为添加阴影,若要添加阴影,基于如下链接的code在Instance类中实现shadow_hit()方法即可)
http://download.csdn.net/detail/libing_zeng/9786258