Q92:怎么对PLY文件对应的图形进行仿射变换

198 篇文章 12 订阅
195 篇文章 27 订阅

我们在“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);


6,新建一个Instance对象;

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->scale(16.0);
    instance_ptr->translate(3.0, 3.5, 0.0);



(如上所有图形中的bunny都为添加阴影,若要添加阴影,基于如下链接的code在Instance类中实现shadow_hit()方法即可)

http://download.csdn.net/detail/libing_zeng/9786258


  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值