Salut à tous :-]

En ce moment, je suis en train de procéder au développement d'un petit système de FloorCasting, technique qui consiste à projeter un sol en fausse 3D qui s'oriente donc en fonction de l'angle de la caméra ainsi qu de sa position :

https://gyazo.com/1a7a7de5fe1c1557c56930751b8a88f7

Comme vous pouvez le constater, il y a une déformation au niveau de la texture ( autrement-dit du carré projeté, car la texture est parfaitement reliée aux 4 points formant le carré, donc ce n'est pas un problème de texturage mais bien de perspective et donc, de calcul ).

J'aimerais comprendre pourquoi j'ai cette déformation alors que je procède comme suit :

-Je compare la distance entre le point de la caméra et chacun des 4 points puis je procède à la projection en affichant proportionnellement les 4 points vis à vis de l'angle de la caméra et de la position sur l'écran de rendu. ( propWidth / heightWidth ).

Voici comment je procède :

https://image.noelshack.com/fichiers...6-probleme.png

Et la fonction concernée :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        for (unsigned int t = 0 ; t < m_vecBox.size() ; t++)
        {
            for (unsigned int i = 0 ; i < 4 ; i++)
            {
            float d = atan2(m_vecBox[t][i].position.y-m_position.y,
                            m_vecBox[t][i].position.x-m_position.x) * 180/PI;
 
            if (d<0) d+= 360;
 
            float k = (d-m_angle)+m_fov/2;
 
            if (k<0) k+= 360;
 
            float distance = sqrt((m_position.x-m_vecBox[t][i].position.x)*(m_position.x-m_vecBox[t][i].position.x)+
                                  (m_position.y-m_vecBox[t][i].position.y)*(m_position.y-m_vecBox[t][i].position.y));
 
            float propWidth = (k/m_fov)*WIDTHSCREEN;
            float propHeight = 4000/((distance/1000)*HEIGHTSCREEN/2);
 
            if (propWidth>(360/m_fov)*WIDTHSCREEN/2)
                propWidth-=(360/m_fov)*WIDTHSCREEN;
 
            m_renderBox[i].position = {propWidth, propHeight+HEIGHTSCREEN/2};
 
            if (propWidth>-200 && propWidth<1000 && propHeight<300)
                m_renderWindow.draw(m_renderBox, &m_textureGround);
            }
        }
Le problème, j'en suis persuadé, vient du calcul de la distance au même titre que le problème de eye fishing que l'on peut rencontrer avec la technique du raycasting, sauf que là, je ne peux pas corriger ce défaut de perspective de la même manière qu'un programme en raycasting ( multiplier la distance par le cosinus de l'angle ) car il n'y a pas de projection de rayons dans cette fonction, tout est géré uniquement des angles & des distances..

Pourquoi cette déformation de perspective ? Merci infiniment de bien vouloir m'aider.. :-)