2013-03-27 1 views
0

Je suis en train d'écrire un programme ray tracer pour mon cours d'infographie. Jusqu'à présent, j'ai seulement des sphères implémentées et un rayon d'ombre. Le problème actuel est que lorsque je déplace ma sphère hors du centre, elle s'étire. voici le code que j'utilise pour calculer si un rayon est intersecte une sphère:Les objets ray tracer s'étirent quand ils sont décentrés

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; 
} 

ici est le code que j'utilise pour se reproduire chaque rayon:

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); 
     } 
    } 

recursiveRayTrace:

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); 
} 

Ce que je reçois est une sphère qui est étirée dans la direction du vecteur du centre au centre du cercle. Je ne cherche personne pour faire mes devoirs. J'ai juste du mal à débugger ça. Tous les indices sont appréciés :) Merci!

Edit: cam.dist est la distance de la caméra au plan de vue

Répondre

1

Le stretching est en fait une conséquence naturelle de la visualisation en perspective et il est exagéré si vous avez un champ de vision très large. En d'autres termes, déplacer la caméra de votre plan image devrait la rendre plus naturelle.

Questions connexes