Lancer de rayons dans un espace 3D pour affichage

a marqué ce sujet comme résolu.

Bonjour,

Je n’arrive toujours pas à assimiler le concept de lancer de rayons, j’ai la base pour lancer des rayons à partir d’un point de fuite à coup de vecteur forward puis détecter la collision de point dans l’espace avec les rayons, mais je bloque sur l’affichage.

(C#)

 
for (var Pitch = -50F; Pitch < 50; Pitch += 1)
{
    for (var Yaw = -50F; Yaw < 50; Yaw += 1)
    {
        var Dot = Vector.GetForwardVector(new Rotator(Pitch, Yaw, 0));
 
        for (var RayDepth = 0; RayDepth < 25; RayDepth += 1)
        {
            var Ray = Dot * RayDepth;
 
            var IndexDot = Universe.GetIndex(Ray);
            if (IndexDot != -1)
            {
                if (Universe.Data[(Int32)IndexDot] != 0)
                {
                    var IndexPixel = Screen.GetIndex(???);
                    if (IndexPixel != -1)
                    {
                        Screen.Data[IndexPixel] = Universe.Data[(Int32)IndexDot];
                    }
 
                    RayDepth = 51;
                }
            }
        }
    }
}

Et je me demande ce que je dois mettre dans Screen.GetIndex(???), cette méthode calcule l’index de l’écran 1D par rapport à une coordonne 2D écran donner.

Je dois surement modéliser un écran dans mon espace 3D "Universe" mais là aussi je bloque.

Image utilisateur
Image utilisateur

Salut,

En effet une des premières choses à faire va être de placer ton écran dans l’espaces. Actuellement de ce que je comprends de ton code la caméra se retrouve être positionnée au milieu de l’écran et donc ne peut pas te permettre de voir quoi que ce soit (si tu colles ton œil à la télé, tu ne peux plus la voir).

Si tu souhaites conserver la caméra à l’origine du repère il va donc falloir positionner l’écran. Tu peux le faire facilement à l’aide trois vecteurs (ou deux au minimum).

  • Le premier serait le vecteur entre ta caméra et le centre de ton écran (actuellement tu as (0, 0, 0)), ce serait un vecteur normal au plan de l’écran et c’est lui qui servirait de base pour le lancer de rayons.
  • Les deux autres vecteurs définiraient le repère 2D sur l’écran (actuellement tu as (1, 0, 0) et (0, 1, 0) ce qui peut très bien convenir). Sachant que l’un peut-être déduit de l’autre suivant comment tu veux les définir. Ils peuvent aussi être définis à partir du vecteur de direction et d’un angle.

Ensuite je ne comprends pas bien ce que représente ton RayDepth. En raytracing un rayon n’a pas spécialement de profondeur, il est plus ou moins infini. Le tout est de savoir ce qu’il est susceptible d’intercepter quelque chose.
Un algorithme naïf est donc de tester toutes les formes présentes dans ton univers pour savoir si le rayon intercepte l’une d’elle.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte