IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Langage Delphi Discussion :

manipuler des textures


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut manipuler des textures
    Bonjour,

    Je suis en train de programmer un petit moteur graphique. Je gère des textures (qui sont des .bmp), que j'affiche sur le canvas de la form. Ma texture est carré et je voudrais l'appliquer sur des cases qui ne sont pas forcément carré. Une case étant représenter par 4 pts avec leurs coord 2d, comment faire pour 'stretcher' ma texture entre ses 4 coord?

    J'ai bien une idée:

    [code]

    pré requis: pt1 en bas à droite
    pt2 en bas à gauche
    pt3 en haut à gauche
    pt4 en haut à droite

    je calcul l'équation de pt1-pt2
    je calcul l'équation de pt3-pt4
    je calcul mon coeff de grandeur (la diff de longueur entre mes deux droite).

    je me met au pt3, je trace la colonne des couleurs de ma texture (la ligne de gauche, de haut en bas) jusqu'a pt2, bien sur, en restant parrallèle à pt2_pt3.Chacune des ces opérations est pondéreées par des coeff, pt2-pt3 n'étant pas forcément parallèle et égale à pt4-pt1...

    Bref, je sais pas si je suis clair. Cette méthode me semble bonne (avec scanlines) mais trés longue et trés fastidieuse.

    De plus, je ne peux pas installer de composants ou de paquets car mon delphi bug... Je dois faire une fonction qui me renvoie la nouvelle image.

    Personne n'a un bout de code? ou une version plus simple que mon idée...

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Le sujet est intéressant. Par contre je ne vois pas bien l'intérêt d'une telle usine à gaz.

    En principe une texture est un motif sensé être répétitif. Donc pourquoi se casser la tête à vouloir le "stretcher" pour l'appliquer à des cases qui ne forment pas forcément un carré.

    Si le bitMap-texture est plus grand que l'ensemble de cases-cibles, il suffit de transférer les pixels de la source vers la cible dans la zone de recouvrement.
    Dans le cas inverse (bitMap-texture-carré de taille plus petite que la cible) ben on crée un BitMap-texture-temporaire de taille plus grande que la cible pour se re-placer dans le cas précedent et on procède au décalcage.

    Comme tes cases cibles peuvent être mémorisées dans un array of tPoint qui forme donc un polygone, lors de l'utilisation de ScanLines il suffit de faire un "if MonPointCourant est à l'intérieur du polygone alors je décalque sinon je passe au point suivant".

    Tiens pour commencer voiçi un bout de code pour cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function PointDansPolygone(const x,y : integer; Polygone : array of TPoint): boolean;
    //       Renvoie True si le point x,y est à l'intérieur du Polygone de points
    var      Handle : HRGN;
    begin    Handle := CreatePolygonRgn(Polygone[0],length(Polygone),Winding);
             Result := PtInRegion(Handle,X,Y);
             DeleteObject(Handle);
    end;
    Cette fonction marche même si tu prends 4 points formant un noeud-papillon au lieu d'un carré ou d'un trapèze ... et même si l'array of TPoint est par exemple un truc aussi tordu que peut l'être une courbe de Bézier fermée qui reboucle sur elle-même.

    A+.

  3. #3
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    merci de ta rép.

    Si j'ai bien compris, tu ne fais que 'regarder ' la texture au travers de la fenetre former par ma case... Si c'est cela, ce n'ai pas ce que je veux faire.

    En fait, ma texture représente une case quand elle est à 'plat' mais je génère des collines où il y a déplacement aléatoire des 4 points d'une case. Il faut donc que la texture soit stretcher pour avoir un beau rendu, non?

  4. #4
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut rep
    voila un exemple
    Images attachées Images attachées  

  5. #5
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Salut

    En fait il faut projeter ta texture sur ta forme. Je te conseille d'aller voir les tutoriel DirectX ou openGL.
    Mieux encore utilise OpenGL ou DirectX pour le faire.

  6. #6
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    je ne peux malheureusement installer ni opengl ni directx, mon delphi ne peut installer de composants. Je dois donc tout coder à la main.

    Je sais que le moteur que je veux faire (style caesar) est faisable en deux deux sur opengl ou directx mais jpeux pas....

    pour mes textures, je touche là le point sensible de mon programme;
    en effet, c'est une projection sur le plan de ma case que je souhaite faire.

    Je pense détenir la solution (voir plus haut) mais c'est trés compliqué, trés long à mettre en oeuvre. J'ai de la chance, je ne suis pas faire ce calcul en temps réel.

    Je pensais que peut-être quelqu'un aurais une idée plus courte, ou aurais déjà réfléchi à un tel pblme.

    Merci de ta rép Gouyon.

  7. #7
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 022
    Points
    7 022
    Par défaut
    Citation Envoyé par Darkyl Voir le message
    je ne peux malheureusement installer ni opengl ni directx, mon delphi ne peut installer de composants. Je dois donc tout coder à la main.
    C'est pas des composants, c'est des bibliothèques (des DLL et autre sources *.pas).
    Donc, dans ton code, un simple ajout dans tes uses, et c'est bon.


  8. #8
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    merci lung de ta réponse.
    A chaque fois que j'ai téléhargé opengl ou directx (ou quoique ce soit d'autres), il y a un package delphi et je ne peux pas l' ajouter. il me dis des erreurs.par contre s'il était possible d'avoir uniquement le .pas qui m'interesse, je devrais pouvoir le mettre dans mon dossier projet, et l'utiliser dans mon projet...

    Pas moyen d'installer des package et les unit fonctionnant souvent entre elles, impossible d'utiliser une seul sans les installer (copier) toutes.

    Si quelqu'un à la unit qui m'interesse, c'est-a-dire la procedure qui affiche une texture entre les point1,2,3,4... je suis preneur.

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pas besoin de composants pour opengl, c'est un uses qu'il te suffit de rajouter dans tes unités.

    un bon cours ici sinon il y a le site de nehe où il y a pas mal d'exemple.

  10. #10
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 022
    Points
    7 022
    Par défaut
    Citation Envoyé par Rayek Voir le message
    un bon cours ici sinon il y a le site de nehe où il y a pas mal d'exemple.
    Le lien pour télécharger le tutoriel est mort :
    ftp://ftp-developpez.com/nomdomaine/fichiers/opengl.zip

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Lung Voir le message
    Le lien pour télécharger le tutoriel est mort :
    ftp://ftp-developpez.com/nomdomaine/fichiers/opengl.zip
    Oui, on est au courant mais on arrive pas à joindre l'auteur, sinon il reste en version html

  12. #12
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    je vous remercie de vos réponses.

    Je compter sur une solution du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    procedure affichetexture(pt1,pt2,pt3,pt4,texture.bmp);
     
    //mettre la bibliothèque machin en uses
    mais cela aurait été trops simple. J'ai fait entièrement mon moteur graphique à la main, génération du terrain, affichage des batiments, des routes ou ttes objets, déplacement des perso, animation dans le décors. Le seul truc qu'il me manquait était de pouvoir afficher une texture (de l'herbe par ex) sur les cases de la map...juste ça. Mais bon, s'il faut apprendre opengl pour ça, je vais m'y mettre.

    C'est que cela fait 2 ans que je bosse la-dessus. J'ai voulu rajouter un terrain plus nivelé (en 3d) sans prédéfinir les pentes, et cela complique tous.

    Je vous remercie. Je pense que je reposterai trés vite.. Opengl étant relativement compliqué quand on est issue de Turbo Pascal et qu'on a fait son jeu avec uniquement ce qu'offrait Delphi 1.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/04/2008, 10h16
  2. Manipuler des dates...
    Par Ti Jen-tsie dans le forum Langage
    Réponses: 4
    Dernier message: 26/06/2003, 11h46
  3. Manipulation des handle contexte
    Par rockbiker dans le forum DirectX
    Réponses: 1
    Dernier message: 09/05/2003, 18h51
  4. appliquer des textures de taille 2n+1
    Par Katsuo chris dans le forum DirectX
    Réponses: 4
    Dernier message: 14/11/2002, 00h11
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo