2015-12-01 5 views
0

Je travaille sur le lancer de rayon, et j'ai décidé d'utiliser des boîtes de délimitation (bbox alignées par axe) comme des objets (cubes), et de les ombrer. Je suis capable de trouver la bonne valeur t, et le point d'intersection; Cependant, je ne pouvais pas trouver un moyen de calculer la normale de surface puisque je n'ai que ray direction, ray origin, intersection point, et t value, et min-max les valeurs de la bbox.Calcul de la normale de Bbox/Cube

Existe-t-il un moyen de calculer la normale au point d'intersection (ou de décider quelle face du rayon du cube a intersecté) avec l'information que j'ai? J'utilise «un algorithme d'intersection efficace et robuste de Ray-Box» de Williams et al.

Répondre

0

Si vous avez le point d'intersection et le centre AABB (BoundingBox), vous pouvez faire un calcul rapide pour obtenir un index correspondant au visage que vous avez frappé.

Ensuite, avec un tableau qui stocke les normales, vous pouvez obtenir vos données.

Vector3 ComputeNormal(Vector3 inter, Vector3 aabbCenter) 
{ 
    static const Vector3 normals[] = { // A cube has 3 possible orientations 
     Vector3(1,0,0), 
     Vector3(0,1,0), 
     Vector3(0,0,1) 
    }; 
    const Vector3 interRelative = inter - aabbCenter; 
    const float xyCoef = interRelative.y/interRelative.x; 
    const float zyCoef = interRelative.y/interRelative.z; 

    const int coef = (isBetweenInclusive<1,-1>(xyCoef) ? 1 : 
         (isBetweenExclusive<1,-1>(zyCoef) ? 2 : 0)); 
    // Here it's exclusive to avoid coef to be 3 
    return normals[coef] * SIGN(interRelative); // The sign he is used to know direction of the normal 
} 

Je ne l'ai pas testé donc ne soyez pas surpris si cela ne fonctionne pas directement;) mais il devrait faire l'affaire.