Autor Wątek: Mogre + PhysX - nie działa Visual Debugger  (Przeczytany 1290 razy)

Offline Sannin

  • Użytkownik

# Czerwiec 20, 2012, 18:15:20
Cześć,

z powodu problemów z newtonem postanowiłem przesiąść się na PhysX, a dokładnie jego wrapper 'Physx candy wrapper'. Nawet udało mi się coś tam zrobić, ale nie ważnie nie działa mi Visual Debugger. Pomimo animacji w oknie ogra w programie nvidi nic się nie wyświetla. Poniżej podaje cały kod programu:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mogre;
using Mogre.PhysX;

namespace Psyh
{
    class Program
    {
        static void Main(string[] args)
        {
            Engine engine = new Engine();
            engine.createScene();
            engine.InitKeyboard();
            engine.AddObjects();

            while (true)
            {
                engine.OneFrame();

                if (engine.Keyboard.IsKeyDown(MOIS.KeyCode.KC_ESCAPE))
                    break;
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mogre;
using Mogre.PhysX;

namespace Psyh
{
    class Engine
    {

        Physics PhysX;
        Scene PhysScene;

        Root MogreRoot;
        Camera Camera;
        Viewport ViewPort;
        RenderWindow RenderWindow;
        SceneManager SceneManager;

        public MOIS.Keyboard Keyboard;
        public MOIS.InputManager InputManager;

        const float timeStep = 1.0f / 60;

        public void createScene()
        {
            MogreRoot = new Root("Config\\Plugins.cfg", "Config\\Ogre.cfg", "Logs\\Ogre.log");

            if (!MogreRoot.RestoreConfig())
                if (!MogreRoot.ShowConfigDialog())
                    return;

            // Tworzenie okna
            RenderWindow = MogreRoot.Initialise(true, "PsyhX Test v1");
            SceneManager = MogreRoot.CreateSceneManager("TerrainSceneManager", "SampleAppSceneMgr");

            // Swiatło
            SceneManager.AmbientLight = new ColourValue(0.5f, 0.5f, 0.5f);
            Light light = SceneManager.CreateLight("mainLight");
            light.SetPosition(20, 80, 50);

            Camera = SceneManager.CreateCamera("Default");
            Camera.NearClipDistance = 0.1f;
            Camera.FarClipDistance = 10000.0f;
            Camera.SetPosition(0, 20, 300);
            Camera.LookAt(0, 0, 0);

            ViewPort = RenderWindow.AddViewport(Camera);
            ViewPort.BackgroundColour = new ColourValue(0.5f, 0.5f, 0.5f);
            Camera.AspectRatio = (float)ViewPort.ActualWidth / (float)ViewPort.ActualHeight;

            // Fizyka
            PhysX = Physics.Create();
            PhysX.Parameters.SkinWidth = 0.0025f;

            SceneDesc sceneDesc = new SceneDesc();
            sceneDesc.SetToDefault();
            sceneDesc.Gravity = new Vector3(0, -9.8f, 0);
            sceneDesc.UpAxis = 1;

            PhysScene = PhysX.CreateScene(sceneDesc);
            PhysScene.Materials[0].StaticFriction = 0.5f;
            PhysScene.Materials[0].DynamicFriction = 0.5f;
            PhysScene.Materials[0].Restitution = 0.5f;

            PhysScene.Simulate(0);

            // Debuger
            PhysX.RemoteDebugger.Connect("locathost", 5425);
        }

        public void InitKeyboard()
        {
            MOIS.ParamList paramList = new MOIS.ParamList();
            IntPtr handle;
            RenderWindow.GetCustomAttribute("WINDOW", out handle);
            paramList.Insert("WINDOW", handle.ToString()); InputManager = MOIS.InputManager.CreateInputSystem(paramList);

            Keyboard = (MOIS.Keyboard)InputManager.CreateInputObject(MOIS.Type.OISKeyboard, false); // wyłączone buforowanie
        }

        public void AddObjects()
        {
            // Box1
            ActorDesc actorDesc1 = new ActorDesc(new BodyDesc(), 1, new BoxShapeDesc(new Vector3(5, 5, 5)));
            actorDesc1.GlobalPosition = new Vector3(0, 80, 0);
            Actor box1 = PhysScene.CreateActor(actorDesc1);
            box1.Name = "box1";

            SceneNode box1Node = SceneManager.CreateSceneNode("box1");
            Entity box1Entity = SceneManager.CreateEntity("box1", Mogre.SceneManager.PrefabType.PT_CUBE);
            box1Node.AttachObject(box1Entity);
            box1Node._update(true, true);
            box1Node.SetScale(0.1f, 0.1f, 0.1f);


            // Box2
            ActorDesc actorDesc2 = new ActorDesc(new BodyDesc(), 1, new BoxShapeDesc(new Vector3(5, 5, 5)));
            actorDesc2.GlobalPosition = new Vector3(0, 60, 0);
            Actor box2 = PhysScene.CreateActor(actorDesc2);
            box2.Name = "box2";

            SceneNode box2Node = SceneManager.RootSceneNode.CreateChildSceneNode("box2");
            Entity box2Entity = SceneManager.CreateEntity(SceneManager.PrefabType.PT_CUBE);
            box2Node.AttachObject(box2Entity);
            box2Node.SetScale(0.1f, 0.1f, 0.1f);
            box2Node._update(true, true);

            // Floor
            ActorDesc actorDesc = new ActorDesc(new PlaneShapeDesc());
            PhysScene.CreateActor(actorDesc);
            actorDesc.GlobalPosition = new Vector3(0, 0, 0);
        }

        protected void UpdatePhysics()
        {
            PhysScene.FlushStream();
            PhysScene.FetchResults(SimulationStatuses.AllFinished, true);
            PhysScene.Simulate(timeStep);

            foreach (Actor actor in PhysScene.Actors)
            {

                if (!actor.IsDynamic) continue;

                if (SceneManager.HasSceneNode(actor.Name))
                {
                    Matrix4 mat = actor.GlobalPose;
                    Quaternion rot = actor.GlobalOrientationQuaternion;
                    SceneNode tempnode = SceneManager.GetSceneNode(actor.Name);

                    tempnode.Orientation = rot;
                    tempnode.Position = mat.GetTrans();
                }
            }
        }

        public void OneFrame()
        {
            Keyboard.Capture();

            UpdatePhysics();

            MogreRoot.RenderOneFrame();

            WindowEventUtilities.MessagePump();
        }
    }
}

Wersja programu:
Cytuj
PhysX Visual Debugger
01/11/2012
2.0001.1986.9381
OpenGL Version: 1.1.0
Copyright © NVIDIA 2011

Z tego co wyczytałem wystarczy po inicjalizacji sceny dodać:
PhysX.RemoteDebugger.Connect("locathost", 5425);

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzych

  • Użytkownik

  • +1
# Czerwiec 21, 2012, 10:01:45
Problemem może być literówka w adresie, spróbuj użyć "localhost" zamiast "locathost" ;)

Offline Sannin

  • Użytkownik

# Czerwiec 21, 2012, 12:22:39
haha :D ale jaja, dzięki :) działa