Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SFML Discussion :

Perspective pour du floor casting


Sujet :

SFML

  1. #1
    Nouveau membre du Club
    Perspective pour du floor casting
    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.. :-)

  2. #2
    Expert éminent sénior
    Tu sembles être confronté précisément à ce problème: Affine texture mapping

    Si j'ai bien compris le truc, c'est comme si tu avais chacun de tes deux triangles en affichés avec une déformation qui simule une perspective cavalière (tu noteras que les lignes parallèles restent parallèles) au lieu d'une vraie perspective (où les lignes parallèles cessent de l'être, à moins qu'elles aient une "profondeur" constante).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau membre du Club
    Salut à toi Médinoc !

    Merci beaucoup pour ce mot clef, je ne connaissais pas ! Je vais aller faire des recherches là dessus, tu aurais quant à toi, une éventuelle idée de la correction que je pourrais appliquer ? ( Je te demande à toi et je vais faire mes recherches de mon côté de manière à doubler mes chances ! :-) )

    Encore merci pour l'éclaircissement!

###raw>template_hook.ano_emploi###