三角网格八叉树并行蒙特卡罗射线追踪方法

蒙特卡洛射线追踪是指从随机点随机方向发射射线,计算射线与几何结构的交点,根据交点处表面的性质判断射线下一步的行为,一般是漫反射、镜面反射、吸收等等,然后继续追踪射线,直到射线不再与任何几何表面相交,或者相交次数达到了预先设置的阈值。

蒙特卡洛射线追踪一般用在复杂几何结构中的问题求解,例如热辐射、太阳能、电磁波传播等。这些情况下,由于结构复杂,射线多次反射,并且表面之间存在遮挡关系,数值求解误差较大。而蒙特卡罗射线追踪是从现象上模拟真实的物理过程,例如光线/射线的传播过程,当射线数足够多时(大数定律),可以得到符合精度要求的结果。

此处介绍一种蒙特卡洛射线追踪方法。

表面采用三角网格表示,例如Obj格式和Ply格式。

空间加速结构为八叉树。

通过openmp并行或者gpu并行,进一步加速射线求交。

从而实现复杂几何构型的蒙卡射线追踪。

源代码位于https://gitee.com/spacecube/monte-carlo-ray-tracing。

tricell是三角形类,octatree是八叉树类。三角形用double pp[3][3]三个顶点表示,逆时针方向排列。 八叉树是长方体包围盒,直角坐标系下的。

首先将三角面片信息读入内存。比如

    vector mycells; 
    mycells.push_back(newCell);

然后新建一个八叉树。

    OctaTree mytree;

然后将三角面片插入八叉树。

    for(int i=0;i 
  

然后就可以进行射线追踪了。射线用起点double pos[3]和方向double dir[3]表示。

    double rayLength;
    int noIntersectedTricell = mytree.rayIntersect(pos,vel,rayLength, 0);

如果返回-1,表明没有相交。否则是相交的三角形编号。rayLength当中储存的是射线从起点到交点的长度。

你可能感兴趣的:(蒙特卡罗射线追踪,蒙特卡洛射线追踪)