Bonjour,
Je découvre irrlicht et voudrais tester quelques applications avec ce moteur. Je cherche à intégrer une zone d'affichage 3D dans une application MFC basée sur les boîtes de dialogue (sous vc8). Problème, en adaptant l'exemple 14.Win32Window_vc8 pour mon application, je réussi à obtenir l'affichage de la zone en 3D, mais l'animation exemple (rotation de la caméra) ne fonctionne pas
Voici le code :
header de la classe Zone3D:
.cpp :
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 class CZone3D : public CWnd { DECLARE_DYNAMIC(CZone3D) public: CZone3D(); virtual ~CZone3D(); public: IrrlichtDevice* device; video::IVideoDriver* driver; scene::ISceneManager* smgr; scene::ICameraSceneNode* cam; scene::ISceneNode* cube; SIrrlichtCreationParameters param; scene::ISceneNodeAnimator* anim; protected: DECLARE_MESSAGE_MAP() public: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct); afx_msg void OnPaint(); afx_msg void OnDestroy(); afx_msg void OnTimer(UINT_PTR nIDEvent); };
InitDialog de la CDialog parente :
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
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 int CZone3D::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Ajoutez ici votre code de création spécialisé param.WindowId = reinterpret_cast<void*>(GetSafeHwnd()); param.DriverType = irr::video::EDT_DIRECT3D9; device = irr::createDeviceEx(param); driver=device->getVideoDriver(); smgr=device->getSceneManager(); //create a camera and set its target cam = smgr->addCameraSceneNode(); cam->setTarget(core::vector3df(0,0,0)); //animation scene::ISceneNodeAnimator* anim = smgr->createFlyCircleAnimator(core::vector3df(0,15,0), 30.0f); cam->addAnimator(anim); anim->drop(); cube = smgr->addCubeSceneNode(10); //textures cube->setMaterialTexture(0, driver->getTexture("../../media/wall.bmp")); cube->setMaterialTexture(1, driver->getTexture("../../media/water.jpg")); cube->setMaterialFlag( video::EMF_LIGHTING, false ); cube->setMaterialType( video::EMT_REFLECTION_2_LAYER ); smgr->addSkyBoxSceneNode( driver->getTexture("../../media/irrlicht2_up.jpg"), driver->getTexture("../../media/irrlicht2_dn.jpg"), driver->getTexture("../../media/irrlicht2_lf.jpg"), driver->getTexture("../../media/irrlicht2_rt.jpg"), driver->getTexture("../../media/irrlicht2_ft.jpg"), driver->getTexture("../../media/irrlicht2_bk.jpg")); //timer SetTimer(1, 200, 0); return 0; } void CZone3D::OnDestroy() { CWnd::OnDestroy(); device->closeDevice(); device->drop(); } void CZone3D::OnTimer(UINT_PTR nIDEvent) { driver->beginScene(true, true, 0); smgr->drawAll(); driver->endScene(); CWnd::OnTimer(nIDEvent); }
rendu figé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 BOOL CmfcirrlichtDlg::OnInitDialog() { CDialog::OnInitDialog(); disp=new CZone3D; disp->Create(NULL, NULL, WS_CHILD|WS_VISIBLE|SS_NOTIFY, CRect(10,10,300,250), this, 100); return TRUE; }
Je ne trouve pas d'exemples sur le net, si quelqu'un voit d'où vient le problème :p (problème de notification/ raffraîchissement ?)
Partager