Простая трассировка лучей с помощью цилиндра?

Я совершенно новичок в трассировке лучей и у меня проблема с отображением цилиндра. Я реализовал код, чтобы найти сферу, и следовал учебнику, который нашел здесь: http://woo4.me/wootracer/cylinder-intersection/ чтобы добавить простой цилиндр (бесконечный для начала). Я написал следующий код, но получил ровную плоскую поверхность по всему изображению независимо от того, какие координаты я задаю цилиндру. Кто-нибудь может дать мне подсказку, где я иду не так? Я искал в Google в течение трех дней и искал через переполнение стека и пробовал несколько способов, предложенных в форумах и учебных пособиях, но безрезультатно, надеюсь, кто-то здесь может увидеть, где я иду не так?? Заранее спасибо!!

    virtual double findIntersection(Ray ray){
    Vect rayOrigin = ray.getRayOrigin();
    double rayOriginX = rayOrigin.getVectX();
    double rayOriginY = rayOrigin.getVectY();
    double rayOriginZ = rayOrigin.getVectZ();

    Vect rayDirection = ray.getRayDirection();
    double rayDirectionX = rayDirection.getVectX();
    double rayDirectionY = rayDirection.getVectY();
    double rayDirectionZ = rayDirection.getVectZ();

    //a=d x2 + d y2     b = ex d x + e y d y    c = ex2 + e y2−1
    double a = rayDirectionX * rayDirectionX + rayDirectionY * rayDirectionY;
    double b = 2* rayOriginX * rayDirectionX + 2* rayOriginY * rayDirectionY;
    double c = rayOriginX * rayOriginX + rayOriginY * rayOriginY - 1;

    double discriminant = b*b - 4 * a*c;

    if (discriminant > 0){
        //ray intersects
        double root1 = ((-1 * b - sqrt(discriminant)) / 2*a - 0.0001);

        if (root1 > 0){
            return root1; //first root is the smallest positive value
        }
        else{
            double root2 = ((sqrt(discriminant) - b) / 2*a - 0.0001);
            return root2; //the second root is the smallest positive value
        }
    }
    else{
        //ray misses the Cylinder
        return -1;
    }
}
![enter image description here][1]};

1 ответ

  • В методах пересечения лучей моих примитивов я обычно возвращаю структуру, которая включает точку пересечения, нормаль поверхности и форму, которая была поражена, среди прочего. Почему вы возвращаете рут?
  • В своем коде вы говорите, что первый корень является наименьшим положительным значением. Я думаю, что это неправильно. Я бы пробежал несколько тестовых случаев с разными значениями a, b и c, чтобы убедить себя так или иначе.
  • Также, если дискриминант равен 0, существует двойной корень, и луч попадает в цилиндр.
Другие вопросы по тегам