コード例 #1
0
ファイル: scene.cpp プロジェクト: nbajiaoshi/RayTrace
Vec3f Scene::RayTracer(Line l,Vec3f& IntersectPoint,double strength) const{
    if (strength < 0.01)
        return Vec3f(0,0,0);
    Vec3f N;
    Material material;
    Vec3f Color;
    if (getIntersection(l,N,IntersectPoint,Color,material)){
        double len = (IntersectPoint - l.start_point).Len();
        if ((l.start_point + l.dir * len - IntersectPoint).Len() > EPS){
            qDebug() << "f**k" << (l.start_point + l.dir * len - IntersectPoint).Len();
            l.start_point.debug();
            l.dir.debug();
            IntersectPoint.debug();
        }
        if (material.refract_n > 1)
            strength *= exp(0.05 -len * material.absorptivity);
        double I = 0;
        /*for (unsigned i = 0; i < _lightsources.size();i++){
            Line light(IntersectPoint,_lightsources[i] - IntersectPoint);
            if (!getIntersection(light,a,b,c,d,Len(_lightsources[i] - IntersectPoint)- EPS)){
                Vec3f Ref =  light.dir - N * 2 * (light.dir * N);
                double Ii = material.Kd * abs(N * light.dir);
                if (Ref * l.dir > EPS)
                    Ii += material.Ks * pow(Ref * l.dir,material.Ksn);
                I += Ii * Ii/_lightsources.size();
            }
        }*/
        Line light(IntersectPoint,_lightsources[0] - IntersectPoint);
        Vec3f Ref =  light.dir - N * 2 * (light.dir * N);
        double Ii = material.Kd * abs(N * light.dir);
        if (Ref * l.dir > EPS)
            Ii += material.Ks * pow(Ref * l.dir,material.Ksn);
        double Brightness;
        if (softshape){
            bools Done,Reach;
            memset(Done,0,sizeof(Done));
            //Brightness = getBrightness(LightUL,LightUR,LightDR,LightDL,IntersectPoint);
            Brightness = getBrightness(0,LightNum,0,LightNum,IntersectPoint,Done,Reach);
        }
        else{
            Vec3f a,b,c;
            Material d;
            Brightness = getIntersection(light,a,b,c,d,Len(_lightsources[0] - IntersectPoint)- EPS)?0:1;
        }
        I = Ii * Brightness + material.Ka;
        if (I > 1 - EPS){
            I = 1 - EPS;
        }
        I = I * strength;
        double Cosi = l.dir * N;
        double Sini = abs(Cosi) < 1 - EPS?sqrt(1 - Cosi * Cosi):0;
        double Sinr = Sini * material.refract_n;
        Line reflect(IntersectPoint,l.dir - N * 2 * Cosi);
        Line refract = reflect;
        if (Sinr < 1 - EPS){
            double Cosr = sqrt(1 - Sinr * Sinr);
            Vec3f tmp = l.dir - N * Cosi;
            tmp.Normalize();
            Vec3f rf =  N * Cosr + tmp * Sinr;
            refract = Line(IntersectPoint,rf);
        }
        if (REF){
            Vec3f iii;
            Color = Color * I * material.diffuse_reflectance
                    + Color.mul(RayTracer(reflect,iii,material.reflect_rate * strength))
                    + Color.mul(RayTracer(refract,iii,material.refract_rate * strength));
        }
        else
            Color = Color * I * material.diffuse_reflectance;
        Color.Fix255();
        return Color;
    }
    else{
        double I = 1;
        for (unsigned i = 0; i < _lightsources.size();i++){

        }
        return Vec3f(0,0,0) * I * strength;
    }
}