コード例 #1
0
		public void CreateAndDisposeCapsuleController()
		{
			using (var core = CreatePhysicsAndScene())
			{
				var controllerManager = core.Scene.CreateControllerManager();

				var material = core.Physics.CreateMaterial(0.1f, 0.1f, 0.1f);

				var desc = new CapsuleControllerDesc()
				{
					Radius = 5,
					Height = 2,
					Material = material
				};

				Assert.IsTrue(desc.IsValid());

				CapsuleController capsuleController;
				using (capsuleController = controllerManager.CreateController<CapsuleController>(desc))
				{
					Assert.IsNotNull(capsuleController);
					Assert.IsFalse(capsuleController.Disposed);
				}

				Assert.IsTrue(capsuleController.Disposed);
			}
		}
コード例 #2
0
        protected override void LoadPhysics(Scene scene)
        {
            var material = scene.Physics.CreateMaterial(0.1f, 0.1f, 0.1f);

            var controllerManager = scene.CreateControllerManager();

            // User controllable character
            {
                var desc = new CapsuleControllerDesc()
                {
                    Height         = 4,
                    Radius         = 1,
                    Material       = material,
                    UpDirection    = new Vector3(0, 1, 0),
                    Position       = new Vector3(0, 3, 0),
                    ReportCallback = new ControllerHitReport()
                };

                _controller = controllerManager.CreateController <CapsuleController>(desc);
            }

            // Another controller to walk into
            {
                var desc = new CapsuleControllerDesc()
                {
                    Height      = 4,
                    Radius      = 1,
                    Material    = material,
                    UpDirection = new Vector3(0, 1, 0),
                    Position    = new Vector3(15, 3, 15)
                };

                controllerManager.CreateController <CapsuleController>(desc);
            }
        }
コード例 #3
0
        public void CreateAndDisposeCapsuleController()
        {
            using (var core = CreatePhysicsAndScene())
            {
                var controllerManager = core.Scene.CreateControllerManager();

                var material = core.Physics.CreateMaterial(0.1f, 0.1f, 0.1f);

                var desc = new CapsuleControllerDesc()
                {
                    Radius   = 5,
                    Height   = 2,
                    Material = material
                };

                Assert.IsTrue(desc.IsValid());

                CapsuleController capsuleController;
                using (capsuleController = controllerManager.CreateController <CapsuleController>(desc))
                {
                    Assert.IsNotNull(capsuleController);
                    Assert.IsFalse(capsuleController.Disposed);
                }

                Assert.IsTrue(capsuleController.Disposed);
            }
        }
コード例 #4
0
        private void setupPhysics()
        {
            CapsuleControllerDesc desc = new CapsuleControllerDesc();

            desc.Position                 = entityNode.Position;
            desc.StepOffset               = 0.01f;
            desc.SlopeLimit               = 0.5f;              // max slope the character can walk
            desc.Radius                   = 2.5f;              //radius of the capsule
            desc.Height                   = CHAR_HEIGHT;       //height of the controller
            desc.ClimbingMode             = CapsuleClimbingModes.Easy;
            desc.UpDirection              = HeightFieldAxes.Y; // Specifies the 'up' direction
            desc.Position                 = entityNode.Position;
            physicsController             = cotrollerManager.CreateController(physicsScene, desc);
            physicsController.Actor.Group = 3;
        }
コード例 #5
0
        protected override void LoadPhysics(Scene scene)
        {
            var material = scene.Physics.CreateMaterial(0.1f, 0.1f, 0.1f);

            var controllerManager = scene.CreateControllerManager();

            var desc = new CapsuleControllerDesc()
            {
                Height      = 4,
                Radius      = 1,
                Material    = material,
                UpDirection = new Math.Vector3(0, 1, 0),
                Position    = new Math.Vector3(0, 2, 0)
            };

            _controller = controllerManager.CreateController <CapsuleController>(desc);
        }
コード例 #6
0
ファイル: CharacterSample.cs プロジェクト: zwagoth/PhysX.net
		protected override void LoadPhysics(Scene scene)
		{
			var material = scene.Physics.CreateMaterial(0.1f, 0.1f, 0.1f);

			var controllerManager = scene.CreateControllerManager();

			var desc = new CapsuleControllerDesc()
			{
				Height = 4,
				Radius = 1,
				Material = material,
				UpDirection = new Math.Vector3(0, 1, 0),
				Position = new Math.Vector3(0, 2, 0)
			};

			_controller = controllerManager.CreateController<CapsuleController>(desc);
		}
コード例 #7
0
        public bool Create(Vector3 position, Quaternion orientation)
        {
            desc = new CapsuleControllerDesc();
            desc.Position = position;
            desc.Height = 1.2f;
            desc.Radius = 0.8f;
            desc.SkinWidth = 0.125f;
            desc.SlopeLimit = Mogre.Math.Cos(new Radian(new Degree(45)));
            desc.StepOffset = 0.5f;
            desc.UpDirection = HeightFieldAxes.Y;
            desc.ClimbingMode = CapsuleClimbingModes.Constrained;
            desc.Callback = this;

            this.camera = Engine.Graphics.Camera;
            this.camera.Orientation = orientation;

            controller = Engine.Physics.CreateCharacterController(desc);
            return true;
        }
コード例 #8
0
        public bool Create(Vector3 position, Quaternion orientation)
        {
            desc              = new CapsuleControllerDesc();
            desc.Position     = position;
            desc.Height       = 1.2f;
            desc.Radius       = 0.8f;
            desc.SkinWidth    = 0.125f;
            desc.SlopeLimit   = Mogre.Math.Cos(new Radian(new Degree(45)));
            desc.StepOffset   = 0.5f;
            desc.UpDirection  = HeightFieldAxes.Y;
            desc.ClimbingMode = CapsuleClimbingModes.Constrained;
            desc.Callback     = this;

            this.camera             = Engine.Graphics.Camera;
            this.camera.Orientation = orientation;

            controller = Engine.Physics.CreateCharacterController(desc);
            return(true);
        }
コード例 #9
0
        protected Controller _createCharacterController(Vector3 pose, Scene scene, SimpleShape shape, CharacterControllerDescription description)
        {
            Controller            controller      = null;
            CapsuleControllerDesc controller_desc = new CapsuleControllerDesc();

            controller_desc.ClimbingMode = description.CapsuleEasyClimbing ? CapsuleClimbingModes.Easy : CapsuleClimbingModes.Constrained;
            Vector3 capsule_desc = shape.to_cc_shape();

            controller_desc.Height     = capsule_desc.y;
            controller_desc.Radius     = capsule_desc.x;
            controller_desc.Position   = pose;
            controller_desc.SkinWidth  = description.SkinWidth;
            controller_desc.SlopeLimit = description.SlopeLimit;
            controller_desc.StepOffset = description.StepOffset;
            //controller_desc.s = (NxHeightFieldAxis)(int)description.mUpDirection;
            //controller_desc.Callback = World::getSingleton()->getPhysXCharacterHitReport();
            scene.Physics.ControllerManager.CreateController(scene, controller_desc);
            return(controller);
        }
コード例 #10
0
		public void SetToDefault()
		{
			using (var physics = CreatePhysicsAndScene())
			{
				var material = physics.Physics.CreateMaterial(1, 2, 3);

				// Change all the properties of a CapsuleControllerDesc
				var c = new CapsuleControllerDesc()
				{
					ClimbingMode = CapsuleClimbingMode.Easy,
					ContactOffset = 99,
					Density = 100,
					Height = 101,
					Material = material,
					NonWalkableMode = ControllerNonWalkableMode.PreventClimbing,
					Position = new Vector3(1, 2, 3),
					Radius = 104,
					ScaleCoefficient = 105,
					SlopeLimit = 106,
					StepOffset = 107,
					UpDirection = new Vector3(0, 0, 1),
				};

				// Set the description to default
				c.SetToDefault();

				// Capsule
				Assert.AreEqual(CapsuleClimbingMode.Easy, c.ClimbingMode);
				Assert.AreEqual(0, c.Radius);
				Assert.AreEqual(0, c.Height);

				// ControllerDesc
				Assert.AreEqual(0.1f, c.ContactOffset);
				Assert.AreEqual(0.5f, c.StepOffset);
				Assert.AreEqual(10.0f, c.Density);
				Assert.AreEqual(0.8f, c.ScaleCoefficient);
				Assert.AreEqual(null, c.UserData);
				Assert.AreEqual(new Vector3(0, 0, 0), c.Position);
				Assert.AreEqual(null, c.Material);
			}
		}
コード例 #11
0
ファイル: ControllerTest.cs プロジェクト: flair2005/PhysX.Net
		public void ControllerStateIsValid()
		{
			using (var core = CreatePhysicsAndScene())
			{
				var controllerManager = core.Scene.CreateControllerManager();

				var material = core.Physics.CreateMaterial(0.1f, 0.1f, 0.1f);

				var desc = new CapsuleControllerDesc()
				{
					Height = 12,
					Radius = 7,
					Material = material,
					Position = new Vector3(0, 25, 0)
				};

				// Create a capsule controller
				var capsuleController = controllerManager.CreateController<CapsuleController>(desc);

				// A box for it to fall on to
				var box = CreateBoxActor(core.Scene, new Vector3(10, 1, 10), new Vector3(0, 0.5f, 0));

				// Make it fall
				for (int i = 0; i < 200; i++)
				{
					capsuleController.Move(new Vector3(0, -0.3f, 0), TimeSpan.FromMilliseconds(0.1));

					core.Scene.Simulate(0.1f);
					core.Scene.FetchResults(block: true);
				}

				//

				var controllerState = capsuleController.GetState();

				Assert.IsNotNull(controllerState);
				Assert.AreEqual(box.Shapes.First(), controllerState.TouchedShape);
				Assert.AreEqual(box, controllerState.TouchedActor);
				Assert.AreEqual(ControllerCollisionFlag.Down, controllerState.CollisionFlags);
			}
		}
コード例 #12
0
        public void ControllerStateIsValid()
        {
            using (var core = CreatePhysicsAndScene())
            {
                var controllerManager = core.Scene.CreateControllerManager();

                var material = core.Physics.CreateMaterial(0.1f, 0.1f, 0.1f);

                var desc = new CapsuleControllerDesc()
                {
                    Height   = 12,
                    Radius   = 7,
                    Material = material,
                    Position = new Vector3(0, 25, 0)
                };

                // Create a capsule controller
                var capsuleController = controllerManager.CreateController <CapsuleController>(desc);

                // A box for it to fall on to
                var box = CreateBoxActor(core.Scene, new Vector3(10, 1, 10), new Vector3(0, 0.5f, 0));

                // Make it fall
                for (int i = 0; i < 200; i++)
                {
                    capsuleController.Move(new Vector3(0, -0.3f, 0), TimeSpan.FromMilliseconds(0.1));

                    core.Scene.Simulate(0.1f);
                    core.Scene.FetchResults(block: true);
                }

                //

                var controllerState = capsuleController.GetState();

                Assert.IsNotNull(controllerState);
                Assert.AreEqual(box.Shapes.First(), controllerState.TouchedShape);
                Assert.AreEqual(box, controllerState.TouchedActor);
                Assert.AreEqual(ControllerCollisionFlag.Down, controllerState.CollisionFlags);
            }
        }
コード例 #13
0
        public void SetToDefault()
        {
            using (var physics = CreatePhysicsAndScene())
            {
                var material = physics.Physics.CreateMaterial(1, 2, 3);

                // Change all the properties of a CapsuleControllerDesc
                var c = new CapsuleControllerDesc()
                {
                    ClimbingMode     = CapsuleClimbingMode.Easy,
                    ContactOffset    = 99,
                    Density          = 100,
                    Height           = 101,
                    Material         = material,
                    NonWalkableMode  = ControllerNonWalkableMode.PreventClimbing,
                    Position         = new Vector3(1, 2, 3),
                    Radius           = 104,
                    ScaleCoefficient = 105,
                    SlopeLimit       = 106,
                    StepOffset       = 107,
                    UpDirection      = new Vector3(0, 0, 1),
                };

                // Set the description to default
                c.SetToDefault();

                // Capsule
                Assert.AreEqual(CapsuleClimbingMode.Easy, c.ClimbingMode);
                Assert.AreEqual(0, c.Radius);
                Assert.AreEqual(0, c.Height);

                // ControllerDesc
                Assert.AreEqual(0.1f, c.ContactOffset);
                Assert.AreEqual(0.5f, c.StepOffset);
                Assert.AreEqual(10.0f, c.Density);
                Assert.AreEqual(0.8f, c.ScaleCoefficient);
                Assert.AreEqual(null, c.UserData);
                Assert.AreEqual(new Vector3(0, 0, 0), c.Position);
                Assert.AreEqual(null, c.Material);
            }
        }
コード例 #14
0
        protected override void LoadPhysics(Scene scene)
        {
            var material = scene.Physics.CreateMaterial(0.1f, 0.1f, 0.1f);

            var controllerManager = scene.CreateControllerManager();

            // User controllable character
            {
                var desc = new CapsuleControllerDesc()
                {
                    Height = 4,
                    Radius = 1,
                    Material = material,
                    UpDirection = new Vector3(0, 1, 0),
                    Position = new Vector3(0, 3, 0),
                    // TODO: I think this is coming back in 3.3 (> beta 2)
                    //Callback = new ControllerHitReport()
                };

                _controller = controllerManager.CreateController<CapsuleController>(desc);
            }

            // Another controller to walk into
            {
                var desc = new CapsuleControllerDesc()
                {
                    Height = 4,
                    Radius = 1,
                    Material = material,
                    UpDirection = new Vector3(0, 1, 0),
                    Position = new Vector3(15, 3, 15)
                };

                controllerManager.CreateController<CapsuleController>(desc);
            }
        }
コード例 #15
0
        // TODO: Currently, this system is responsible for creating and setting PhysicsImplementation properties
        //   -issue: PhysicsImplementations can't be passed/delegated before this system is initialized, as the props are unset
        //   -motive: DynamicMovementController wants to be able to setup callbacks before any physics events happen
        public void AddCharacterController(MoverComponent component)
        {
            var config = component.Config;

            var radius = 0.175f;

            // TODO: reduce duplicated code
            if (component.Mode == MoverComponent.MovementMode.Freecam)
            {
                var posPose = Matrix4x4.CreateTranslation(component.Transform.TransformationMatrix.Translation);
                var rot     = Matrix4x4.CreateRotationY(MathF.PI / -2f);

                var body = this.physxPhysics.CreateRigidDynamic(rot * posPose);
                body.MassSpaceInertiaTensor = new Vector3(0, 0, 0);
                body.Mass           = 175f;
                body.UserData       = component;
                body.RigidBodyFlags = RigidBodyFlag.Kinematic;

                var capsuleDesc = new CapsuleGeometry(radius, config.Height / 2f - radius);

                var shape = RigidActorExt.CreateExclusiveShape(body, capsuleDesc, characterControlMat);
                // TODO: centralize filter data construction
                shape.SimulationFilterData = new FilterData((uint)(OpenH2FilterData.NoClip | OpenH2FilterData.PlayerCharacter), 0, 0, 0);

                shape.ContactOffset = 0.001f;
                shape.RestOffset    = 0.0009f;

                var bodyProxy = new RigidBodyProxy(body);
                component.PhysicsImplementation = bodyProxy;
                this.physxScene.AddActor(body);
            }
            if (component.Mode == MoverComponent.MovementMode.KinematicCharacterControl)
            {
                var desc = new CapsuleControllerDesc()
                {
                    Height         = config.Height - .02f - (2 * radius),
                    Position       = component.Transform.Position,
                    Radius         = radius,
                    MaxJumpHeight  = 1f,
                    UpDirection    = EngineGlobals.Up,
                    SlopeLimit     = MathF.Cos(0.872665f), // cos(50 degrees)
                    StepOffset     = 0.1f,
                    Material       = defaultMat,
                    ContactOffset  = 0.0001f,
                    ReportCallback = new CustomHitReport()
                };

                var controller = this.controllerManager.CreateController <CapsuleController>(desc);

                controller.Actor.UserData       = component;
                component.PhysicsImplementation = new KinematicCharacterControllerProxy(controller);

                this.ControllerMap.Add(component, controller);
            }
            else if (component.Mode == MoverComponent.MovementMode.DynamicCharacterControl)
            {
                var posPose = Matrix4x4.CreateTranslation(component.Transform.TransformationMatrix.Translation);
                var rot     = Matrix4x4.CreateRotationY(MathF.PI / -2f);

                var body = this.physxPhysics.CreateRigidDynamic(rot * posPose);
                body.MassSpaceInertiaTensor = new Vector3(0, 0, 0);
                body.Mass     = 175f;
                body.UserData = component;

                var capsuleDesc = new CapsuleGeometry(radius, config.Height / 2f - radius);

                var shape = RigidActorExt.CreateExclusiveShape(body, capsuleDesc, characterControlMat);
                // TODO: centralize filter data construction
                shape.SimulationFilterData = new FilterData((uint)OpenH2FilterData.PlayerCharacter, 0, 0, 0);

                shape.ContactOffset = 0.001f;
                shape.RestOffset    = 0.0009f;

                var bodyProxy = new RigidBodyProxy(body);
                component.PhysicsImplementation = bodyProxy;
                this.physxScene.AddActor(body);

                if (component.State is DynamicMovementController dynamicMover)
                {
                    var contactInfo = ContactCallbackData.Normal;
                    this.contactProvider.RegisterContactCallback(body, contactInfo, dynamicMover.ContactFound);
                }
            }
        }
コード例 #16
0
 public Controller CreateCharacterController(CapsuleControllerDesc desc)
 {
     return(physics.ControllerManager.CreateController(this.scene, desc));
 }
コード例 #17
0
ファイル: PhysXTest.cs プロジェクト: TopXiong/GameServer
        public void Awake()
        {
            Console.WriteLine("StartGame");
            //初始化物理
            ErrorOutput errorOutput = new ErrorOutput();
            Foundation  foundation  = new Foundation(errorOutput);

            //var pvd = new PhysX.VisualDebugger.ConnectionManager
            Physics = new Physics(foundation);
            var sceneDesc = new SceneDesc
            {
                Gravity      = new System.Numerics.Vector3(0, -9.81f, 0),
                FilterShader = new SampleFilterShader()
            };

            Scene = Physics.CreateScene(sceneDesc);

            this.Scene.SetVisualizationParameter(VisualizationParameter.Scale, 2.0f);
            this.Scene.SetVisualizationParameter(VisualizationParameter.CollisionShapes, true);
            this.Scene.SetVisualizationParameter(VisualizationParameter.JointLocalFrames, true);
            this.Scene.SetVisualizationParameter(VisualizationParameter.JointLimits, true);
            this.Scene.SetVisualizationParameter(VisualizationParameter.ActorAxes, true);

            Physics.PvdConnectionManager.Connect("localhost", 5425);

            //创建平面
            var groundPlaneMaterial = this.Scene.Physics.CreateMaterial(0.1f, 0.1f, 0.1f);
            var groundPlane         = this.Scene.Physics.CreateRigidStatic();

            groundPlane.GlobalPose = Matrix4x4.CreateFromAxisAngle(new System.Numerics.Vector3(0, 0, 1), (float)System.Math.PI / 2);
            groundPlane.Name       = "Ground Plane";
            var planeGeom = new PlaneGeometry();

            groundPlane.CreateShape(planeGeom, groundPlaneMaterial);
            this.Scene.AddActor(groundPlane);

            //创建角色
            var material          = Scene.Physics.CreateMaterial(0.1f, 0.1f, 0.1f);
            var controllerManager = Scene.CreateControllerManager();
            {
                var desc = new CapsuleControllerDesc()
                {
                    Height         = 4,
                    Radius         = 1,
                    Material       = material,
                    UpDirection    = new Vector3(0, 1, 0),
                    Position       = new Vector3(0, 3, 0),
                    ReportCallback = new ControllerHitReport()
                };

                _controller = controllerManager.CreateController <CapsuleController>(desc);
            }
            //再来一个不动的
            {
                var desc = new CapsuleControllerDesc()
                {
                    Height      = 4,
                    Radius      = 1,
                    Material    = material,
                    UpDirection = new Vector3(0, 1, 0),
                    Position    = new Vector3(15, 3, 15)
                };

                controllerManager.CreateController <CapsuleController>(desc);
            }
        }
コード例 #18
0
 public Controller CreateCharacterController(CapsuleControllerDesc desc)
 {
     return physics.ControllerManager.CreateController(this.scene, desc);
 }
コード例 #19
0
        public override object Process(Scene scene, Frame node)
        {
            if (scene == null || scene.Physics == null)
            {
                return(null);
            }

            string tag = node.Tag;

            if (tag == null)
            {
                return(null);
            }

            var match = _regex.Match(tag);

            if (!match.Success)
            {
                return(null);
            }

            var obj = node.Component as IFrameMesh;

            if (obj == null)
            {
                return(null);
            }

            CharacterControllerDesc controllerDesc;
            var shapeDesc = obj.Mesh.CreateShapeDescriptor();

            if (shapeDesc.Type == Physics.ShapeType.BOX)
            {
                BoxShapeDesc box = (BoxShapeDesc)shapeDesc;
                controllerDesc = new BoxControllerDesc
                {
                    Extents     = box.Dimensions,
                    Position    = box.LocalPose.Translation + node.GlobalPose.Translation,
                    UpDirection = HeightFieldAxis.Y,
                    SlopeLimit  = (float)Math.Cos(Numerics.ToRadians(45.0f)),
                    Name        = node.Name
                };
            }
            else if (shapeDesc.Type == Physics.ShapeType.CAPSULE)
            {
                CapsuleShapeDesc capsuleShape = (CapsuleShapeDesc)shapeDesc;
                controllerDesc = new CapsuleControllerDesc
                {
                    Height      = capsuleShape.Height,
                    Position    = capsuleShape.LocalPose.Translation + node.GlobalPose.Translation,
                    Radius      = capsuleShape.Radius,
                    UpDirection = HeightFieldAxis.Y,
                    SlopeLimit  = (float)Math.Cos(Numerics.ToRadians(45.0f)),
                    Name        = node.Name
                };
            }
            else
            {
                return(null);
            }

            Frame bindedNode = null;

            if (match.Groups["BINDING"].Success)
            {
                bindedNode = scene.FindNode(match.Groups["BINDING"].Value);
            }
            if (ControllerCreated != null)
            {
                ControllerCreated(controllerDesc, bindedNode);
            }


            var controller = CharacterControllerManager.Instance.CreateController(scene.Physics, controllerDesc);

            if (bindedNode != null)
            {
                bindedNode.BindTo(controller);
            }

            obj.Mesh.Dispose();
            node.Remove();
            node.Dispose();

            return(controller);
        }