#0 

20-01-2007 19:52:45

N10
Membre
Date d'inscription: 27-10-2006
Messages: 46

Salutation nouvelle mon chère Kedu (^^)
pourais-tu m'expliquer comment implémenter ce type de configuration sans utiliser "void animermeshs" mettre directement à la suite du programme initiale la référence qui permet de lier en ce qui me concerne un objet appellé "ballnode" avec "mGeomSphere" ???


void AnimerLesMeshs()
        {
            //Mise à jour de la sphere
            updateEntitiesAfterPhysics(ref SphereSceneNode, maPhysique.oGeomSphere);
}

Hors ligne


#1 

20-01-2007 20:20:42

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Houla j'ai plus la tête de dedans ^^

Le manque cruel de temps m'empeche de te répondre avec quelque chose de pret à l'emploi malheureusement... J'espère que toi ou quelqu'un d'autre pourra proposer une méthode qui met à jour le positionnement/rotation des sceneNode d'Irrlicht par rapport aux objets physiques de Newton :-)

Qu'as tu essayé pour le moment comme méthode ?

Hors ligne


#2 

24-01-2007 18:49:25

N10
Membre
Date d'inscription: 27-10-2006
Messages: 46

Dsl d'avoir mi autant de temps mais j'aivais des exams als pour faire cour voila mon programme si tu peut y voir plus claire et m'aider smile merci d'avance.

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Irrlicht;
using Irrlicht.video;
using Irrlicht.core;
using Irrlicht.scene;
using Irrlicht.gui;
using Irrlicht.io;
using System.ComponentModel;
using System.Data;
using System.Threading;
using System.Drawing;
using ODE;
using ODE.Geoms;
using ODE.NoMDX;
using _d_real;
using IrrCP_Ode;



namespace real
{
    class Program
    {
        // start up the engine
        private Physique maPhysique;
        private Thread monThreadDeRenduPhysique;


        // Point d'entrée principal de l'application.       
        [STAThread]
        static void Main(string[] args)
        {
            Program prog = new Program();
            prog.run();
        }     
       
        public void run()
        {
            //device
            IrrlichtDevice device = new IrrlichtDevice(Irrlicht.video.DriverType.DIRECT3D9, new dimension2d(1024, 768), 32, false, true, true);
                     

            //scene et driver en place
            ISceneManager smgr = device.SceneManager;
            IVideoDriver driver = device.VideoDriver;

            //load map
            IAnimatedMesh levelmesh = smgr.GetMesh("media/zone 01/01.dmf");           
            IAnimatedMesh ball = smgr.GetMesh("media/ball/ball.dmf");
           
            //envoi collision type OctTree
            ISceneNode levelnode = null;
            if (levelmesh != null)
                levelnode = smgr.AddOctTreeSceneNode(levelmesh.GetMesh(0), null, 0);
                levelnode.Scale = new vector3d(1, 1, 1);

            //ball
           
            float z = 35;
            float y = 160;
            float x = 0;
            ISceneNode ballnode = null;
            if (ball != null)
                ballnode = smgr.AddOctTreeSceneNode(ball.GetMesh(0), null, 0);
           
            ITriangleSelector sb = null;
            if (ballnode != null)
            {
                ballnode.Position = new vector3d(x,y,z);
                ballnode.Scale = new vector3d(1, 1, 1);
                sb = smgr.CreateOctTreeTriangleSelector(ball.GetMesh(0), ballnode, 128);
            }                   

            //reponse de collision ball
            ISceneNodeAnimator collision = smgr.CreateCollisionResponseAnimator(sb, levelnode, new vector3d(10, 50, 10),
            new vector3d(0, 0, 0), new vector3d(0, 10, 0), 0);
            levelnode.AddAnimator(collision);     
           

            //physik initialisation ball
            maPhysique = new Physique();
            monThreadDeRenduPhysique = new Thread(new ThreadStart(maPhysique.PhysiqueRenderLoop));
            monThreadDeRenduPhysique.IsBackground = true;
            monThreadDeRenduPhysique.Start();

            //add font           
            IGUIFont font = device.GUIEnvironment.GetFont("media/font/fontcourier.bmp");
            rect imp1 = new rect(349, 15, 385, 78);

           //camera
           ICameraSceneNode cam = smgr.AddCameraSceneNode(null, new vector3d(-600, 700, z), new vector3d(0, x, z), 0);       
           
            //Add a light
            smgr.AddLightSceneNode(null, new vector3d(0, 1000, 0),
                new Colorf(1.0f, 1.0f, 1.0f, 1.0f), 5000, 500);
           
            //add skybox
            device.SceneManager.AddSkyBoxSceneNode(
            device.VideoDriver.GetTexture("media/sky/_up.jpg"),
            device.VideoDriver.GetTexture("media/sky/_dn.jpg"),
            device.VideoDriver.GetTexture("media/sky/_lf.jpg"),
            device.VideoDriver.GetTexture("media/sky/_rt.jpg"),
            device.VideoDriver.GetTexture("media/sky/_ft.jpg"),
            device.VideoDriver.GetTexture("media/sky/_bk.jpg"),
            null, -1);

            //retirer le cursor
            device.CursorControl.Visible = false;

            int fps = 0;           
           
            while (device.Run())
            {               
                if (device.WindowActive)
                {
                    device.VideoDriver.BeginScene(true, true, new Irrlicht.video.Color(100, 100, 100, 100));                   
                    device.SceneManager.DrawAll();

                    if (font != null)
                    {
                        font.Draw("x ->" + ballnode.Position.X.ToString(), new rect(10, 10, 10, 10), new Irrlicht.video.Color(255, 200, 0, 0), false, false);
                        font.Draw("y ->" + ballnode.Position.Y.ToString(), new rect(10, 20, 10, 10), new Irrlicht.video.Color(255, 200, 0, 0), false, false);
                        font.Draw("z ->" + ballnode.Position.Z.ToString(), new rect(10, 30, 10, 10), new Irrlicht.video.Color(255, 200, 0, 0), false, false);
                    }

                    device.VideoDriver.EndScene();
                    // display frames per second value
                    if (fps != device.VideoDriver.FPS)
                    {
                        fps = device.VideoDriver.FPS;
                        device.WindowCaption = "Moteur - irrlicht [" + device.VideoDriver.Name + "] fps:" + fps;
                    }
                 
                }

            }
        }   

      }
   
    }

Hors ligne


#3 

24-01-2007 23:10:26

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Aaah d'accord, tu utilises ODE ; j'avais pas compris étant donné le titre de ce thread...

As-tu créé dans la classe Physique ton geom et ton body qui représentent ta baballe ?

Hors ligne


#4 

27-01-2007 15:03:13

N10
Membre
Date d'inscription: 27-10-2006
Messages: 46

excuse moi je me suis trompé de moteur physique :s "dsl" bon voici ma partie physique cela t'aidera surment à m'aider à trouver une solution smile

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using ODE;
using ODE.Geoms;
using ODE.NoMDX;

namespace IrrCP_Ode
{
    /// <summary>
    /// Description of Physique.
    /// </summary>
    public class Physique
    {
        private World World;
        private Space Space;
        private Geom GroundPlane;
        private DefaultCollider Collider;

        public Body[] Body;
        public Sphere GeomSphere;

        private int vitesseBoucle = 1000 / 70;

        public Physique()
        {
            World = new World();
            World.Gravity = new Vector3(0, -2f, 0f);

            Collider = new DefaultCollider(World);
            Space = new Space();
            Space.Collider = new CollisionDelegate(Collider.Collide);
            GroundPlane = new Plane(new Vector3(0, 1, 0), 0);
            Space.Add(GroundPlane);
            Body = new Body[1];

            GeomSphere = new Sphere(1);
            GeomSphere.RigidBody = Body[1];
            Space.Add(GeomSphere);

            Body[1] = new Body(World);
            Body[1].Mass = Mass.SphereTotal(0.2f, 5);
            Body[1].Position = new Vector3(0, 5f, -55f);
            Body[1].AutoDisable = true;
        }
        public void PhysiqueRenderLoop() //boucle de rendu physique
        {
            while (1 == 1)
            {
                Stopwatch stopWatch = Stopwatch.StartNew();

                Space.Collide();

                World.QuickStep(0.15f, 10);


                Collider.ClearContactJoints();


                if ((vitesseBoucle - stopWatch.ElapsedMilliseconds) > 0)
                {
                    try
                    {
                        System.Threading.Thread.Sleep((vitesseBoucle - Convert.ToInt16(stopWatch.ElapsedMilliseconds)));
                    }
                    catch
                    {
                    }
                }

            }

        }


    }
}

Dernière modification par N10 (27-01-2007 15:04:24)

Hors ligne


#5 

28-01-2007 13:58:50

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

N10 :

pourais-tu m'expliquer comment implémenter ce type de configuration sans utiliser "void animermeshs" mettre directement à la suite du programme initiale la référence qui permet de lier en ce qui me concerne un objet appellé "ballnode" avec "mGeomSphere" ???

void AnimerLesMeshs()
        {
            //Mise à jour de la sphere
            updateEntitiesAfterPhysics(ref SphereSceneNode, maPhysique.oGeomSphere);
}


Et bien si je me rappelle bien les choses, il suffit d'appeler dans ta boucle de rendu d'Irrlciht la methode updateEntitiesAfterPhysics(ref taSphereSceneNode, taPhysique.tonGeoSphereDeOde);

J'ai peur de ne pas trop bien saisir ta demande ^^

Hors ligne


#6 

28-01-2007 18:31:43

N10
Membre
Date d'inscription: 27-10-2006
Messages: 46

en fai si tu regarde bien mon prog (pas ma classe physique) par rapport au tien je n'ai qu'une gd méthode "void run" et dans ton exemple il y avais plusieurs méthodes y compris

void AnimerLesMeshs()
        {
            //Mise à jour de la sphere
            updateEntitiesAfterPhysics(ref SphereSceneNode, maPhysique.oGeomSphere);
        }

mais dans mon progra je voudrais l'implémenter directement sans écrire de nouvelle méthode et c'est la que je ne sais pas comment faire (je sais pas si tu me suis,mais sa  bUg lol) ?

Dernière modification par N10 (28-01-2007 18:32:20)

Hors ligne


#7 

28-01-2007 20:55:37

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Non j'ai du mal à suivre là lol

Pourquoi tu ne recopies pas la méthode updateEntitiesAfterPhysics(...,...) dans ton programme ?
Apres il n'y a plus qu'à l'appeler dans ta boucle de rendu ^^

Hors ligne


#8 

28-01-2007 23:05:26

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Je me suis permis de renomer le topic pour plus de clarté sur le forum en "Ode C#".
Voilou @+ wink


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#9 

30-01-2007 14:30:59

N10
Membre
Date d'inscription: 27-10-2006
Messages: 46

Oui j'y avai pas pensé ds ma boucle atant je vais tester (merci copland tu as bien fait,dsl pour le nom du topic)

Dernière modification par N10 (30-01-2007 14:31:12)

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
Analysé par
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
34 invités en ligne
Aucun membre connecté
RSS Feed