Q79:怎么用三角形网格(Triangle Mesh)细分曲面

来源:互联网 发布:达真堪布淘宝 编辑:程序博客网 时间:2024/05/02 06:46

79.1 思路分析

 

我们先以球心在原点的单位球面为例来说明细分过程。





79.2 C++代码实现

 

79.2.1 tessellate_flat_sphere()的实现

 

其实,实现起来还挺简单。只需要根据参数方程计算小三角形的顶点,然后新建三角形对象,然后将三角形对象添加到Grid即可。(画Grid的过程在“Q78”中已经实现)。

我们在Grid.cpp中添加一个函数tessellate_flat_sphere()来完成所需的事宜。

 

该函数的相关代码如下放截图:

 




 

79.2.2 World::build()

 


 

79.3 测试图形

 

tessellate_flat_sphere(8,4),耗时315s

 

tessellate_flat_sphere(16,8),耗时299s

 

tessellate_flat_sphere(160,80),耗时269s

 

tessellate_flat_sphere(1600,800),耗时438s

 

79.4 用三角形网格细分牛角面

 

用三角形网格细分曲面,其实很简单:

根据参数方程求出所有三角形的顶点,然后将所有三角形添加到一个Grid中,然后ray trace这个Grid即可。

 

所以,只要直到曲面的参数方程即可。

 

79.4.1 参数方程



 

79.4.2 将牛角面分割成三角形网格(tessellate_flat_horn())

 


 

79.4.3 World::build()

和细分球面时不同的地方只是“相机的位置”:

         pinhole_ptr->set_eye(0,-2, 100);

         pinhole_ptr->set_lookat(0,-2, 0);

 

79.4.4 测试图形

 

tessellate_flat_horn(8,4),耗时371s

 

tessellate_flat_horn(16,8),耗时434s

 

tessellate_flat_horn(160,80),耗时288s

 

tessellate_flat_horn(1600,800),耗时453s

  

79.5 其他说明

 

像这样以三角形网格的方式来ray trace参数形式的曲面,思路简单,速度较快。

 

回想“问题五十三:怎么用ray tracing画参数方程表示的曲面(1)”当时ray trace参数形式的球面和牛角面时,联立参数方程和光线方程,然后求个各种一阶微分、二阶微分。各种纠结,生成图形的过程是特别耗时,重点是生成的图形对不起观众。参考链接:

http://blog.csdn.net/libing_zeng/article/details/54565070

 

完整的代码,参考:http://download.csdn.net/detail/libing_zeng/9772259

 

Referrance

[1]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.


4 0