采用树形bounding box渲染的图片

对场景组织作了调整,采用树状的包围盒来分隔空间。Primitive被做成了recursive的结构,整个场景就是一个Primitive。每一个场景都有自己的一个包围盒,子场景也有自己的包围盒。intersect的时候从顶向下逐级过滤。对底层的单个三角形的intersect仍然采用包围球来计算,球体的intersect也一样不采用包围盒判断,因为考虑到一个球体和它的包围盒之间差别不大。

结合分形迭代,做了如下一张图片:

该图片的场景脚本如下:

// Frames
obj = new Plane( 0 , 1 , 0 , 4.4 );
obj.setColor(
0.7 , 0.4 , 0 , 1.0 );
primitive.push(obj);

obj
= new Plane( 0 , - 1 , 0 , 7.4 );
obj.setColor(
0.7 , 0.4 , 0.0 , 1 );
primitive.push(obj);

obj
= new Plane( 0.4 , 0 , - 1 , 12 );
obj.setColor(
0.7 , 0.4 , 0.0 , 0.5 );
primitive.push(obj);

// Lightsources
obj = new Light( 0 , 5 , 5 );
lights.push(obj);

obj
= new Light( - 3 , 5 , 1 );
lights.push(obj);

// Objects
obj = new Sphere( 2 , 4 , 3 , 2.5 );
obj.setColor(
1.0 , 1.0 , 1.0 , 0.2 , 0.8 , 0.8 , 1.3 );
primitive.push(obj);

obj
= new Sphere( - 5.5 , 2.5 , 7 , 3 );
obj.setColor(
0.7 , 0.7 , 1.0 , 0.1 , 0.9 , 0.0 , 1.3 );
primitive.push(obj);

for (i = 0 ;i < 4 ; ++ i){
obj
= new Sphere( - 6 + (i * 3 ), - 0.5 , - 2 , 1 );
obj.setColor(
0.7 , 0.7 , 1.0 , 0.3 , 0.9 , 0.0 , 1.3 );
primitive.push(obj);
}

obj
= new File( ' Y:\Others\raytracer7\meshes\knot.3ds ' , 3 , - 3 , 0 , 6 , 1 );
obj.setColor(
0.9 , 0.2 , 0.0 , 0.4 , 0.9 );
primitive.push(obj);

obj
= obj.clone();
obj.x
= - 5 ;
obj.b
= 1 ;
primitive.push(obj);

obj
= obj.clone();
obj.x
= 5 ;
obj.y
= 5 ;
obj.b
= 0 ;
primitive.push(obj);

本文属Span Zhang(张友邦)原创,转载请注明出处。

中国原创分形艺术、中国原创分形软件第一站

你可能感兴趣的:(脚本)