Я пишу программу трассировки лучей для своего класса компьютерной графики. Пока у меня реализованы только сферы и теневой луч. Текущая проблема в том, что когда я перемещаю свою сферу из центра, она растягивается. вот код, который я использую, чтобы вычислить, пересекает ли луч сферу:

bool Sphere::onSphere(Ray r)
{
    float b = (r.dir*2).innerProduct(r.pos + centre*-1);
    float c = (r.pos + centre*-1).innerProduct(r.pos + centre*-1) - radius*radius;
    return b*b - 4*c >= 0;
}

Вот код, который я использую для создания каждого луча:

for(int i = -cam.width/2; i &lt cam.width/2; i++)
    {
        for(int j = -cam.height/2; j &lt cam.height/2; j++)
         {
            float normi = (float)i;
            float normj = (float)j;
            Vector pixlePos = cam.right*normi + cam.up*normj + cam.forward*cam.dist + cam.pos*1;
            Vector direction = pixlePos + cam.pos*-1;
            direction.normalize();
            Vector colour = recursiveRayTrace(Ray(pixlePos, direction), 30, 1, 0);
            float red = colour.getX()/255;
            float green = colour.getY()/255;
            float blue = colour.getZ()/255;
            fwrite (&red, sizeof(float), 1, myFile);
            fwrite (&green, sizeof(float), 1, myFile);
            fwrite (&blue, sizeof(float), 1, myFile);
        }
    }

РекурсивныйRayTrace:

Vector Scene::recursiveRayTrace(Ray r, float maxDist, int maxBounces, int bounces)
{
    if(maxBounces &lt bounces)
        return Vector(0,0,0);
    int count = 0;
    for(int i = 0; i &lt spheres.size(); i++)
    {
        if(spheres.at(i).onSphere(r))
        {
            Vector colour(ambiant.colour);
            for(int j = 0; j &lt lights.size(); j++)
            {
                Vector intersection(r.pos + r.dir*spheres.at(i).getT(r));
                Ray nRay(intersection, lights.at(i).centre + intersection*-1);
                colour = colour + lights.at(i).colour;
        }
        return colour;
        }
    }
    return Vector(0,0,0);
}

Я получаю сферу, которая растягивается в направлении вектора от центра к центру круга. Я не ищу кого-нибудь, чтобы делать мою домашнюю работу. Мне просто очень сложно отладить это. Любые подсказки приветствуются :) Спасибо!

Изменить: cam.dist - это расстояние от камеры до плоскости обзора

0
McAngus 27 Мар 2013 в 12:13

1 ответ

Лучший ответ

Растяжение на самом деле является естественным следствием перспективного просмотра, и оно преувеличивается, если у вас очень широкое поле зрения. Другими словами, перемещение камеры назад от плоскости изображения должно сделать изображение более естественным.

1
user2458399 3 Ноя 2013 в 07:54