Трассировка лучей: функция эллипсоида - PullRequest
0 голосов
/ 08 февраля 2020

Мы работаем с генерацией формы с использованием трассировки лучей. Мы считаем, что функция попадания не работает должным образом. В настоящее время «лицевая» сторона эллипсоида горит правильно. Поскольку форма вращается, у нее есть проблемы, отражающие свет. Пример поворота эллипсоида.

Ниже приведена текущая версия функции Hit.

bool Ellipsoid::Hit(const Ray& ray,
                 const double minHitDistance,
                 const double maxHitDistance,
                 HitRecord& hitRecord,
                 const Vector3d& light) const {

    if (hitRecord.shapeHit == this) {
        return false;
    }

    // M is a 3x3 matrix 
    const Vector3d& direction = (M.inverse()*ray.Direction());
    const Vector3d oc = M.inverse()*(ray.Origin() -this->center);


    const double a = direction.dot(direction);

    const double b = oc.dot(direction);

    const double c = oc.dot(oc) - 1;

    const double discriminant = b*b - a*c;
    if (discriminant > 0) {

        const double sqrtDiscriminant = sqrt(discriminant);
        const double aReciprocal = 1.0 / a;  
        double temp = (-b - sqrtDiscriminant) * aReciprocal;
        if (temp < maxHitDistance && temp > minHitDistance) {
            hitRecord.distance = temp;
            hitRecord.closestIntersection = ray.PointAtParameter(hitRecord.distance);

            hitRecord.normal = M.inverse()*((hitRecord.closestIntersection - center) / 1);
            hitRecord.shapeHit = this;
            return true;
        }
        temp = (-b + sqrtDiscriminant) * aReciprocal;
        if (temp < maxHitDistance && temp > minHitDistance) {
            hitRecord.distance = temp;
            hitRecord.closestIntersection = ray.PointAtParameter(hitRecord.distance);

            hitRecord.normal =      M.inverse()*((hitRecord.closestIntersection - center) / 1);
            hitRecord.shapeHit = this;
            return true;
        }
    }

    return false;
}

Первое, что мы попробовали, это изменило M.transpose () на M.inverse () в строках, где мы устанавливаем hitRecord.normal. Это сделало свет значительно лучше, но не полностью помогло точности света после вращения объекта. Мы не уверены, является ли функция Hit полностью правильной. Нам просто нужно некоторое руководство, чтобы увидеть, нужно ли нам искать другие ошибки в программе. Любой совет помогает.

Редактировать: Мы также пытались изменить дискриминант. Это приводит к сбою функции, поскольку «4» учитывается во всей функции (как видно в разделе комментариев).

1 Ответ

0 голосов
/ 17 февраля 2020

После полного переписывания функции мы определили, что проблема не в l ie в функции попадания.

...