Aller au menu - Aller au contenu
Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !

Irrlicht

Problème dans le tuto

Pour accéder à cette section
Connectez-vous !
connexion_rpx

Résolu Le problème de ce sujet a été résolu

Page 1 
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1 
Hors ligne sylvainmahe # Posté le 31/03/2010 à 21:16:07
Groupe : Bannis

Bonjour,

Dans ce tuto: http://www.siteduzero.com/tutoriel-3-5594-les-images.html
J'ai actuelement un problème pour récuperer la taille de mon image.

Quand j'execute ce code:
Code : C++
 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
29
30
31
32
33
34
35
36
37
38
39
#include <IRR/irrlicht.h>

 
int main(void)
{
    irr::IrrlichtDevice* device = irr::createDevice(
        irr::video::EDT_OPENGL,
        irr::core::dimension2d<u32>(640,480),32);
    irr::video::IVideoDriver* driver = device->getVideoDriver ();
    irr::scene::ISceneManager *sceneManager = device->getSceneManager ();
 
    irr::video::ITexture *image = driver->getTexture("image.jpg");  // chargement image
    irr::core::dimension2d<irr::s32> taille = image->getSize ();     // recuperation dimensions image
 
    irr::core::position2d<irr::s32> position0;                        // creation position origine
    position0.X = 0;
    position0.Y = 0;
    irr::core::position2d<irr::s32> position1;                        // creation position coin
    position1.X = taille.Width;                                       // bas droit du rectangle
    position1.Y = taille.Height;
    irr::core::rect<irr::s32> rectangle;                              // creation rectangle
    rectangle.UpperLeftCorner = position0;                            // contenant l'image
    rectangle.LowerRightCorner = position1;
 
    while(device->run ())                                             // boucle de rendu
    {
      driver->beginScene(true, true,
          irr::video::SColor (0,120,120,120));
      driver->draw2DImage(image,                                      // dessin de l'image
          position0,                                                  // a la position origine
          rectangle,                                                  // dans le rectangle cree au dessus
          0,
          irr::video::SColor (255,255,255,255),
          true);
       driver->endScene ();
    }
    device->drop ();
    return 0;
}


Le compilateur m'indique une erreur ici:
irr::core::dimension2d<u32>(640,480),32);

et il dit:
`u32' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)

De même la fonction pour récuperer les dimensions de l'image n'as jamais fonctionné une seule fois!
main.cpp conversion from `const irr::core::dimension2d<irr::u32>' to non-scalar type `irr::core::dimension2d<irr::s32>' requested

Comment faire?
C'est la copie conforme du tutorial mais ca ne veux pas compiler?
Édité le 31/03/2010 à 21:57:57 par sylvainmahe
Publicité # Posté le 31/03/2010 à 21:16:07

Hors ligne OSasuke # Posté le 31/03/2010 à 21:29:09
Avatar
Flux RSS

Le problème c'est que t'a version et celle du tuto ne sont pas les mêmes peut-être. :p

Édité le 31/03/2010 à 21:40:50 par OSasuke

Image utilisateur
 
Hors ligne bluelink # Posté le 31/03/2010 à 21:31:38
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

Citation : sylvafilms
Le compilateur m'indique une erreur ici:
irr::core::dimension2d<u32>(640,480),32);

et il dit:
`u32' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)

t'as oublier le namespace irr:: avant u32

Citation : sylvafilms
De même la fonction pour récuperer les dimensions de l'image n'as jamais fonctionné une seule fois!
main.cpp conversion from `const irr::core::dimension2d<irr::u32>' to non-scalar type `irr::core::dimension2d<irr::s32>' requested

remplace irr::u32 par irr::s32 à la ligne 8, cette erreur est due au fait que suivant la version d'irrlicht, on utilise u32 ou s32 pour donne sa taille à la fenêtre.

Edit : grillé :p
Édité le 31/03/2010 à 21:32:09 par bluelink

Image utilisateur
 
Hors ligne OSasuke # Posté le 31/03/2010 à 21:37:29
Avatar
Flux RSS

Je crois qu'il a bien mis irr::u32 dans son premier code !

Image utilisateur
 
Hors ligne bluelink # Posté le 31/03/2010 à 21:41:19
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

Dans le code oui, mais là non :
Citation : sylvafilms
Le compilateur m'indique une erreur ici:
irr::core::dimension2d<u32>(640,480),32);

Donc je préfère préciser.

Image utilisateur
 
Hors ligne sylvainmahe # Posté le 31/03/2010 à 21:51:46
Groupe : Bannis

Ok, merci, j'avais remplacé tous les s par u et ca m'indiquait une autre erreur...
Je vais réésayer.

edit:
Mais quel boulet en plus je ne vous donne pas le bon code la haut, attendez :-°

Voila donc u ou s, ca ne change rien, impossible de compiler ce code:
Code : C++
 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
29
30
31
32
33
34
35
36
37
38
39
#include <IRR/irrlicht.h>

 
int main(void)
{
    irr::IrrlichtDevice* device = irr::createDevice(
        irr::video::EDT_OPENGL,
        irr::core::dimension2d<u32>(640,480),32);
    irr::video::IVideoDriver* driver = device->getVideoDriver ();
    irr::scene::ISceneManager *sceneManager = device->getSceneManager ();
 
    irr::video::ITexture *image = driver->getTexture("image.jpg");  // chargement image
    irr::core::dimension2d<irr::u32> taille = image->getSize ();     // recuperation dimensions image
 
    irr::core::position2d<irr::u32> position0;                        // creation position origine
    position0.X = 0;
    position0.Y = 0;
    irr::core::position2d<irr::u32> position1;                        // creation position coin
    position1.X = taille.Width;                                       // bas droit du rectangle
    position1.Y = taille.Height;
    irr::core::rect<irr::u32> rectangle;                              // creation rectangle
    rectangle.UpperLeftCorner = position0;                            // contenant l'image
    rectangle.LowerRightCorner = position1;
 
    while(device->run ())                                             // boucle de rendu
    {
      driver->beginScene(true, true,
          irr::video::SColor (0,120,120,120));
      driver->draw2DImage(image,                                      // dessin de l'image
          position0,                                                  // a la position origine
          rectangle,                                                  // dans le rectangle cree au dessus
          0,
          irr::video::SColor (255,255,255,255),
          true);
       driver->endScene ();
    }
    device->drop ();
    return 0;
}


`u32' undeclared (first use this function)
no matching function for call to `irr::video::IVideoDriver::draw2DImage(irr::video::ITexture*&, irr::core::vector2d<irr::u32>&, irr::core::rect<irr::u32>&, int, irr::video::SColor, bool)'
note C:\Dev-Cpp\mingw32\include\IRR\IVideoDriver.h:737 candidates are: virtual void irr::video::IVideoDriver::draw2DImage(const irr::video::ITexture*, const irr::core::vector2d<irr::s32>&)

edit:
Autre chose, dans sont tuto on ne peux pas quitter le programme puisque on controle la camera avec la souris, je suis sous windows xp et je suis obligé de faire un ctrl alt sup à chaque fois! Vous allez me dire, c'est peut être normal je ne suis pas encore rendu aux évenements, mais quand même, c'est galère de devoir quitter en faisant crasher le programme à chaque fois.
Édité le 31/03/2010 à 22:05:30 par sylvainmahe
Hors ligne bluelink # Posté le 31/03/2010 à 23:44:26
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

Citation
`u32' undeclared (first use this function)

T'as encore oublier le "irr::"
'u32' undeclared veux dire que ton compilateur ne connait pas le type u32, hors c'est tout a fait normal puisque le type complet est irr::u32.

Citation
Autre chose, dans sont tuto on ne peux pas quitter le programme puisque on controle la camera avec la souris, je suis sous windows xp et je suis obligé de faire un ctrl alt sup à chaque fois! Vous allez me dire, c'est peut être normal je ne suis pas encore rendu aux évenements, mais quand même, c'est galère de devoir quitter en faisant crasher le programme à chaque fois.

Alt + F4 marche très bien normalement.

Image utilisateur
 
Hors ligne sylvainmahe # Posté le 01/04/2010 à 00:02:38
Groupe : Bannis

Ok merci, enfin ce n'est pas moi qui as oublié puisque c'est une copie du code proposé dans le tuto, j'ai juste changé image.jpg.

Sinon, dans ce code:
Code : C++
 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <IRR/irrlicht.h>

int main(void)
{
    irr::IrrlichtDevice *device = irr::createDevice (irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(800, 600), 32, false, true, false, 0);
    
    irr::video::IVideoDriver* driver = device->getVideoDriver();
    
    irr::scene::ISceneManager *sceneManager = device->getSceneManager();
    sceneManager->addCameraSceneNode (0, irr::core::vector3df (0, 0, 0), irr::core::vector3df (5, 0, 0));
    
    device->getCursorControl()->setVisible (false);
    
    irr::scene::IAnimatedMesh *modele = sceneManager->getMesh ("sydney.md2");
    
    irr::scene::IAnimatedMeshSceneNode *Nmodele = sceneManager->addAnimatedMeshSceneNode (modele);
    
    Nmodele->setMaterialFlag (irr::video::EMF_LIGHTING, false);
    Nmodele->setMaterialTexture (0, driver->getTexture ("sydney.bmp"));
    
    Nmodele->setMaterialFlag (irr::video::EMF_LIGHTING, true);
    
    Nmodele->setFrameLoop (1, 310);
    
    irr::scene::ICameraSceneNode *camera = sceneManager->addCameraSceneNodeFPS (0, 100.0f, 0.1f, 0, 0, 0, false);
    camera->setPosition (irr::core::vector3df (10.0, 50.0, -50.0));
    
    // Chargement d'une image
    irr::video::ITexture *image = driver->getTexture ("image.jpg");
    
    // Récupération de la taille de l'image
    irr::core::dimension2d<irr::u32> taille = image->getSize();
    
    // Position de l'image
    irr::core::position2d<irr::u32> position0;
    position0.X = 0;
    position0.Y = 0;
    irr::core::position2d<irr::u32> position1;
    position1.X = taille.Width;
    position1.Y = taille.Height;
    irr::core::rect<irr::u32> rectangle;
    rectangle.UpperLeftCorner = position0;
    rectangle.LowerRightCorner = position1;
    
    // Création d'une lumière omnidirectionelle
    sceneManager->addLightSceneNode (0, irr::core::vector3df (100, 100, 200), irr::video::SColorf (0.6f, 0.6f, 0.6f, 0.0f), 1000.0f);
    
    
    // Dessin de la scène et affichage
    while(device->run())
    {
        // Dessiner la scène
        driver->beginScene (true, true, irr::video::SColor (0, 200, 200, 200));
        
        
        // Dessiner l'image
        driver->draw2DImage (image, position0, rectangle, 0, irr::video::SColor (255, 255, 255, 255), true);
        //driver->draw2DImage (image, irr::core::position2d<irr::s32> (0, 0), irr::core::rect<irr::s32> (0, 0, 200, 100), 0, irr::video::SColor (255, 255, 255, 255), true);
        
        sceneManager->drawAll();
        driver->endScene();
    }
    
    // Déchargement de la mémoire
    device->drop();
}


Dans // Dessiner l'image
Dans la boucle, je ne peux pas utiliser cette technique:
Code : C++
1
driver->draw2DImage (image, position0, rectangle, 0, irr::video::SColor (255, 255, 255, 255), true);

Ca retourne les erreurs:
71 D:\Programmes\C++\irr\irr main.cpp no matching function for call to `irr::video::IVideoDriver::draw2DImage(irr::video::ITexture*&, irr::core::vector2d<irr::u32>&, irr::core::rect<irr::u32>&, int, irr::video::SColor, bool)'

note C:\Dev-Cpp\mingw32\include\IRR\IVideoDriver.h:737 candidates are: virtual void irr::video::IVideoDriver::draw2DImage(const irr::video::ITexture*, const irr::core::vector2d<irr::s32>&)

note C:\Dev-Cpp\mingw32\include\IRR\IVideoDriver.h:737 virtual void irr::video::IVideoDriver::draw2DImage(const irr::video::ITexture*, const irr::core::vector2d<irr::s32>&, const irr::core::rect<irr::s32>&, const irr::core::rect<irr::s32>*, irr::video::SColor, bool)

note C:\Dev-Cpp\mingw32\include\IRR\IVideoDriver.h:737 virtual void irr::video::IVideoDriver::draw2DImage(const irr::video::ITexture*, const irr::core::rect<irr::s32>&, const irr::core::rect<irr::s32>&, const irr::core::rect<irr::s32>*, const irr::video::SColor*, bool)

D:\Programmes\C++\irr\Makefile.win [Build Error] ["irr main.o"] Error 1


Par contre:
Code : C++
1
driver->draw2DImage (image, irr::core::position2d<irr::s32> (0, 0), irr::core::rect<irr::s32> (0, 0, 200, 100), 0, irr::video::SColor (255, 255, 255, 255), true);

Fonctionne très bien, mais comme je ne veux pas indiquer à chaque fois les dimensions de mes images je souhaite utiliser la méthode qui permet de récuperer les dimensions, pourquoi cela donne ses erreurs?
Hors ligne catkiller # Posté le 01/04/2010 à 00:07:57
Une 'tite sieste d'1h60 ?
Avatar

Personnellement J'ai le même problème. C'est un problème de version (ou l'auteur qui a très mal fait son travail mais ça m'étonnerais).
Dans le code du tuto, ça plante comme tu l'as décrit. Si on change les types ne correspondent plus (je sais plus où) et si on change aussi l'autre, on le même problème avec une autre fonction.
Résultat, trois solutions :
_Sois t'es un dieu de la prog et tu modifies et recompiles Irrlicht, mais dans ce cas tu ne serais pas là
_Sois tu reviens à la version du tuto (1.5. des poussières, je sais plus exactement), ce que je trouve dommage.
_Sois tu te sers des tutos des développeurs. Si tu les trouves en Français tant mieux, mais il y a de fortes chances pour que tu doives travailler un peu ton anglais.
Personnellement je prefere la troisieme solution

A Arles on marche tranquille, à Fourques on travaille tranquille : dans l'atelier y'a que le bois qui travaille
 
Hors ligne bluelink # Posté le 01/04/2010 à 17:41:39
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

J'ai reporté l'erreur du u32 sans irr::, elle devrait être corrigé prochainement.
Par contre la version la plus récente d'Irrlicht utilise bien u32 pour déclarer les dimensions de la fenêtre (c'est d'ailleurs plus logique).
Donc si tu dois écrire s32, c'est ta version la plus vieille, le tutoriel est à jour de ce côté là. ;)

Image utilisateur
 
Hors ligne sylvainmahe # Posté le 01/04/2010 à 21:46:19
Groupe : Bannis

Ok merci pour vos réponses.

J'utilise bien la derniere version de la bibliothèque, pouvez vous me dire comment ce fait t'il dans mon dernier post que ce code ne fonctionne pas si j'utilise u ou s s'il vous plait?
Code : C++
1
driver->draw2DImage (image, position0, rectangle, 0, irr::video::SColor (255, 255, 255, 255), true);

C'est quand même curieux c'est la copie conforme du tuto mais si toi @bluelink tu dit que ca fonctionne?
Moi ca me met toutes les erreurs cités plus haut, tout le reste du tuto avant cette partie qui nous montre comment récup la taille d'une image fonctionne.
Édité le 01/04/2010 à 21:47:11 par sylvainmahe
Hors ligne bluelink # Posté le 01/04/2010 à 22:06:41
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

Tu les as lu les erreurs ? c'est quand même assez explicite :
no matching function for call to `irr::video::IVideoDriver::draw2DImage(irr::video::ITexture*&, irr::core::vector2d<irr::u32>&, irr::core::rect<irr::u32>&, int, irr::video::SColor, bool)'
candidates are: virtual void irr::video::IVideoDriver::draw2DImage(const irr::video::ITexture*, const irr::core::vector2d<irr::s32>&)
virtual void irr::video::IVideoDriver::draw2DImage(const irr::video::ITexture*, const irr::core::vector2d<irr::s32>&, const irr::core::rect<irr::s32>&, const irr::core::rect<irr::s32>*, irr::video::SColor, bool)
virtual void irr::video::IVideoDriver::draw2DImage(const irr::video::ITexture*, const irr::core::rect<irr::s32>&, const irr::core::rect<irr::s32>&, const irr::core::rect<irr::s32>*, const irr::video::SColor*, bool)
Ca signifie que la fonction que tu essaye d'utiliser existe pas. A la place utilise une des trois qu'il te propose après "candidates are :"
Là tu compare bien et tu vois que l'erreur se trouve au quatrième paramètre, tu lui envoi un int à la place d'un rect<s32>
Edit : Oups, j'ai lu un peu trop vite :-°

Là tu compare bien et tu vois que l'erreur vient du fait que tu lui envois toujours des u32 pour le deuxième et le troisième paramètre.

Et quand tu dis dernière version, c'est laquelle exactement ? 1.7.1 ? trunk du SVN ?
Édité le 01/04/2010 à 22:11:56 par bluelink

Image utilisateur
 
Hors ligne sylvainmahe # Posté le 01/04/2010 à 22:19:22
Groupe : Bannis

Je lui envois ce qu'il y a dans le tuto!

Et sinon pour les erreur, je ne vois que des lettres et des chiffres partout sans rien comprendre...

La version c'est la derniere sur le site d'irrlicht: irrlicht-1.7.1
trunk du SVN? Euh, ca veux dire quoi? :o
Édité le 01/04/2010 à 22:19:49 par sylvainmahe
Hors ligne bluelink # Posté le 01/04/2010 à 22:30:30
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

les erreurs, c'est pas très compliqué, c'est de l'anglais :
"no matching function for call" = "pas de fonction avec ce prototype" et là il te sort le prototype de la fonction que tu essaie d'appeler.
"candidates are :" = "par contre, y'a bien celles-ci :" et là il te sort celles qui s'appellent pareil et qui fonctionnent.

Pour la version, tu dois te tromper, la version 1.7.1 prends bien des u32 à la création de la fenêtre et des s32 pour Draw2DImage.
Donc je te conseille vivement de mettre à jour à la dernière version, les codes donnés dans le tuto marcheront, ceci dis c'est pas pour ça qu'il faut les recopier bêtement ;)

Pour le trunk du SVN, c'est la version sur laquelle travaille les développeurs d'irrlicht, en la compilant toi même, ça te permet d'avoir la version la plus à jour possible (1.8 actuellement par exemple), mais t'en as pas besoin dans l'immédiat :)

Image utilisateur
 
Hors ligne sylvainmahe # Posté le 01/04/2010 à 22:33:36
Groupe : Bannis

Dès que je met s pour ca ca ne veux plus du tout compiler:
Code : C++
1
irr::core::dimension2d<irr::s32> taille = image->getSize();
Hors ligne bluelink # Posté le 01/04/2010 à 22:40:58
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

ça ne veut plus du tout compiler ? c'est à dire ? t'as des messages d'erreur ? ton IDE fait la grève ? ton PC s'éteint après t'avoir jouer "au clair de la lune" ? o_O

Image utilisateur
 
Hors ligne sylvainmahe # Posté le 01/04/2010 à 22:41:40
Groupe : Bannis

Ca met les messages cités plus haut.

Attend je vais encore faire un copier coller:
Ca met les messages cités plus haut.
Ca met les messages cités plus haut.
Ca met les messages cités plus haut.
Ca met les messages cités plus haut.
Ca met les messages cités plus haut.

Voila, alors s ou u, pourquoi le code du tuto ne fonctionne pas du tout?
Édité le 01/04/2010 à 22:43:01 par sylvainmahe
Hors ligne bluelink # Posté le 01/04/2010 à 22:43:50
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

Okay, donc toujours des problème de signed/unsigned, met à jour ta version d'Irrlicht, ça va tout arranger :D

Image utilisateur
 
Hors ligne sylvainmahe # Posté le 01/04/2010 à 22:46:28
Groupe : Bannis

En 1.8?
J'ai déja la 1.7 :(

Il y a un truc qu'il faut que je comprenne la, imagine un type qui a fait un programme de 500000 lignes avec la version 1.5, il ne peux pas mettre à jour vers la version 1.7? Il doit retaper entierement son programme?
Hors ligne bluelink # Posté le 01/04/2010 à 22:56:50
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

non je parlais de la 1.7, mais en fait je me suis emmêler les pinceaux aussi :

video::ITexture::getSize() te renvoi un core::dimension2d<u32>
video::IVideoDriver::draw2DImage() prends en paramètre un core::position2d<s32>

Donc en fait tu ne peux pas le renvoyer directement, il faut faire une petite conversion entre les deux.

Et non, pas besoin de refaire tout le programme à chaque version, la plupart du temps, ce sont des changements qui prennent entre quelque secondes et quelques heures maximum à appliquer.

Image utilisateur
 
Hors ligne sylvainmahe # Posté le 01/04/2010 à 23:00:15
Groupe : Bannis

Bon je crois que c'est trop compliqué, j'arrete la.
Je préfere le c et sdl ca c'est facile. :o
Hors ligne bluelink # Posté le 01/04/2010 à 23:04:28
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

Bah faut pas se décourage comme ça, en gros ça te donne ça :
Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// Récupération de la taille de l'image
    // u32 parce que getSize renvoi du u32
    irr::core::dimension2d<irr::u32> taille = image->getSize();
    
    // Position de l'image
    // s32 parce que Draw2DImage prend en paramètre du s32
    irr::core::position2d<irr::s32> position0;
    position0.X = 0;
    position0.Y = 0;
    irr::core::position2d<irr::s32> position1;
    position1.X = taille.Width;
    position1.Y = taille.Height;
    irr::core::rect<irr::s32> rectangle;
    rectangle.UpperLeftCorner = position0;
    rectangle.LowerRightCorner = position1;

et
Code : C++
1
driver->draw2DImage (image, position0, rectangle, 0, irr::video::SColor (255, 255, 255, 255), true);


Image utilisateur
 
Hors ligne sylvainmahe # Posté le 02/04/2010 à 02:36:50
Groupe : Bannis

Ok merci, la ca fonctionne très bien.

J'aurais voulu savoir au passage si il existe une lib simple pour afficher un objet 3d (un seul) dans une fenêtre en c?

Et peut-on mettre du code c dans un programme c++?
Hors ligne bluelink # Posté le 02/04/2010 à 07:07:08
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

Une lib 3D simple en C ? pas à ma connaissance, mais pourquoi se priver des possibilités qu'offre le C++ ? :p

Et oui, tu peux mettre du C dans un programme C++, mais c'est pas très propre, ou alors si t'as vraiment pas le choix, essaye de bien l'isoler comme il faut.

Image utilisateur
 
Hors ligne sylvainmahe # Posté le 02/04/2010 à 16:17:48
Groupe : Bannis

Ok merci pour ta réponse.

Bon je crois que le mieux est d'expliquer ce que je veux faire pour voir ce qu'on peux me conseiller au mieux.

Je veux dans un jeu:
-afficher un décor en 2d précalculée en background (la vue d'une caméra fixe, rendu qui sort directement du logiciel de 3d)
-afficher un personnage en 3d par dessus ce background
-ce servir du décor 3d (polygonnes qui viennent du logiciel de 3d) pour les colisions (colisions très simples, ca bloque juste l'axe x ou y du personnage en translation sans même arrêter son animation)
-ce servir de ce même décor pour cacher le personnage quand un objet ce trouve devant lui, il faut afficher par dessus le personnage le background en partie, exemples:
les pieds du personnage cachés par la table
des parties du personnage masqués par les gardes corps
En réalité c'est juste le background qui deviens visible à travers le personnage quand un polygonne 3d se trouve devant lui. Ou bien comme expliqué ca peux très bien être une 2ème image, la même que le background, qui serait affiché à cet endroit précis par dessus le perso.

Pour l'instant j'en suis la mais je voudrais vraiment passer à quelque chose au dessus et passer d'une vue fps à une vue avec une caméra externe ou on vois vraiment le personnage qu'on dirige.

Voila si vous pouvez me conseiller.
Merci d'avance.
Hors ligne bluelink # Posté le 02/04/2010 à 22:05:09
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

Globalement, je pense que ton jeu utilises un système de scènes (genre, une pièce dans une maison = une scène) et en bougeant le personnage, tu passes de scène en scène.
Déjà ça te fait ta première classe : Scene

Ensuite, dans chaque scène tu as :
- Un fond, le personnage ne peux pas passer derrière
- Les objets du décors en 2D, le personnage peut passer devant ou derrière, chaque objet à donc une valeur de profondeur dans la scène.
- La représentation des objets dans l'espace 3D, la plupart du temps, un boite, pour gérer les collisions uniquement.
- Et enfin ton personnage, qui à lui aussi une valeur de profondeur dans la scène puisqu'il évolue dans un espace en 3D.

Pour ce qui est des collisions d'abord, tu te sers juste des boites représentatives des objets et de ton personnage.
Et pour l'affichage, tu te fait une liste de trucs à afficher (objets + personnages), tu la tri par leur coordonnées en profondeur, puis tu affiche le fond, et la liste d'objets triée.

Image utilisateur
 
Hors ligne sylvainmahe # Posté le 02/04/2010 à 22:39:42
Groupe : Bannis

Ok, mais tout ca je sais c'était plus d'un point de vue programmation de savoir si tel ou tel moteur peut m'afficher une image à priori cachée quand on superpose deux objets 3d par rapport à la caméra.

Enfin bref sujet résolu, merci de m'avoir aidé.
Hors ligne bluelink # Posté le 02/04/2010 à 22:46:36
T**** me I'm a Zér0 !
Avatar
Flux RSS

Ville : Arès
Pays : France métropolitaine
Études : Université de Bordeaux

Irrlicht peut très bien gérer, ça, je te conseille d'aller voir l'objet irr::scene::IBillboardSceneNode, c'est une image dans l'espace 3D qui reste toujours face à la camera.

Image utilisateur
 

Retour au forum "Langage C++" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx