Beispiel #1
0
bool hitTriang(Photon *photon, Triang *triang, const float distance, const Material *materials)
{
    Shader shader = DIFFUSE;

    // Better idea?
    if (fDot(triang->direct, photon->direct) > -EPSILON)
        triang->direct = vNeg(triang->direct);

    // Update ray's position to the point where the ray hits the sphere
    photon->origin = fFMA(photon->direct, distance - UM(10), photon->origin);
    photon->lambda = materials[triang->mID].lambda;

    if (shader == CRAZY) {
        photon->direct = vNorm(vSub(newVec(0.99, 0, 0), photon->origin));
        return REFLECTED;
    }

    else if (shader == SPECULAR) {
        // Angle between new and old vector is twice the angle between old vector and normal
        Vec reflect = vDot(photon->direct, triang->direct);
        photon->direct = vSub(photon->direct, vMul(triang->direct, vAdd(reflect, reflect)));

        return REFLECTED;
    }

    else if (shader == DIFFUSE) {
        photon->direct = randDir();
        if (fDot(photon->direct, triang->direct) < EPSILON)
            photon->direct = vNeg(photon->direct);

        return REFLECTED;
    }

    else return ABSORBED;
}
void VerletStick::constrainLen() {
    for (int i=0; i<constrainLoopCount; i++) {
        Vector3df delta = Vector3df(b2->getPos().x-b1->getPos().x, 
                                    b2->getPos().y-b1->getPos().y, 
                                    b2->getPos().z-b1->getPos().z);
        
        float deltaLength = delta.mag();
        float difference = ((deltaLength - len) / deltaLength);
        
        // nudge positiviely
        Vector3df vPos(delta.x * (constrainVal.elem0 * tension * difference),
                       delta.y * (constrainVal.elem0 * tension * difference),
                       delta.z * (constrainVal.elem0 * tension * difference) );
        b1->addPos(vPos);
        
        // nudge negatively
        Vector3df vNeg(delta.x * (constrainVal.elem1 * tension * difference),
                       delta.y * (constrainVal.elem1 * tension * difference),
                       delta.z * (constrainVal.elem1 * tension * difference) );
        b2->subPos(vNeg);
        
        
        /*std::cout << "b1.getPos() = " << b1.getPos() << std::endl;
         std::cout << "vNeg = " << vNeg << std::endl;
         std::cout << "deltaLength = " << deltaLength << std::endl;
         std::cout << "difference = " << difference << std::endl;*/
        
    }
}
Beispiel #3
0
Photon triangEmit(const Triang *triang, const Material *materials)
{
    Photon p;
    float u = drand48(), v = drand48();
    Vec point = vAdd(fMul(triang->vectab, u), fMul(triang->vectac, v));

    // If point is outside triangle
    if (!triang->rectan && u + v < EPSILONONE)
        p.origin = vSub(vAdd(triang->origin, vAdd(triang->vectab, triang->vectac)), point);
    else
        p.origin = vAdd(triang->origin, point);

    p.direct = randDir();
    if (fDot(p.direct, triang->direct) > EPSILON)
        p.direct = vNeg(p.direct);

    p.lambda = materials[triang->mID].lambda;
    return p;
}