public void CreateExclusiveShape_IsInActorsShapesProperty() { using (var physics = CreatePhysicsAndScene()) { var material = physics.Physics.CreateMaterial(0.2f, 0.1f, 0.2f); var rigid = physics.Physics.CreateRigidDynamic(); Assert.AreEqual(0, rigid.Shapes.Count); var box = RigidActorExt.CreateExclusiveShape(rigid, new BoxGeometry(2, 3, 4), material); Assert.AreEqual(1, rigid.Shapes.Count); } }
private void CreateGroundPlane() { var groundPlaneMaterial = this.Scene.Physics.CreateMaterial(0.1f, 0.1f, 0.1f); var groundPlane = this.Scene.Physics.CreateRigidStatic(); groundPlane.Name = "Ground Plane"; groundPlane.GlobalPose = Matrix4x4.CreateFromAxisAngle(new System.Numerics.Vector3(0, 0, 1), (float)System.Math.PI / 2); var planeGeom = new PlaneGeometry(); RigidActorExt.CreateExclusiveShape(groundPlane, planeGeom, groundPlaneMaterial, null); this.Scene.AddActor(groundPlane); }
public void CreateBox(Scene.Entity3D ent) { Scene.Bounds bb = ent.Bounds; ID = PhysicsManager.py.CreateRigidDynamic(); BoxGeometry ge = new BoxGeometry(bb.W / 2, bb.H / 2, bb.D / 2); // Shape = ID.CreateShape ( ge, Mat ); ID.LinearVelocity = new System.Numerics.Vector3(0, 0, 0); Shape = RigidActorExt.CreateExclusiveShape(ID, ge, Mat); //Pose = ID.GlobalPose; var wm = ent.WorldNoScale; float m11 = wm.M11; float m12 = wm.M12; float m13 = wm.M13; float m14 = wm.M14; float m21 = wm.M21; float m22 = wm.M22; float m23 = wm.M23; float m24 = wm.M24; float m31 = wm.M31; float m32 = wm.M32; float m33 = wm.M33; float m34 = wm.M34; float m41 = wm.M41; float m42 = wm.M42; float m43 = wm.M43; float m44 = wm.M44; System.Numerics.Matrix4x4 tm = new System.Numerics.Matrix4x4(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44); ID.GlobalPose = tm; ID.SetMassAndUpdateInertia(3); Physics.PhysicsManager.Scene.AddActor(ID); }
private void ShootSphere() { const float force = 5000; var cameraPos = Camera.Position.AsPhysX(); var cameraDir = Camera.Direction.AsPhysX(); var material = this.Scene.Physics.CreateMaterial(0.1f, 0.5f, 0.5f); var rigidActor = this.Scene.Physics.CreateRigidDynamic(); var sphereGeom = new SphereGeometry(2); var boxShape = RigidActorExt.CreateExclusiveShape(rigidActor, sphereGeom, material, null); rigidActor.GlobalPose = Matrix4x4.CreateTranslation(cameraPos); rigidActor.SetMassAndUpdateInertia(100); this.Scene.AddActor(rigidActor); rigidActor.AddForceAtLocalPosition(cameraDir * force, new System.Numerics.Vector3(0, 0, 0), ForceMode.Impulse, true); }
public void AddTrigger(TriggerGeometryComponent component) { var halfSize = component.Size / 2f; var posPose = Matrix4x4.CreateTranslation(component.Transform.TransformationMatrix.Translation); var rot = Matrix4x4.CreateFromQuaternion(component.Transform.Orientation); var posCorrection = Matrix4x4.CreateTranslation(halfSize); var body = this.physxPhysics.CreateRigidStatic(posCorrection * rot * posPose); body.Name = component.Name; Geometry volume = component.Shape switch { TriggerGeometryShape.Cuboid => new BoxGeometry(halfSize), }; var shape = RigidActorExt.CreateExclusiveShape(body, volume, defaultMat, ShapeFlag.TriggerShape); shape.SimulationFilterData = new FilterData((uint)OpenH2FilterData.TriggerVolume, 0, 0, 0); body.UserData = component; this.physxScene.AddActor(body); }
public void CreateMesh(Scene.Entity3D ent) { System.Collections.Generic.List <OpenTK.Vector3> verts = ent.GetAllVerts(); System.Collections.Generic.List <int> tris = ent.GetAllTris(); System.Numerics.Vector3[] rvert = new System.Numerics.Vector3[verts.Count]; int vi = 0; foreach (OpenTK.Vector3 v in verts) { rvert[vi] = new System.Numerics.Vector3(v.X, v.Y, v.Z); vi++; } int[] at = new int[tris.Count]; for (int i = 0; i < tris.Count; i++) { at[i] = tris[i]; } TriangleMeshDesc tm = new TriangleMeshDesc() { Flags = 0, Triangles = at, Points = rvert }; Cooking cook = PhysicsManager.py.CreateCooking(); MemoryStream str = new MemoryStream(); TriangleMeshCookingResult cookr = cook.CookTriangleMesh(tm, str); str.Position = 0; TriangleMesh trim = PhysicsManager.py.CreateTriangleMesh(str); TriangleMeshGeometry trig = new TriangleMeshGeometry(trim); RID = PhysicsManager.py.CreateRigidStatic(); Shape ns = RigidActorExt.CreateExclusiveShape(RID, trig, Mat); //RID.CreateShape ( trig, Mat ); var wm = ent.WorldNoScale; float m11 = wm.M11; float m12 = wm.M12; float m13 = wm.M13; float m14 = wm.M14; float m21 = wm.M21; float m22 = wm.M22; float m23 = wm.M23; float m24 = wm.M24; float m31 = wm.M31; float m32 = wm.M32; float m33 = wm.M33; float m34 = wm.M34; float m41 = wm.M41; float m42 = wm.M42; float m43 = wm.M43; float m44 = wm.M44; System.Numerics.Matrix4x4 tp = new System.Numerics.Matrix4x4(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44); // RID.GlobalPose = System.Numerics.Matrix4x4.CreateRotationX(-(float)System.Math.PI / 2); //RID.GlobalPosePosition = ent.LocalPos; PhysicsManager.Scene.AddActor(RID); }
private void AddCollider(RigidActor actor, ICollider collider) { if (collider is AggregateCollider agg) { foreach (var c in agg.ColliderComponents) { AddCollider(actor, c); } } else if (collider is TriangleMeshCollider triCollider) { var desc = triCollider.GetDescriptor(GetMaterialIndices); // Avoiding offline cook path for now because // 1. Comments in Physx.Net imply memory leak using streams // 2. I don't want to deal with disk caching cooks yet var finalMesh = this.physxPhysics.CreateTriangleMesh(cooker, desc); var meshGeom = new TriangleMeshGeometry(finalMesh); RigidActorExt.CreateExclusiveShape(actor, meshGeom, globalMaterials, null); } else if (collider is TriangleModelCollider triModelCollider) { foreach (var mesh in triModelCollider.MeshColliders) { var desc = mesh.GetDescriptor(GetMaterialIndices); // Avoiding offline cook path for now because // 1. Comments in Physx.Net imply memory leak using streams // 2. I don't want to deal with disk caching cooks yet var finalMesh = this.physxPhysics.CreateTriangleMesh(cooker, desc); var meshGeom = new TriangleMeshGeometry(finalMesh); RigidActorExt.CreateExclusiveShape(actor, meshGeom, globalMaterials, null); } } else if (collider is IVertexBasedCollider vertCollider) { var desc = new ConvexMeshDesc() { Flags = ConvexFlag.ComputeConvex }; desc.SetPositions(vertCollider.GetTransformedVertices()); var mesh = this.physxPhysics.CreateConvexMesh(this.cooker, desc); var geom = new ConvexMeshGeometry(mesh); var mat = this.GetOrCreateMaterial(vertCollider.PhysicsMaterial); // TODO: re-use shared shapes instead of creating exclusive RigidActorExt.CreateExclusiveShape(actor, geom, mat); } else if (collider is ConvexModelCollider modelCollider) { foreach (var verts in modelCollider.Meshes) { var desc = new ConvexMeshDesc() { Flags = ConvexFlag.ComputeConvex }; desc.SetPositions(verts); var mesh = this.physxPhysics.CreateConvexMesh(this.cooker, desc); var geom = new ConvexMeshGeometry(mesh); var mat = this.GetOrCreateMaterial(modelCollider.PhysicsMaterial); // TODO: re-use shared shapes instead of creating exclusive RigidActorExt.CreateExclusiveShape(actor, geom, mat); } } }
// 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); } } }
/// <summary> /// A convenience/backwards-compatability method. /// </summary> public static Shape CreateShape(this RigidActor actor, PhysX.Geometry geometry, Material material) { return(RigidActorExt.CreateExclusiveShape(actor, geometry, material)); }