[C++] Texture Mapping Cilindro

Messaggioda cyrus » 27/11/2019, 18:43

Buonasera, devo effettuare il texture mapping del cilindro, ho applicato correttamente le formule per calcolare i punti u, v, a partire dal punto d'intersezione del cilindro, però non ottengo un texture mapping corretto, l'immagine risulta completamente distorta.Il codice per calcolare l'intersezione con il cilindro e i punti u,v è il seguente:
Codice:
bool cylinder::hit(const ray& ray, float t_min, float t_max, hit_record& rec) const {
   
   float temp;
   float ox = ray.o.x;
   float oy = ray.o.y;
   float oz = ray.o.z;
   float dx = ray.d.x;
   float dy = ray.d.y;
   float dz = ray.d.z;

   float a = dx * dx + dz * dz;
   float b = 2.0f * (ox * dx + oz * dz);
   float c = ox * ox + oz * oz - radius * radius;
   float disc = b * b - 4.0f * a * c;

   if (disc < 0.0)
      return(false);
   else {
      float e = sqrt(disc);
      float denom = 2.0f * a;
      temp = (-b - e) / denom;    // smaller root

      if (temp < t_max && temp > t_min) {
         float yhit = oy + temp * dy;

         if (yhit > y0 && yhit < y1) {
            rec.t = temp;
            rec.normal = normalize(vector3D((ox + temp * dx) * inv_radius, 0.0f, (oz + temp * dz) * inv_radius));
            rec.p = ray.point_at_parameter(rec.t);
            float phi = (atan(rec.p.x / rec.p.z));
            rec.u = phi / (2 * 3.14);
            rec.v = (rec.p.y + 1) / 2;
            //rec.m = mat;
            
            // test for hitting from inside
            if (dot(-ray.d, rec.normal) < 0.0f)
               rec.normal = -rec.normal;
            
            return (true);
         }
      }

      temp = (-b + e) / denom;    // larger root
      
      if (temp < t_max && temp > t_min) {
         float yhit = oy + temp * dy;

         if (yhit > y0 && yhit < y1) {
            rec.t = temp;
            rec.normal = normalize(vector3D((ox + temp * dx) * inv_radius, 0.0f, (oz + temp * dz) * inv_radius));
            rec.p = ray.point_at_parameter(rec.t);
            
            float phi = (atan(rec.p.x / rec.p.z));
            rec.u = phi / (2 * 3.14);
            rec.v = (rec.p.y + 1) / 2;
            //rec.m = mat;

            // test for hitting inside surface
            if (dot(-ray.d, rec.normal) < 0.0f)
               rec.normal = -rec.normal;

            return (true);
         }
      }
   }
   
   return (false);
}

Questo è il codice relativo alla texture:
Codice:
color image_texture::value(float u, float v, const point3D& p) const {
   
   int i = (1.0f-u)*float(imageWidth);
   int j = (v)*imageHeight - 0.001f;
   if (i < 0) i = 0;
   if (j < 0) j = 0;
   if (i > imageWidth - 1) i = imageWidth - 1;
   if (j > imageHeight - 1) j = imageHeight - 1;

   Uint32 value = getpixel(surface, i, j);

   float red = float((value >> 16) & 0xff) / 255.0f;
   float green = float((value >> 8) & 0xff) / 255.0f;
   float blue = float(value & 0xff) / 255.0f;

   return color(blue, green, red);
}



Non riesco a capire dove sia il problema.

Moderatore: Raptorista

Ho messo il codice nell'ambiente appropriato.
cyrus
Junior Member
Junior Member
 
Messaggio: 53 di 162
Iscritto il: 16/07/2016, 14:53

Re: [C++] Texture Mapping Cilindro

Messaggioda apatriarca » 28/11/2019, 20:21

Sarebbe utile vedere una immagine del risultato in modo da capire meglio che cosa intendi con "immagine distorta" e cercare l'errore in modo più mirato. Non vedo inoltre il codice che calcola le coordinate (u, v) ed è la parte del codice che più facilmente è sbagliata se la texture appare distorta.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5327 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite