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); } }
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); } }
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); } }
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; }
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); }
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); }
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; }
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); }
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); }
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); } }
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); } }
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); } }
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); } }
// 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); } } }
public Controller CreateCharacterController(CapsuleControllerDesc desc) { return(physics.ControllerManager.CreateController(this.scene, desc)); }
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); } }
public Controller CreateCharacterController(CapsuleControllerDesc desc) { return physics.ControllerManager.CreateController(this.scene, desc); }
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); }