Pages: 1
- Accueil forums
- » Aide Irrlicht C++
- » Probleme de placement de repère avec une scene
04-02-2009 14:39:05
- Djinner
- Membres
- Date d'inscription:
- Messages: 9
- IP: 91.199.6.44
- Courriel
Bonjour à tous, je viens vers vous pour vous demander de l'aide au sujet d'un placement de repère.
Pour créer mon repère j'ai dessiné 3 lignes 3D comme cela (avec des couleurs différentes) :
driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(20, 0, 0), video::SColor(0, 255, 0, 0));
driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 20, 0), video::SColor(0, 0, 255, 0));
driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 0, 20), video::SColor(0, 0, 0, 255));Auparavant j'ai créé un cube dans un graphe de scène, comme ceci :
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* scenegraph = device->getSceneManager();
//Création des éléments de notre graphe de scene
cube1 = scenegraph->addCubeSceneNode(0.5f, scenegraph->getRootSceneNode());
cube1->setPosition(vector3df(5,5,5));J'ai bien évidement créé une caméra pour visionner ma scène comme ceci :
//Création de la caméra selon un angle précis
ICameraSceneNode* cam = scenegraph->addCameraSceneNode(scenegraph->getRootSceneNode(), core::vector3df(10,10,10), core::vector3df(-5,-5,-5));La caméra visionne bien comme je veux, tout est bien dessiné (le cube et le repère), le soucis c'est que le cube est au centre du repère... Ce qui ne devrait pas être le cas... Ais-je oublié quelque chose ? Ou est l'erreur ?
Merci d'avance pour votre réponse !

PS : Je vous donne le code de ma boucle while qui run la scene 3D :
while(device->run()){
driver->beginScene(true, true, SColor(255,100,101,140));
scenegraph->drawAll();
//Création de la caméra selon un angle précis
ICameraSceneNode* cam = scenegraph->addCameraSceneNode(0, core::vector3df(x,y,z), core::vector3df(u,v,w));
//On dessine les traits du repere
video::SMaterial m;
m.Lighting = false;
driver->setMaterial(m);
driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(20, 0, 0), video::SColor(0, 255, 0, 0));
driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 20, 0), video::SColor(0, 0, 255, 0));
driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 0, 20), video::SColor(0, 0, 0, 255));
driver->endScene();
}Hors ligne
04-02-2009 17:00:23
- dark calculator
- Membres
- Date d'inscription:
- Messages: 153
- IP: 88.178.191.172
- Courriel
Bon je vois pas d'ou peu venir ton bug mais j'ai vu Quelques erreurs :
Pour commencer scenegraph->getRootSceneNode() est inutile, que se soit pour le cube ou la camera, remplace le par 0, le problème peut venir de la même si je vois pas pourquoi.
Ensuite tu cree une nouvelle camera a chaque boucle, se qui est surement pas la bonne solution, utilise plutot setPosition et setTarget (ou setRotation) dans la boucle sinon tu va te retrouver avec des millions de cameras inutiles.
sinon je vois pas d'autre erreurs, au pire donne tous le code
dark calculator
Hors ligne
04-02-2009 18:45:06
- Djinner
- Membres
- Date d'inscription:
- Messages: 9
- IP: 81.67.248.153
- Courriel
Merci pour ta réponse, j'ai fais ce que tu m'as dis, et le problème n'est toujours pas résolu malheureusement.... Je te file tout le code du coup.... Dsl si ce n'est pas très très propre
#include <irr/irrlicht.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
bool _bExit;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace std;
ISceneNode *cube1;
ISceneNode *cube2;
ISceneNode *sphere1;
ISceneNode *sphere2;
ISceneNode *cube3;
int x = 10;
int y = 10;
int z = 10;
int u = -5;
int v = -5;
int w = -5;
class MyEventReceiver : public IEventReceiver
{
private:
ISceneNode* element;
public:
bool OnEvent(const SEvent& event)
{
if (event.EventType == irr::EET_KEY_INPUT_EVENT )
{
switch(event.KeyInput.Key)
{
case KEY_ESCAPE:
{
_bExit = true;
return true;
}
case KEY_KEY_Q:
{
x = 0;
y = -5;
z = 0;
u = 0;
v = 10;
w = 0;
return true;
}
case KEY_KEY_W:
{
x = 10;
y = 0;
z = 0;
u = -5;
v = 0;
w = 0;
return true;
}
}
}
/*if (event.Eventype == irr::EMIE_LMOUSE_PRESSED_DOWN )
{
if (event.Eventype == irr::EMIE_MOUSE_MOVED){
element -> setPosition(vector3df(MOUSEEVENTF_XUP, MOUSEEVENTF_XDOWN)
}
}*/
return false;
}
};
int main(){
MyEventReceiver _EventReceiver;
/* cout << "Bonjour, quelle vue désirez vous pour cette exemple ? \
(a) selon l'axe Ox \
(b) selon l'axe Oy \
(c) selon l'axe Oz \
(autre) quitter" <<endl;
char choix;
cin >> choix;
switch(choix)
{
case 'a': x = 10; break;
case 'b': y = 10; break;
case 'c': z = 10; break;
default: return 0;
}*/
IrrlichtDevice *device = createDevice( video::EDT_OPENGL,
dimension2d<s32>(640, 480),
32,
false,
false,
true,
&_EventReceiver);
/*
petite redifinition du titre de la fenetre.
*/
device->setWindowCaption(L"Tuto_Node - Premier nodes");
/*
une fois le device créé, on va récupérer un certain nombre
de pointeur qui vont nous être utile pour la suite.
Entre-autre: video driver, SceneManager et GUI.
*/
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* scenegraph = device->getSceneManager();
//Création des éléments de notre graphe de scene
cube1 = scenegraph->addCubeSceneNode(0.5f, 0);
cube1->setPosition(vector3df(5,5,5));
//On ajoute les textures à nos éléments du graphe
if (cube1)
{ cube1->setMaterialFlag(EMF_LIGHTING,false);
cube1->setMaterialTexture( 0, driver->getTexture("C:/irrlicht/media/stones.jpg") );
}
if (cube2)
{ cube2->setMaterialFlag(EMF_LIGHTING,false);
cube2->setMaterialTexture( 0, driver->getTexture("C:/irrlicht/media/irrlichtlogo.bmp") );
}
if (sphere1)
{ sphere1->setMaterialFlag(EMF_LIGHTING,false);
sphere1->setMaterialTexture( 0, driver->getTexture("C:/irrlicht/media/irrlichtlogo.bmp") );
}
/*if (sphere2)
{ sphere2->setMaterialFlag(EMF_LIGHTING, false);
sphere2->setMaterialTexture( 0, driver->getTexture("C:/irrlicht/media/irrlichtlogo.bmp") );
}*/
ICameraSceneNode* cam = scenegraph->addCameraSceneNode(0, core::vector3df(5,5,5), core::vector3df(5,5,-5));
matrix4 orthoMatrix;
orthoMatrix.buildProjectionMatrixOrthoLH(20.f, 15.f, 5.f, 100.f);
cam->setProjectionMatrix(orthoMatrix,true);
int frame =0;
while(device->run()){
driver->beginScene(true, true, SColor(255,100,101,140));
scenegraph->drawAll();
//Création de la caméra selon un angle précis
//cam->setIsOrthogonal(true);
//On dessine les traits du repere
video::SMaterial m;
m.Lighting = false;
driver->setMaterial(m);
driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(20, 0, 0), video::SColor(0, 255, 0, 0));
driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 20, 0), video::SColor(0, 0, 255, 0));
driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 0, 20), video::SColor(0, 0, 0, 255));
driver->endScene();
}
device->drop();
return 0;
}Hors ligne
06-02-2009 15:14:29
- Djinner
- Membres
- Date d'inscription:
- Messages: 9
- IP: 81.67.248.153
- Courriel
Alors tu as pu tester ? Je n'ai toujours pas résolu le problème et je ne comprend toujours pas pourquoi les 3DLine s'attache à mon cube....
Hors ligne
06-02-2009 17:31:11
- dark calculator
- Membres
- Date d'inscription:
- Messages: 153
- IP: 88.178.191.172
- Courriel
dsl pas pu répondre hier soir,
je ne sais pas vraiment pourquoi mais il faut rajouter
driver->setTransform(video::ETS_WORLD, core::matrix4());avant de dessiner tes lignes et normalement sa marche(cf draw3dLine dans l'API)
dark calculator
Hors ligne
06-02-2009 19:55:52
- Djinner
- Membres
- Date d'inscription:
- Messages: 9
- IP: 81.67.248.153
- Courriel
Arf, même en ajoutant la ligne que tu m'as dis... Ca me fait toujours le même résultat ... Faut il créer un repaire sur chaque viewport ?
J'ai crée un repaire apres les viewport, et il ne l'affiche que dans le dernier viewport (en bas à droite)....
Hors ligne
06-02-2009 20:59:16
- dark calculator
- Membres
- Date d'inscription:
- Messages: 153
- IP: 82.67.201.37
- Courriel
En effet il va falloir creer les lignes sur chaque viewport car en fait quand tu fais un drawAll du scène manager il fais appels a toutes ces fonctions du driver du type draw3DLIne, draw3DTriangle... Donc puisque tu fais appels à un drawall pour chaque viewport il fais faire les lignes pour caque aussi.
Sinon sans tenir conte des viewports ton cube ou plutot ton repère se place t'il bien en 0?
Si tu galère vraiment trop comme ça tu peux utiliser des cubes pour faire le repère(avec un scale très petit sur y et z, pour le vecteur x...) ça ne solutionne pas ton problème mais le contourne et simplifirait ton code.
Hors ligne
06-02-2009 21:37:39
- Djinner
- Membres
- Date d'inscription:
- Messages: 9
- IP: 81.67.248.153
- Courriel
Ce que je n'arrive pas à comprendre c'est qu'il me fait la bonne vue (la cam est bien placé) pour mon cube. Mais il me fait la mauvaise vue pour chaque repaire... On dirait qu'il mixe les deux...
Hors ligne
07-02-2009 12:43:15
- dark calculator
- Membres
- Date d'inscription:
- Messages: 153
- IP: 82.67.201.37
- Courriel
Encore une fois sans ton code complet cela va pas etre facile de t'aider (pour eviter de surcharger le post tu peux utililser http://pastebin.com/)
Sinon vérifie que se ne soit pas un problème d'origine des coordonnées 2d, il est possible que l'origine ne soit pas ou tu le pense, vérifie dans l'example irrlicht ou l'api
dark calculator
Hors ligne
07-02-2009 17:22:37
- Djinner
- Membres
- Date d'inscription:
- Messages: 9
- IP: 81.67.248.153
- Courriel
J'ai essayé ta méthode avec les cubes, et il s'avère que ça marche plutôt bien ! Le problème est dans les draw3Dline... je t'ai fais un copier coller du code sur le site que tu m'as indiqué, à l'adresse suivante : http://pastebin.com/f12dab4ff
J'ai retesté le code et cela donne la même chose qu'au dessus visuellement parlant...
Hors ligne
07-02-2009 18:30:44
- dark calculator
- Membres
- Date d'inscription:
- Messages: 153
- IP: 82.67.201.37
- Courriel
ouf j'ai trouvé,
je ne comprends pas pourquoi mais il faut mettre smgr->drawAll() avant les drawLines sinon les lignes étaient dessiner sur le viewport.
j'ai pas verifier tous les repères ensuite mais sa devrait être sa.
Pour les explications, il faut quelqu'un qui connaise le fonctionnement du rendu irrlicht.
dark calculator
Hors ligne
07-02-2009 18:57:45
- Djinner
- Membres
- Date d'inscription:
- Messages: 9
- IP: 81.67.248.153
- Courriel
RHA ca gère trop !!!! Ca marche nickel !!!! Ca fait une semaine que je galère !!! Merci beaucoup ![]()
Hors ligne



