public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, string shapeName, int jengaHeight, int jengaWidth, Vector3 shapeSize, float density, bool enableSleeping) { Shape shape = scene.Factory.ShapeManager.Find(shapeName); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; int instanceIndexCount = 0; objectRoot = scene.Factory.PhysicsObjectManager.Create("Jenga " + instanceIndexName); for (int i = 0; i < jengaHeight; i++) { if (i % 2 == 0) { for (int j = 0; j < jengaWidth; j++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Jenga " + instanceIndexCount.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = shape; objectBase.UserDataStr = shapeName; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition((j - 0.5f * jengaWidth + 0.5f) * shapeSize.X, i * shapeSize.Y + 0.5f * shapeSize.Y, 0.0f); objectBase.InitLocalTransform.SetScale(0.5f * shapeSize.X, 0.5f * shapeSize.Y, 0.5f * shapeSize.Z * jengaWidth); objectBase.Integral.SetDensity(density); objectBase.EnableSleeping = enableSleeping; instanceIndexCount++; } } else { for (int j = 0; j < jengaWidth; j++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Jenga " + instanceIndexCount.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = shape; objectBase.UserDataStr = shapeName; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(0.0f, i * shapeSize.Y + 0.5f * shapeSize.Y, (j - 0.5f * jengaWidth + 0.5f) * shapeSize.Z); objectBase.InitLocalTransform.SetScale(0.5f * shapeSize.X * jengaWidth, 0.5f * shapeSize.Y, 0.5f * shapeSize.Z); objectBase.Integral.SetDensity(density); objectBase.EnableSleeping = enableSleeping; instanceIndexCount++; } } } objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); }
public void CreateLightSpot(int index, string soundGroup, Vector3 lightPosition, Vector3 lightColor, float lightRange, float minBreakRigidGroupMultiplier) { PhysicsObject objectRoot = null; PhysicsObject objectBase = null; PhysicsObject objectLight = null; Shape coneZ = scene.Factory.ShapeManager.Find("ConeZ"); objectRoot = scene.Factory.PhysicsObjectManager.Create("Light Spot Root " + index.ToString()); objectBase = scene.Factory.PhysicsObjectManager.Create("Light Spot Base " + index.ToString()); objectLight = scene.Factory.PhysicsObjectManager.Create("Light Spot " + index.ToString()); objectRoot.AddChildPhysicsObject(objectBase); objectRoot.AddChildPhysicsObject(objectLight); objectRoot.InitLocalTransform.SetPosition(ref lightPosition); objectRoot.EnableLocalGravity = true; objectRoot.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(90.0f))); objectBase.Shape = coneZ; objectBase.UserDataStr = "ConeZ"; objectBase.Material.RigidGroup = true; objectBase.Material.TwoSidedNormals = true; objectBase.Material.MinBreakRigidGroupVelocityMultiplier = minBreakRigidGroupMultiplier; objectBase.Material.UserDataStr = "Yellow"; objectBase.InitLocalTransform.SetScale(0.5f); objectBase.Integral.SetDensity(10.0f); objectBase.EnableBreakRigidGroup = false; objectBase.CreateSound(true); objectBase.Sound.UserDataStr = soundGroup; objectLight.Shape = coneZ; objectLight.UserDataStr = "ConeZ"; objectLight.Material.RigidGroup = true; objectLight.Material.UserDataStr = "Yellow"; objectLight.CreateLight(true); objectLight.Light.Type = PhysicsLightType.Spot; objectLight.Light.SetDiffuse(ref lightColor); objectLight.Light.SpotInnerRadAngle = (float)Math.Atan(0.48); objectLight.Light.SpotOuterRadAngle = (float)Math.Atan(0.48); objectLight.Light.Range = 2.0f * lightRange; objectLight.InitLocalTransform.SetScale(lightRange); objectLight.InitLocalTransform.SetPosition(0.0f, 0.0f, -lightRange + 0.5f); objectLight.EnableCollisions = false; objectLight.EnableCursorInteraction = false; objectLight.EnableBreakRigidGroup = false; objectLight.EnableAddToCameraDrawTransparentPhysicsObjects = false; scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, string shapeName, int wallSize, Vector3 shapeSize, float density, bool enableSleeping) { Shape shape = scene.Factory.ShapeManager.Find(shapeName); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Wall" + instanceIndexName); int instanceIndexCount = 0; for (int x = 0; x < wallSize; x++) { for (int y = 0; y < wallSize; y++) { if (y % 2 == 0) { objectBase = scene.Factory.PhysicsObjectManager.Create("Wall " + instanceIndexCount.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = shape; objectBase.UserDataStr = shapeName; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(x * shapeSize.X + 0.5f * shapeSize.X - 0.5f * shapeSize.X * wallSize, y * shapeSize.Y + 0.5f * shapeSize.Y, 0.0f); objectBase.InitLocalTransform.SetScale(0.5f * shapeSize.X, 0.5f * shapeSize.Y, 0.5f * shapeSize.Z); objectBase.Integral.SetDensity(density); objectBase.EnableSleeping = enableSleeping; instanceIndexCount++; } else { objectBase = scene.Factory.PhysicsObjectManager.Create("Wall " + instanceIndexCount.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = shape; objectBase.UserDataStr = shapeName; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(x * shapeSize.X - 0.5f * shapeSize.X * wallSize, y * shapeSize.Y + 0.5f * shapeSize.Y, 0.0f); objectBase.InitLocalTransform.SetScale(0.5f * shapeSize.X, 0.5f * shapeSize.Y, 0.5f * shapeSize.Z); objectBase.Integral.SetDensity(density); objectBase.EnableSleeping = enableSleeping; instanceIndexCount++; } } } objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); }
public void CreateLightPoint(int index, string soundGroup, Vector3 lightPosition, Vector3 lightColor, float lightRange, float minBreakRigidGroupMultiplier) { PhysicsObject objectRoot = null; PhysicsObject objectBase = null; PhysicsObject objectLight = null; Shape sphere = scene.Factory.ShapeManager.Find("Sphere"); objectRoot = scene.Factory.PhysicsObjectManager.Create("Light Point Root " + index.ToString()); objectBase = scene.Factory.PhysicsObjectManager.Create("Light Point Base " + index.ToString()); objectLight = scene.Factory.PhysicsObjectManager.Create("Light Point " + index.ToString()); objectRoot.AddChildPhysicsObject(objectBase); objectRoot.AddChildPhysicsObject(objectLight); objectRoot.InitLocalTransform.SetPosition(ref lightPosition); objectRoot.EnableLocalGravity = true; objectBase.Shape = sphere; objectBase.UserDataStr = "Sphere"; objectBase.Material.RigidGroup = true; objectBase.Material.TwoSidedNormals = true; objectBase.Material.MinBreakRigidGroupVelocityMultiplier = minBreakRigidGroupMultiplier; objectBase.Material.UserDataStr = "Yellow"; objectBase.InitLocalTransform.SetScale(0.5f); objectBase.Integral.SetDensity(10.0f); objectBase.EnableBreakRigidGroup = false; objectBase.CreateSound(true); objectBase.Sound.UserDataStr = soundGroup; objectLight.Shape = sphere; objectLight.UserDataStr = "Sphere"; objectLight.Material.RigidGroup = true; objectLight.Material.UserDataStr = "Yellow"; objectLight.CreateLight(true); objectLight.Light.Type = PhysicsLightType.Point; objectLight.Light.SetDiffuse(ref lightColor); objectLight.Light.Range = lightRange * 0.92f; objectLight.InitLocalTransform.SetScale(lightRange); objectLight.EnableCollisions = false; objectLight.EnableCursorInteraction = false; objectLight.EnableBreakRigidGroup = false; objectLight.EnableAddToCameraDrawTransparentPhysicsObjects = false; scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, string shapeName, int columnSize, Vector3 shapeSize, float density, bool enableSleeping, float soundTotalVelocityFactor, float soundAmplitudeFactor) { Shape shape = scene.Factory.ShapeManager.Find(shapeName); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Column" + instanceIndexName); for (int i = 0; i < columnSize; i++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Column " + i.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = shape; objectBase.UserDataStr = shapeName; objectBase.CreateSound(true); objectBase.Sound.TotalVelocityFactor = soundTotalVelocityFactor; objectBase.Sound.AmplitudeFactor = soundAmplitudeFactor; objectBase.InitLocalTransform.SetPosition(0.0f, i * shapeSize.Y + 0.5f * shapeSize.Y, 0.0f); objectBase.InitLocalTransform.SetScale(0.5f * shapeSize.X, 0.5f * shapeSize.Y, 0.5f * shapeSize.Z); objectBase.Integral.SetDensity(density); objectBase.EnableSleeping = enableSleeping; } objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create() { Shape sphere = scene.Factory.ShapeManager.Find("Sphere"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); Shape userShape1 = scene.Factory.ShapeManager.Find("UserShape 1"); Shape userShape2 = scene.Factory.ShapeManager.Find("UserShape 2"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Switch 2"); objectBase = scene.Factory.PhysicsObjectManager.Create("Switch 2 Shape"); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = userShape2; objectBase.UserDataStr = "UserShape2"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(40.0f, 20.0f, 40.0f); objectBase.InitLocalTransform.SetScale(2.0f); objectBase.Integral.SetDensity(10.0f); objectBase.EnableBreakRigidGroup = false; objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 40000.0f; objectBase = scene.Factory.PhysicsObjectManager.Create("Switch 2 Switch"); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Yellow"; objectBase.Material.RigidGroup = true; objectBase.Material.TransparencyFactor = 0.5f; objectBase.InitLocalTransform.SetPosition(37.0f, 20.0f, 40.0f); objectBase.InitLocalTransform.SetScale(1.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f))); objectBase.EnableBreakRigidGroup = false; objectBase.EnableCollisionResponse = false; objectBase.EnableCursorInteraction = false; scene.UpdateFromInitLocalTransform(objectRoot); }
void CreateTrunk(PhysicsScene scene, string instanceIndexName, int trunkCount, Vector3 trunkScale, Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation) { Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Plant Trunk" + instanceIndexName); for (int i = 0; i < trunkCount; i++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Plant Trunk " + i.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); //objectBase.Material.RigidGroup = true; objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(new Vector3(0.0f, 0.5f * trunkScale.Y + i * trunkScale.Y, 0.0f) + objectPosition); objectBase.InitLocalTransform.SetScale(trunkScale.X * 0.1f + 0.1f * (trunkCount - i), 0.5f * trunkScale.Y, trunkScale.Z * 0.1f + 0.1f * (trunkCount - i)); objectBase.Integral.SetDensity(10.0f); } objectRoot.UpdateFromInitLocalTransform(); Constraint constraint = null; for (int i = 0; i < trunkCount - 1; i++) { constraint = scene.Factory.ConstraintManager.Create("Trunk Constraint " + i.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + i.ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + (i + 1).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); } objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); objectRoot.UpdateFromInitLocalTransform(); }
public void Create() { Shape sphere = scene.Factory.ShapeManager.Find("Sphere"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); Shape userShape1 = scene.Factory.ShapeManager.Find("UserShape 1"); Shape userShape2 = scene.Factory.ShapeManager.Find("UserShape 2"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("ForceField 2"); objectBase = scene.Factory.PhysicsObjectManager.Create("ForceField 2 Shape"); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = userShape2; objectBase.UserDataStr = "UserShape2"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(20.0f, 20.0f, 70.0f); objectBase.InitLocalTransform.SetScale(2.0f); objectBase.Integral.SetDensity(100.0f); objectBase.EnableBreakRigidGroup = false; objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 400000.0f; objectBase = scene.Factory.PhysicsObjectManager.Create("ForceField 2 Field"); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Blue"; objectBase.Material.RigidGroup = true; objectBase.Material.TransparencyFactor = 0.5f; objectBase.InitLocalTransform.SetPosition(20.0f, 20.0f, 70.0f); objectBase.InitLocalTransform.SetScale(10.0f, 10.0f, 10.0f); objectBase.EnableBreakRigidGroup = false; objectBase.EnableCollisionResponse = false; objectBase.EnableCursorInteraction = false; scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create() { Shape coneY = scene.Factory.ShapeManager.Find("ConeY"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Cursor"); objectRoot.InitLocalTransform.SetPosition(0.0f, -0.036f, 0.0f); objectRoot.InitLocalTransform.SetRotation(Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(45.0f))); objectRoot.InitLocalTransform.SetScale(0.018f, 0.036f, 0.009f); objectRoot.EnableCollisions = false; objectRoot.DrawPriority = 5; objectBase = scene.Factory.PhysicsObjectManager.Create("Cursor A"); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = coneY; objectBase.UserDataStr = "ConeY"; objectBase.Material.RigidGroup = true; objectBase.Material.SetDiffuse(1.0f, 1.0f, 0.0f); objectBase.EnableCollisions = false; objectBase.EnableCursorInteraction = false; objectBase.DrawPriority = 7; objectBase = scene.Factory.PhysicsObjectManager.Create("Cursor B"); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.RigidGroup = true; objectBase.Material.SetDiffuse(1.0f, 1.0f, 0.0f); objectBase.InitLocalTransform.SetPosition(0.0f, -1.5f, 0.0f); objectBase.InitLocalTransform.SetScale(0.3f, 0.7f, 0.3f); objectBase.EnableCollisions = false; objectBase.EnableCursorInteraction = false; objectBase.DrawPriority = 6; scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create() { Shape sphere = scene.Factory.ShapeManager.Find("Sphere"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); Shape userShape1 = scene.Factory.ShapeManager.Find("UserShape 1"); Shape userShape2 = scene.Factory.ShapeManager.Find("UserShape 2"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Switch 1"); objectBase = scene.Factory.PhysicsObjectManager.Create("Switch 1 Shape"); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = userShape1; objectBase.UserDataStr = "UserShape1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(-40.0f, 20.0f, 40.0f); objectBase.InitLocalTransform.SetScale(2.0f); objectBase.Integral.SetDensity(10.0f); objectBase.EnableBreakRigidGroup = false; objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Switch 1 Switch"); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = sphere; objectBase.UserDataStr = "Sphere"; objectBase.Material.UserDataStr = "Yellow"; objectBase.Material.RigidGroup = true; objectBase.Material.TransparencyFactor = 0.5f; objectBase.InitLocalTransform.SetPosition(-36.0f, 20.0f, 40.0f); objectBase.InitLocalTransform.SetScale(1.0f); objectBase.EnableBreakRigidGroup = false; objectBase.EnableCollisionResponse = false; objectBase.EnableCursorInteraction = false; scene.UpdateFromInitLocalTransform(objectRoot); }
void CreateLeaf(PhysicsScene scene, string instanceIndexName, string leafInstanceIndexName, int trunkCount, Vector3 trunkScale, int leafCount, Vector3 leafScale, Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation) { Shape box = scene.Factory.ShapeManager.Find("Box"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Plant Leaf" + leafInstanceIndexName + instanceIndexName); for (int i = 0; i < leafCount; i++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Plant Leaf" + leafInstanceIndexName + i.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Leaf"; objectBase.InitLocalTransform.SetPosition(new Vector3(-leafScale.X * 2.0f * leafCount + leafScale.X + i * 2.0f * leafScale.X, trunkCount * trunkScale.Y, 0.0f) + objectPosition); objectBase.InitLocalTransform.SetScale(leafScale.X, leafScale.Y, leafScale.Z + (float)Math.Tan(1.0 / (leafCount - i + 1.0) - 0.9)); objectBase.Integral.SetDensity(0.1f); } objectRoot.UpdateFromInitLocalTransform(); Constraint constraint = null; for (int i = 0; i < leafCount - 1; i++) { constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName + i.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName + i.ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName + (i + 1).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleZ = -10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.LimitAngleForce = 0.5f; constraint.Update(); } for (int i = 0; i < leafCount - 1; i++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Plant Leaf Sub A" + leafInstanceIndexName + i.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Leaf"; objectBase.InitLocalTransform.SetPosition(new Vector3(-leafScale.X * 2.0f * leafCount + leafScale.X + i * 2.0f * leafScale.X, trunkCount * trunkScale.Y, -1.2f + (float)Math.Exp(10.0 / (leafCount - i + 5.8f))) + objectPosition); objectBase.InitLocalTransform.SetScale(leafScale.Z + (float)Math.Tan(1.0f / (leafCount - i + 1.0) - 0.5), leafScale.Y, leafScale.X); objectBase.InitLocalTransform.SetRotation(Matrix4.CreateFromAxisAngle(Vector3.UnitY, -MathHelper.DegreesToRadians(45.0f + (leafCount - i) * 6.0f))); objectBase.Integral.SetDensity(0.001f); } for (int i = 0; i < leafCount - 1; i++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Plant Leaf Sub B" + leafInstanceIndexName + i.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Leaf"; objectBase.InitLocalTransform.SetPosition(new Vector3(-leafScale.X * 2.0f * leafCount + leafScale.X + i * 2.0f * leafScale.X, trunkCount * trunkScale.Y, 1.2f - (float)Math.Exp(10.0 / (leafCount - i + 5.8f))) + objectPosition); objectBase.InitLocalTransform.SetScale(leafScale.Z + (float)Math.Tan(1.0f / (leafCount - i + 1.0) - 0.5), leafScale.Y, leafScale.X); objectBase.InitLocalTransform.SetRotation(Matrix4.CreateFromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(45.0f + (leafCount - i) * 6.0f))); objectBase.Integral.SetDensity(0.001f); } objectRoot.UpdateFromInitLocalTransform(); for (int i = 0; i < leafCount - 1; i++) { constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint Sub A" + leafInstanceIndexName + i.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf Sub A" + leafInstanceIndexName + i.ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName + i.ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleZ = -10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 400.0f; constraint.LimitAngleForce = 0.5f; constraint.Update(); } for (int i = 0; i < leafCount - 1; i++) { constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint Sub B" + leafInstanceIndexName + i.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf Sub B" + leafInstanceIndexName + i.ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName + i.ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleZ = -10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 400.0f; constraint.LimitAngleForce = 0.5f; constraint.Update(); } PhysicsObject objectA = null; PhysicsObject objectB = null; for (int i = 0; i < leafCount - 1; i++) { objectA = scene.Factory.PhysicsObjectManager.Find("Plant Leaf Sub A" + leafInstanceIndexName + i.ToString() + instanceIndexName); objectB = scene.Factory.PhysicsObjectManager.Find("Plant Leaf Sub B" + leafInstanceIndexName + i.ToString() + instanceIndexName); objectA.DisableCollision(objectB, true); } objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); objectRoot.UpdateFromInitLocalTransform(); }
public void Move(SimulateMethodArgs args) { PhysicsScene scene = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex); PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex); if (!objectBase.Camera.Enabled) { return; } if (!objectBase.Camera.Active) { return; } float time = (float)args.Time; Vector3 deltaRotation = vectorZero; Vector3 deltaTranslation = vectorZero; float rotationSpeed = 8.0f; float translationSpeed = 8.0f; bool enableShot = false; DemoMouseState mouseState = demo.GetMouseState(); DemoKeyboardState keyboardState = demo.GetKeyboardState(); if (mouseState[MouseButton.Right]) { deltaRotation.Y += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.X - oldMouseState.X) * time); deltaRotation.X += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.Y - oldMouseState.Y) * time); } if (mouseState[MouseButton.Middle] && !oldMouseState[MouseButton.Middle]) { enableShot = true; } if ((keyboardState[Key.ControlRight] && !oldKeyboardState[Key.ControlRight]) || (keyboardState[Key.ControlLeft] && !oldKeyboardState[Key.ControlLeft])) { enableShot = true; } if (keyboardState[Key.W]) { deltaTranslation.Z += translationSpeed * time; } if (keyboardState[Key.S]) { deltaTranslation.Z -= translationSpeed * time; } if (keyboardState[Key.D]) { deltaTranslation.X += translationSpeed * time; } if (keyboardState[Key.A]) { deltaTranslation.X -= translationSpeed * time; } oldMouseState = mouseState; oldKeyboardState = keyboardState; if (deltaRotation.LengthSquared != 0.0f) { Vector3 euler = vectorZero; objectBase.Camera.GetEuler(ref euler); Vector3.Add(ref euler, ref deltaRotation, out euler); objectBase.Camera.SetEuler(ref euler); Matrix4 rotationX, rotationY; Matrix4.CreateRotationX(-euler.X, out rotationX); Matrix4.CreateRotationY(-euler.Y, out rotationY); Matrix4.Mult(ref rotationY, ref rotationX, out cameraRotation); objectBase.Camera.SetRotation(ref cameraRotation); objectBase.MainWorldTransform.SetTransposeRotation(ref cameraRotation); objectBase.RecalculateMainTransform(); } if (deltaTranslation.LengthSquared != 0.0f) { objectBase.MainWorldTransform.GetRotation(ref rotation); Vector3.TransformVector(ref deltaTranslation, ref rotation, out direction); objectBase.MainWorldTransform.GetPosition(ref position); Vector3.Add(ref position, ref direction, out position); objectBase.MainWorldTransform.SetPosition(ref position); objectBase.RecalculateMainTransform(); } objectBase.Camera.Projection.CreatePerspectiveLH(1.0f, 11000.0f, 70.0f, demo.WindowWidth, demo.WindowHeight); objectBase.MainWorldTransform.GetPosition(ref position); objectBase.Camera.GetTransposeRotation(ref cameraRotation); objectBase.Camera.View.CreateLookAtLH(ref position, ref cameraRotation, 0.0f); objectBase.Camera.UpdateFrustum(); if (enableShot) { Vector3 shotScale, shotColor; string frameCountName = scene.SimulationFrameCount.ToString(); PhysicsObject shot = scene.Factory.PhysicsObjectManager.Create(shotName + frameCountName); PhysicsObject shotBase = scene.Factory.PhysicsObjectManager.Create(shotBaseName + frameCountName); PhysicsObject shotLight = scene.Factory.PhysicsObjectManager.Create(shotLightName + frameCountName); shot.AddChildPhysicsObject(shotBase); shot.AddChildPhysicsObject(shotLight); shotScale = shotColor = vectorZero; shotScale.X = shotScale.Y = shotScale.Z = 0.5f; objectBase.MainWorldTransform.GetPosition(ref position); objectBase.Camera.GetTransposeRotation(ref cameraRotation); direction.X = cameraRotation.Row2.X; direction.Y = cameraRotation.Row2.Y; direction.Z = cameraRotation.Row2.Z; Vector3.Multiply(ref direction, 300.0f, out direction); shot.InitLocalTransform.SetRotation(ref matrixIdentity); shot.InitLocalTransform.SetPosition(ref position); shot.InitLocalTransform.SetLinearVelocity(ref direction); shot.InitLocalTransform.SetAngularVelocity(ref vectorZero); shot.MaxSimulationFrameCount = 200; //shot.EnableLocalGravity = true; shotBase.Shape = sphere; shotBase.UserDataStr = sphereName; shotBase.InitLocalTransform.SetScale(ref shotScale); shotBase.Integral.SetDensity(10.0f); shotBase.Material.RigidGroup = true; shotBase.EnableBreakRigidGroup = false; shotBase.EnableCollisions = true; shotBase.DisableCollision(objectBase, true); shotBase.MaxDisableCollisionFrameCount = 50; shotLight.Shape = sphere; shotLight.UserDataStr = sphereName; shotLight.CreateLight(true); shotLight.Light.Type = PhysicsLightType.Point; shotLight.Light.Range = 20.0f; shotColor.X = (float)Math.Max(random.NextDouble(), random.NextDouble()); shotColor.Y = (float)Math.Max(random.NextDouble(), random.NextDouble()); shotColor.Z = (float)Math.Max(random.NextDouble(), random.NextDouble()); shotLight.Light.SetDiffuse(ref shotColor); shotLight.InitLocalTransform.SetScale(20.0f); shotLight.Material.RigidGroup = true; shotLight.EnableBreakRigidGroup = false; shotLight.EnableCollisions = false; shotLight.EnableCursorInteraction = false; shotLight.EnableAddToCameraDrawTransparentPhysicsObjects = false; scene.UpdateFromInitLocalTransform(shot); } objectBase.Camera.UpdatePhysicsObjects(true, true, true); objectBase.Camera.SortDrawPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType); objectBase.Camera.SortTransparentPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType); }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation) { Shape box = scene.Factory.ShapeManager.Find("Box"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; PhysicsObject objectA = null; PhysicsObject objectB = null; PhysicsObject objectC = null; Vector3 position1 = Vector3.Zero; Vector3 position2 = Vector3.Zero; Quaternion orientation1 = Quaternion.Identity; Quaternion orientation2 = Quaternion.Identity; objectRoot = scene.Factory.PhysicsObjectManager.Create("Amphibian 1" + instanceIndexName); objectRoot.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(0.0f))); objectRoot.InitLocalTransform.SetPosition(-10.0f, -7.5f, 20.0f); objectA = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Body" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectA); objectA.MaxPreUpdateLinearVelocity = 50.0f; objectA.MaxPostUpdateLinearVelocity = 50.0f; objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Body 1" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Paint1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(0.0f, 11.8f, 0.0f); objectBase.InitLocalTransform.SetScale(2.0f, 0.4f, 2.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Body 2" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Paint1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(0.0f, 10.7f, 0.0f); objectBase.InitLocalTransform.SetScale(6.5f, 0.7f, 10.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Body 3" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Paint1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(0.0f, 8.0f, 0.0f); objectBase.InitLocalTransform.SetScale(7.0f, 2.0f, 10.5f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Body 4" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Paint1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(0.0f, 4.5f, -0.5f); objectBase.InitLocalTransform.SetScale(5.0f, 1.5f, 10.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectB = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectB); objectB.MaxPreUpdateAngularVelocity = 10.0f; objectB.MaxPostUpdateAngularVelocity = 10.0f; objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Body Up" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Paint1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(0.0f, 14.5f, 0.0f); objectBase.InitLocalTransform.SetScale(3.0f, 0.5f, 3.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Body Down" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Paint1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(0.0f, 13.0f, 0.0f); objectBase.InitLocalTransform.SetScale(4.0f, 1.0f, 4.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectC = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Gun" + instanceIndexName); objectB.AddChildPhysicsObject(objectC); objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Gun Control" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Paint1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(0.0f, 13.0f, 3.3f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f))); objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 1.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Gun 1" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(-1.0f, 13.0f, 5.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.InitLocalTransform.SetScale(0.5f, 2.0f, 0.5f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Turret Gun 2" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(1.0f, 13.0f, 5.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.InitLocalTransform.SetScale(0.5f, 2.0f, 0.5f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 1" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Rubber"; objectBase.InitLocalTransform.SetPosition(-6.0f, 3.0f, 8.4f); objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 7000.0f; objectBase.Sound.MinSlideVelocityMagnitude = 1.0f; objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 2" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Rubber"; objectBase.InitLocalTransform.SetPosition(-6.0f, 3.0f, 2.2f); objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 7000.0f; objectBase.Sound.MinSlideVelocityMagnitude = 1.0f; objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 3" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Rubber"; objectBase.InitLocalTransform.SetPosition(-6.0f, 3.0f, -3.6f); objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 7000.0f; objectBase.Sound.MinSlideVelocityMagnitude = 1.0f; objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 4" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Rubber"; objectBase.InitLocalTransform.SetPosition(-6.0f, 3.0f, -9.2f); objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 7000.0f; objectBase.Sound.MinSlideVelocityMagnitude = 1.0f; objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 5" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Rubber"; objectBase.InitLocalTransform.SetPosition(6.0f, 3.0f, 8.4f); objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 7000.0f; objectBase.Sound.MinSlideVelocityMagnitude = 1.0f; objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 6" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Rubber"; objectBase.InitLocalTransform.SetPosition(6.0f, 3.0f, 2.2f); objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 7000.0f; objectBase.Sound.MinSlideVelocityMagnitude = 1.0f; objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 7" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Rubber"; objectBase.InitLocalTransform.SetPosition(6.0f, 3.0f, -3.6f); objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 7000.0f; objectBase.Sound.MinSlideVelocityMagnitude = 1.0f; objectBase = scene.Factory.PhysicsObjectManager.Create("Amphibian 1 Wheel 8" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Rubber"; objectBase.InitLocalTransform.SetPosition(6.0f, 3.0f, -9.2f); objectBase.InitLocalTransform.SetScale(2.5f, 1.0f, 2.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 7000.0f; objectBase.Sound.MinSlideVelocityMagnitude = 1.0f; objectRoot.UpdateFromInitLocalTransform(); objectBase = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Body Down" + instanceIndexName); objectBase.DisableCollision(scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Gun 1" + instanceIndexName), true); objectBase.DisableCollision(scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Gun 2" + instanceIndexName), true); Constraint constraint = null; constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Turret Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Body Down" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 1" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(0.0f, -1.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(0.0f, -1.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleZ = true; constraint.EnableControlAngleY = true; constraint.EnableBreak = true; constraint.MinBreakVelocity = 50.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Turret Gun Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Gun Control" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Turret Body Down" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(ref position1); constraint.SetAnchor2(ref position1); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MaxLimitDegAngleX = 45.0f; constraint.EnableControlAngleX = true; constraint.EnableBreak = true; constraint.MinBreakVelocity = 50.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 1 Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 1" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(-2.5f, 0.0f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(-2.5f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.MaxLimitDistanceY = 0.5f; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 2 Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 2" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(-2.5f, 0.0f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(-2.5f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.MaxLimitDistanceY = 0.5f; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 3 Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 3" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(-2.5f, 0.0f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(-2.5f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.MaxLimitDistanceY = 0.5f; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 4 Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 4" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(-2.5f, 0.0f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(-2.5f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.MaxLimitDistanceY = 0.5f; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 5 Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 5" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(2.5f, 0.0f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(2.5f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.MaxLimitDistanceY = 0.5f; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 6 Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 6" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(2.5f, 0.0f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(2.5f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.MaxLimitDistanceY = 0.5f; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 7 Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 7" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(2.5f, 0.0f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(2.5f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.MaxLimitDistanceY = 0.5f; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Amphibian 1 Wheel 8 Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Body 4" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Amphibian 1 Wheel 8" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(2.5f, 0.0f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(2.5f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.MaxLimitDistanceY = 0.5f; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation) { Shape box = scene.Factory.ShapeManager.Find("Box"); Shape capsuleY = scene.Factory.ShapeManager.Find("CapsuleY"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; PhysicsObject objectA = null; PhysicsObject objectB = null; PhysicsObject objectC = null; Vector3 position1 = Vector3.Zero; Quaternion orientation1 = Quaternion.Identity; Quaternion orientation2 = Quaternion.Identity; objectRoot = scene.Factory.PhysicsObjectManager.Create("Boat 1" + instanceIndexName); objectA = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body" + instanceIndexName); objectA.EnableFeedback = true; objectRoot.AddChildPhysicsObject(objectA); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 0" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood2"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -92.5f, -319.0f); objectBase.InitLocalTransform.SetScale(13.0f, 0.5f, 19.0f); objectBase.Integral.SetDensity(0.5f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 1" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood2"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -95.0f, -300.0f); objectBase.InitLocalTransform.SetScale(15.0f, 2.0f, 40.0f); objectBase.Integral.SetDensity(0.5f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 2" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood2"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.InitLocalTransform.SetPosition(24.0f, -91.0f, -300.0f); objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 40.0f); objectBase.Integral.SetDensity(0.5f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 3" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood2"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.InitLocalTransform.SetPosition(-4.0f, -91.0f, -300.0f); objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 40.0f); objectBase.Integral.SetDensity(0.5f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 4" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood2"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -91.0f, -259.0f); objectBase.InitLocalTransform.SetScale(15.0f, 2.0f, 1.0f); objectBase.Integral.SetDensity(0.5f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 5" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood2"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -91.0f, -339.0f); objectBase.InitLocalTransform.SetScale(13.0f, 2.0f, 1.0f); objectBase.Integral.SetDensity(2.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 6" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood2"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -88.75f, -278.0f); objectBase.InitLocalTransform.SetScale(15.0f, 0.25f, 20.0f); objectBase.Integral.SetDensity(0.5f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Body Box 7" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood2"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -91.0f, -299.0f); objectBase.InitLocalTransform.SetScale(13.0f, 2.0f, 1.0f); objectBase.Integral.SetDensity(0.5f); objectBase.CreateSound(true); objectB = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectB); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Capsule 1" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = capsuleY; objectBase.UserDataStr = "CapsuleY"; objectBase.Material.UserDataStr = "Plastic1"; objectBase.Material.SetSpecular(0.1f, 0.1f, 0.1f); objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -85.0f, -340.0f); objectBase.InitLocalTransform.SetScale(4.0f, 2.0f, 1.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(5.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Box 1" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -87.6f, -340.0f); objectBase.InitLocalTransform.SetScale(2.0f, 0.8f, 3.0f); objectBase.Integral.SetDensity(5.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Box 2" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -86.2f, -340.0f); objectBase.InitLocalTransform.SetScale(1.0f, 0.6f, 3.0f); objectBase.Integral.SetDensity(5.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Cylinder 1" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -88.7f, -339.0f); objectBase.InitLocalTransform.SetScale(1.0f, 0.3f, 1.0f); objectBase.Integral.SetDensity(3.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Cylinder 2" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -87.6f, -335.2f); objectBase.InitLocalTransform.SetScale(0.2f, 1.8f, 0.2f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(3.0f); objectBase.EnableBreakRigidGroup = false; objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Cylinder 3" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -93.4f, -342.0f); objectBase.InitLocalTransform.SetScale(0.5f, 5.0f, 0.5f); objectBase.Integral.SetDensity(3.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Cylinder 4" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -98.0f, -342.0f); objectBase.InitLocalTransform.SetScale(1.0f, 0.5f, 1.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(3.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Cylinder 5" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -98.0f, -343.0f); objectBase.InitLocalTransform.SetScale(0.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(3.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Switch" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Yellow"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.Material.TransparencyFactor = 0.5f; objectBase.InitLocalTransform.SetPosition(10.0f, -87.6f, -335.0f); objectBase.InitLocalTransform.SetScale(1.5f, 2.0f, 1.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.EnableBreakRigidGroup = false; objectBase.EnableCollisionResponse = false; objectBase.EnableCursorInteraction = false; objectC = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Rotor" + instanceIndexName); objectC.MaxPreUpdateAngularVelocity = 10.0f; objectC.MaxPostUpdateAngularVelocity = 10.0f; objectRoot.AddChildPhysicsObject(objectC); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Rotor Cylinder 1" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Brass"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -98.0f, -344.0f); objectBase.InitLocalTransform.SetScale(1.0f, 0.5f, 1.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(3.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Rotor Box 1" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Brass"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(10.0f, -96.1f, -344.0f); objectBase.InitLocalTransform.SetScale(0.1f, 1.0f, 0.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(45.0f))); objectBase.Integral.SetDensity(3.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Rotor Box 2" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Brass"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(11.6f, -98.9f, -344.0f); objectBase.InitLocalTransform.SetScale(0.1f, 1.0f, 0.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(45.0f)) * Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(120.0f))); objectBase.Integral.SetDensity(3.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Boat 1 Engine Rotor Box 3" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Brass"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(8.4f, -98.9f, -344.0f); objectBase.InitLocalTransform.SetScale(0.1f, 1.0f, 0.5f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(45.0f)) * Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(240.0f))); objectBase.Integral.SetDensity(3.0f); objectBase.CreateSound(true); objectRoot.UpdateFromInitLocalTransform(); Constraint constraint = null; constraint = scene.Factory.ConstraintManager.Create("Boat 1 Constraint 1" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Boat 1 Engine Cylinder 1" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Boat 1 Body Box 5" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.3f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.3f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleY = -15.0f; constraint.MaxLimitDegAngleY = 15.0f; constraint.EnableBreak = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Boat 1 Constraint 2" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Boat 1 Engine Rotor Cylinder 1" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Boat 1 Engine Cylinder 5" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, 0.5f)); constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, 0.5f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableBreak = true; constraint.Update(); objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create(Vector3 objectPosition, Quaternion objectOrientationX, Quaternion objectOrientationY, Quaternion objectOrientationZ, bool actived) { Quaternion objectOrientationXY, objectOrientation; Shape sphere = scene.Factory.ShapeManager.Find("Sphere"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); PhysicsObject objectRoot = null; PhysicsObject objectUp = null; PhysicsObject objectBody = null; PhysicsObject objectDown = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Camera 2" + instanceIndexName); objectRoot.MaxPreUpdateAngularVelocity = 0.0f; objectRoot.MaxPostUpdateAngularVelocity = 0.0f; objectRoot.EnableBreakRigidGroup = false; objectRoot.EnableCursorInteraction = false; objectRoot.EnableDrawing = false; objectRoot.MaxSleepLinearVelocity = 0.1f; objectRoot.MaxSleepAngularVelocity = 0.1f; objectRoot.FluidPressureFactor = 0.46f; objectRoot.CreateSound(true); objectRoot.Sound.UserDataStr = "Footsteps"; objectUp = scene.Factory.PhysicsObjectManager.Create("Camera 2 Up" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectUp); objectUp.Material.RigidGroup = true; objectUp.Shape = sphere; objectUp.UserDataStr = "Sphere"; objectUp.InitLocalTransform.SetPosition(0.0f, 2.0f, 0.0f); objectUp.InitLocalTransform.SetScale(1.5f, 1.0f, 1.5f); objectUp.Integral.SetDensity(0.1f); objectUp.EnableBreakRigidGroup = false; objectUp.EnableCursorInteraction = false; objectUp.EnableDrawing = false; objectUp.PostTransformPriority = 1; objectUp.MinResponseLinearVelocity = 0.005f; objectUp.MinResponseAngularVelocity = 0.005f; objectUp.CreateCamera(true); objectUp.Camera.Active = actived; objectUp.InternalControllers.CreateCursorController(true); objectUp.CreateSound(false); objectUp.Sound.Range = 100.0f; objectUp.Sound.HitPitch = -0.8f; objectBody = scene.Factory.PhysicsObjectManager.Create("Camera 2 Body" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBody); objectBody.Material.RigidGroup = true; objectBody.Shape = cylinderY; objectBody.UserDataStr = "CylinderY"; objectBody.InitLocalTransform.SetPosition(0.0f, 0.0f, 0.0f); objectBody.InitLocalTransform.SetScale(2.0f); objectBody.Integral.SetDensity(1.0f); objectBody.EnableBreakRigidGroup = false; objectBody.EnableCursorInteraction = false; objectBody.EnableDrawing = false; objectBody.MinResponseLinearVelocity = 0.005f; objectBody.MinResponseAngularVelocity = 0.005f; objectDown = scene.Factory.PhysicsObjectManager.Create("Camera 2 Down" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectDown); objectDown.Material.RigidGroup = true; objectDown.Shape = sphere; objectDown.UserDataStr = "Sphere"; objectDown.InitLocalTransform.SetPosition(0.0f, -2.0f, 0.0f); objectDown.InitLocalTransform.SetScale(1.5f, 2.0f, 1.5f); objectDown.Integral.SetDensity(0.5f); objectDown.EnableBreakRigidGroup = false; objectDown.EnableCursorInteraction = false; objectDown.EnableDrawing = false; objectDown.MinResponseLinearVelocity = 0.005f; objectDown.MinResponseAngularVelocity = 0.005f; objectRoot.InitLocalTransform.SetOrientation(ref objectOrientationY); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); objectRoot.UpdateFromInitLocalTransform(); Vector3 position = Vector3.Zero; Matrix4 cameraRotation = Matrix4.Identity; Quaternion.Multiply(ref objectOrientationX, ref objectOrientationY, out objectOrientationXY); Quaternion.Multiply(ref objectOrientationXY, ref objectOrientationZ, out objectOrientation); Matrix4 rotation = Matrix4.CreateFromQuaternion(objectOrientation); objectUp.Camera.SetOrientation(ref objectOrientation); objectUp.Camera.SetRotation(ref rotation); objectUp.Camera.SetEuler(ref rotation); objectUp.Camera.Projection.CreatePerspectiveLH(1.0f, 11000.0f, 70.0f, demo.WindowWidth, demo.WindowHeight); objectUp.MainWorldTransform.GetPosition(ref position); objectUp.Camera.GetTransposeRotation(ref cameraRotation); objectUp.Camera.View.CreateLookAtLH(ref position, ref cameraRotation, 0.0f); objectUp.Camera.UpdateFrustum(); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create(PhysicsObject startObject, PhysicsObject endObject, Vector3 startPosition, Vector3 endPosition, int boardCount, Vector2 boardXYScale) { Shape sphere = scene.Factory.ShapeManager.Find("Sphere"); Shape box = scene.Factory.ShapeManager.Find("Box"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; PhysicsObject objectTruss = null; Vector3 position1 = Vector3.Zero; Vector3 position2 = Vector3.Zero; Vector3 scale1 = Vector3.One; Vector3 scale2 = Vector3.One; Quaternion orientation1 = Quaternion.Identity; Quaternion orientation2 = Quaternion.Identity; objectRoot = scene.Factory.PhysicsObjectManager.Create("Bridge 2 " + instanceIndexName); endPosition.Y = startPosition.Y; Vector3 distance = startPosition - endPosition; float length = distance.Length; float boardLength = length / boardCount; Vector3 boardScale = new Vector3(boardXYScale.X, boardXYScale.Y, boardLength * 0.5f); for (int i = 0; i < boardCount; i++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Board " + i.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood1"; objectBase.InitLocalTransform.SetPosition(startPosition.X, startPosition.Y, startPosition.Z + i * 2.0f * boardScale.Z + boardScale.Z); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90.0f))); objectBase.InitLocalTransform.SetScale(boardLength * 0.5f, 0.4f, 15.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); } int trussCount = boardCount / 2; for (int i = 0; i < trussCount; i++) { objectTruss = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Right " + i.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectTruss); objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Right Base " + i.ToString() + instanceIndexName); objectTruss.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(startPosition.X + 14.0f, startPosition.Y + boardLength * 0.25f + 0.4f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z); objectBase.InitLocalTransform.SetScale(0.4f, boardLength * 0.25f, 0.4f); objectBase.Integral.SetDensity(1.0f); objectBase.EnableBreakRigidGroup = false; objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Right Light Base " + i.ToString() + instanceIndexName); objectTruss.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.TwoSidedNormals = true; objectBase.Material.UserDataStr = "Yellow"; objectBase.InitLocalTransform.SetPosition(startPosition.X + 14.0f, startPosition.Y + boardLength * 0.5f + 1.0f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z); objectBase.InitLocalTransform.SetScale(0.6f); objectBase.Integral.SetDensity(1.0f); objectBase.EnableBreakRigidGroup = false; objectBase.CreateSound(true); objectBase.Sound.UserDataStr = "Glass"; objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Right Light " + i.ToString() + instanceIndexName); objectTruss.AddChildPhysicsObject(objectBase); objectBase.Shape = sphere; objectBase.UserDataStr = "Sphere"; objectBase.Material.RigidGroup = true; objectBase.Material.UserDataStr = "Yellow"; objectBase.InitLocalTransform.SetPosition(startPosition.X + 14.0f, startPosition.Y + boardLength * 0.5f + 1.0f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z); objectBase.InitLocalTransform.SetScale(15.0f); objectBase.CreateLight(true); objectBase.Light.Type = PhysicsLightType.Point; objectBase.Light.SetDiffuse(1.0f, 0.7f, 0.0f); objectBase.Light.Range = 15.0f; objectBase.EnableBreakRigidGroup = false; objectBase.EnableCollisions = false; objectBase.EnableCursorInteraction = false; objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false; } for (int i = 0; i < trussCount; i++) { objectTruss = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Left " + i.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectTruss); objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Left Base " + i.ToString() + instanceIndexName); objectTruss.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(startPosition.X - 14.0f, startPosition.Y + boardLength * 0.25f + 0.4f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z); objectBase.InitLocalTransform.SetScale(0.4f, boardLength * 0.25f, 0.4f); objectBase.Integral.SetDensity(1.0f); objectBase.EnableBreakRigidGroup = false; objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Left Light Base " + i.ToString() + instanceIndexName); objectTruss.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.TwoSidedNormals = true; objectBase.Material.UserDataStr = "Yellow"; objectBase.InitLocalTransform.SetPosition(startPosition.X - 14.0f, startPosition.Y + boardLength * 0.5f + 1.0f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z); objectBase.InitLocalTransform.SetScale(0.6f); objectBase.Integral.SetDensity(1.0f); objectBase.EnableBreakRigidGroup = false; objectBase.CreateSound(true); objectBase.Sound.UserDataStr = "Glass"; objectBase = scene.Factory.PhysicsObjectManager.Create("Bridge 2 Truss Left Light " + i.ToString() + instanceIndexName); objectTruss.AddChildPhysicsObject(objectBase); objectBase.Shape = sphere; objectBase.UserDataStr = "Sphere"; objectBase.Material.RigidGroup = true; objectBase.Material.UserDataStr = "Yellow"; objectBase.InitLocalTransform.SetPosition(startPosition.X - 14.0f, startPosition.Y + boardLength * 0.5f + 1.0f, startPosition.Z + i * 4.0f * boardScale.Z + boardScale.Z); objectBase.InitLocalTransform.SetScale(15.0f); objectBase.CreateLight(true); objectBase.Light.Type = PhysicsLightType.Point; objectBase.Light.SetDiffuse(1.0f, 0.7f, 0.0f); objectBase.Light.Range = 15.0f; objectBase.EnableBreakRigidGroup = false; objectBase.EnableCollisions = false; objectBase.EnableCursorInteraction = false; objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false; } objectRoot.UpdateFromInitLocalTransform(); Constraint constraint = null; for (int i = 0; i < trussCount; i++) { constraint = scene.Factory.ConstraintManager.Create("Bridge 2 Truss Right Constraint " + i.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Right Base " + i.ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board " + (i * 2).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, boardLength * 0.25f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, boardLength * 0.25f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.EnableBreak = true; constraint.Update(); } for (int i = 0; i < trussCount; i++) { constraint = scene.Factory.ConstraintManager.Create("Bridge 2 Truss Left Constraint " + i.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Left Base " + i.ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board " + (i * 2).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, boardLength * 0.25f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, boardLength * 0.25f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.EnableBreak = true; constraint.Update(); } constraint = scene.Factory.ConstraintManager.Create("Bridge 2 Constraint 0" + instanceIndexName); constraint.PhysicsObject1 = startObject; constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board 0" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(ref startPosition); constraint.SetAnchor2(ref startPosition); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.EnableBreak = true; constraint.AngularDamping = 0.1f; constraint.Update(); for (int i = 0; i < boardCount - 1; i++) { constraint = scene.Factory.ConstraintManager.Create("Bridge 2 Constraint " + (i + 1).ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board " + i.ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board " + (i + 1).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, boardScale.Z)); constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, boardScale.Z)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.EnableBreak = true; constraint.AngularDamping = 0.1f; constraint.Update(); } constraint = scene.Factory.ConstraintManager.Create("Bridge 2 Constraint " + (boardCount + 1).ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Board " + (boardCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = endObject; constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(ref endPosition); constraint.SetAnchor2(ref endPosition); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.EnableBreak = true; constraint.AngularDamping = 0.1f; constraint.Update(); scene.UpdateFromInitLocalTransform(objectRoot); Rope rope = null; int ropeSegmentCount = 4; PhysicsObject ropeStartObject = null; PhysicsObject ropeEndObject = null; for (int i = 0; i < trussCount - 1; i++) { ropeStartObject = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Left Base " + i.ToString() + instanceIndexName); ropeEndObject = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Left Base " + (i + 1).ToString() + instanceIndexName); ropeStartObject.MainWorldTransform.GetPosition(ref position1); ropeEndObject.MainWorldTransform.GetPosition(ref position2); ropeStartObject.MainWorldTransform.GetScale(ref scale1); ropeEndObject.MainWorldTransform.GetScale(ref scale2); position1 += new Vector3(0.0f, scale1.Y - scale1.Z, scale1.Z); position2 += new Vector3(0.0f, scale2.Y - scale1.Z, -scale2.Z); rope = new Rope(demo, i); rope.Initialize(scene); rope.Create(ropeStartObject, ropeEndObject, position1, position2, ropeSegmentCount); } for (int i = 0; i < trussCount - 1; i++) { ropeStartObject = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Right Base " + i.ToString() + instanceIndexName); ropeEndObject = scene.Factory.PhysicsObjectManager.Find("Bridge 2 Truss Right Base " + (i + 1).ToString() + instanceIndexName); ropeStartObject.MainWorldTransform.GetPosition(ref position1); ropeEndObject.MainWorldTransform.GetPosition(ref position2); ropeStartObject.MainWorldTransform.GetScale(ref scale1); ropeEndObject.MainWorldTransform.GetScale(ref scale2); position1 += new Vector3(0.0f, scale1.Y - scale1.Z, scale1.Z); position2 += new Vector3(0.0f, scale2.Y - scale1.Z, -scale2.Z); rope = new Rope(demo, i + trussCount); rope.Initialize(scene); rope.Create(ropeStartObject, ropeEndObject, position1, position2, ropeSegmentCount); } }
public void Move(SimulateMethodArgs args) { PhysicsScene scene = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex); PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex); float time = args.Time; if ((bodyUp == null) || (bodyDown == null) || (turretBodyUp == null) || (turretBodyDown == null) || (turretGun1 == null) || (turretGun2 == null) || (turretConstraint == null)) { return; } totalTime += time; PhysicsObject turret = turretBodyUp.RigidGroupOwner; if (objectBase.IsBrokenRigidGroup || turret.IsBrokenRigidGroup || turretConstraint.IsBroken) { return; } Vector3 gravityDirection = vectorZero; Vector3 upObjectForce = vectorZero; Vector3 upTurretForce = vectorZero; Vector3 distance = vectorZero; Vector3 direction = vectorZero; scene.GetGravityDirection(ref gravityDirection); Vector3.Multiply(ref gravityDirection, -scene.GravityAcceleration * objectBase.Integral.Mass, out upObjectForce); Vector3.Multiply(ref gravityDirection, -scene.GravityAcceleration * turret.Integral.Mass, out upTurretForce); objectBase.WorldAccumulator.AddWorldForce(ref upObjectForce); turret.WorldAccumulator.AddWorldForce(ref upTurretForce); PhysicsObject amphibian1Body = scene.Factory.PhysicsObjectManager.Find(amphibian1BodyName); PhysicsObject amphibian1TurretBodyDown = scene.Factory.PhysicsObjectManager.Find(amphibian1TurretBodyDownName); Constraint amphibian1TurretConstraint = scene.Factory.ConstraintManager.Find(amphibian1TurretConstraintName); Vector3 bodyDownPosition = vectorZero; if ((amphibian1Body != null) && (amphibian1TurretBodyDown != null) && (amphibian1TurretConstraint != null) && !amphibian1Body.IsBrokenRigidGroup && !amphibian1TurretConstraint.IsBroken) { Vector3 amphibianTurretPosition = vectorZero; amphibian1TurretBodyDown.RigidGroupOwner.MainWorldTransform.GetPosition(ref amphibianTurretPosition); bodyDown.MainWorldTransform.GetPosition(ref bodyDownPosition); Vector3.Subtract(ref amphibianTurretPosition, ref bodyDownPosition, out distance); Vector3.Normalize(ref distance, out direction); } Vector3 force = vectorZero; Vector3 right = vectorZero; Vector3.Cross(ref direction, ref unitY, out right); Vector3.Multiply(ref right, 100.0f, out right); if (frameCount < 200) { Vector3.Subtract(ref force, ref right, out force); } else { Vector3.Add(ref force, ref right, out force); } if (frameCount > 400) { frameCount = 0; } if (distance.Length > 100.0f) { Vector3.Multiply(ref direction, 1000.0f, out right); Vector3.Add(ref force, ref right, out force); } if (distance.Y > 0.0f) { force.Y += distance.Y * 100.0f; } objectBase.WorldAccumulator.AddWorldForce(ref force); turret.WorldAccumulator.AddWorldForce(ref force); frameCount++; shotFrameCount++; Vector3 turretAxis = vectorZero; Vector3 turretDirection = vectorZero; Vector3 turretGunPosition = vectorZero; Vector3 turretBodyDownPosition = vectorZero; Vector3 turretGun1Position = vectorZero; Vector3 turretGun2Position = vectorZero; turretBodyDown.MainWorldTransform.GetPosition(ref turretBodyDownPosition); turretGun1.MainWorldTransform.GetPosition(ref turretGun1Position); turretGun2.MainWorldTransform.GetPosition(ref turretGun2Position); Vector3.Add(ref turretGun1Position, ref turretGun2Position, out turretGunPosition); Vector3.Multiply(ref turretGunPosition, 0.5f, out turretGunPosition); Vector3.Subtract(ref turretGunPosition, ref turretBodyDownPosition, out turretDirection); turretDirection.Normalize(); Vector3.Cross(ref turretDirection, ref direction, out turretAxis); turretDirection.Y = 0.0f; direction.Y = 0.0f; float turretAngle = 0.0f; Vector3.Dot(ref turretDirection, ref direction, out turretAngle); turretAngle = (float)Math.Acos(turretAngle); Vector3.Multiply(ref turretAxis, turretAngle, out turretAxis); Vector3 velocity = vectorZero; turret.MainWorldTransform.GetAngularVelocity(ref velocity); Vector3.Subtract(ref velocity, ref turretAxis, out velocity); turret.MainWorldTransform.SetAngularVelocity(ref velocity); if ((Math.Abs(turretAngle) < 0.1f) && (distance.Length < 100.0f) && (shotFrameCount > maxShotFrameCount)) { shotFrameCount = 0; shotCount = (shotCount + 1) % maxShotCount; shot1NameBuilder.Remove(shot1NameLength, shot1NameBuilder.Length - shot1NameLength); shot1NameBuilder.Append(shotCount); shotInstanceIndexName = shot1NameBuilder.ToString(); shot1BaseNameBuilder.Remove(shot1BaseNameLength, shot1BaseNameBuilder.Length - shot1BaseNameLength); shot1BaseNameBuilder.Append(shotCount); shotBaseInstanceIndexName = shot1BaseNameBuilder.ToString(); shot1LightNameBuilder.Remove(shot1LightNameLength, shot1LightNameBuilder.Length - shot1LightNameLength); shot1LightNameBuilder.Append(shotCount); shotLightInstanceIndexName = shot1LightNameBuilder.ToString(); shot1 = scene.Factory.PhysicsObjectManager.FindOrCreate(shotInstanceIndexName); shot1Base = scene.Factory.PhysicsObjectManager.FindOrCreate(shotBaseInstanceIndexName); shot1Light = scene.Factory.PhysicsObjectManager.FindOrCreate(shotLightInstanceIndexName); shot1.AddChildPhysicsObject(shot1Base); shot1.AddChildPhysicsObject(shot1Light); Matrix4 turretGun1Rotation = matrixIdentity; Vector3 shot1Position = vectorZero; Vector3 shot1LocalPosition = vectorZero; turretGun1.MainWorldTransform.GetRotation(ref turretGun1Rotation); shot1LocalPosition.X = 0.0f; shot1LocalPosition.Y = 2.0f; shot1LocalPosition.Z = 0.0f; Vector3.TransformVector(ref shot1LocalPosition, ref turretGun1Rotation, out shot1Position); Vector3.Add(ref shot1Position, ref turretGun1Position, out shot1Position); Vector3 shot1Direction = vectorZero; Vector3 shot1Scale = vectorZero; shot1Direction.X = turretGun1Rotation.Row1.X; shot1Direction.Y = turretGun1Rotation.Row1.Y; shot1Direction.Z = turretGun1Rotation.Row1.Z; shot1Scale.X = shot1Scale.Y = shot1Scale.Z = 0.5f; shot1.InitLocalTransform.SetRotation(ref matrixIdentity); shot1.InitLocalTransform.SetPosition(ref shot1Position); Vector3.Multiply(ref shot1Direction, 200.0f, out shot1Direction); shot1.InitLocalTransform.SetLinearVelocity(ref shot1Direction); shot1.InitLocalTransform.SetAngularVelocity(ref vectorZero); shot1.MaxSimulationFrameCount = maxShotSimulationFrameCount; shot1.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false; shot1Base.Shape = sphere; shot1Base.UserDataStr = sphereName; shot1Base.Material.RigidGroup = true; shot1Base.InitLocalTransform.SetScale(ref shot1Scale); shot1Base.Integral.SetDensity(1.0f); shot1Base.EnableCollisions = true; shot1Base.DisableCollision(turretGun1, true); shot1Base.MaxDisableCollisionFrameCount = 10; shot1Base.EnableBreakRigidGroup = false; shot1Base.CreateSound(true); shot1Light.Shape = sphere; shot1Light.UserDataStr = sphereName; shot1Light.CreateLight(true); shot1Light.Light.Type = PhysicsLightType.Point; shot1Light.Light.Range = 20.0f; shot1Light.Light.SetDiffuse(1.0f, 0.7f, 0.0f); shot1Light.InitLocalTransform.SetScale(20.0f); shot1Light.Material.RigidGroup = true; shot1Light.Material.UserDataStr = yellowName; shot1Light.EnableBreakRigidGroup = false; shot1Light.EnableCollisions = false; shot1Light.EnableCursorInteraction = false; shot1Light.EnableAddToCameraDrawTransparentPhysicsObjects = false; scene.UpdateFromInitLocalTransform(shot1); shot2NameBuilder.Remove(shot2NameLength, shot2NameBuilder.Length - shot2NameLength); shot2NameBuilder.Append(shotCount); shotInstanceIndexName = shot2NameBuilder.ToString(); shot2BaseNameBuilder.Remove(shot2BaseNameLength, shot2BaseNameBuilder.Length - shot2BaseNameLength); shot2BaseNameBuilder.Append(shotCount); shotBaseInstanceIndexName = shot2BaseNameBuilder.ToString(); shot2LightNameBuilder.Remove(shot2LightNameLength, shot2LightNameBuilder.Length - shot2LightNameLength); shot2LightNameBuilder.Append(shotCount); shotLightInstanceIndexName = shot2LightNameBuilder.ToString(); shot2 = scene.Factory.PhysicsObjectManager.FindOrCreate(shotInstanceIndexName); shot2Base = scene.Factory.PhysicsObjectManager.FindOrCreate(shotBaseInstanceIndexName); shot2Light = scene.Factory.PhysicsObjectManager.FindOrCreate(shotLightInstanceIndexName); shot2.AddChildPhysicsObject(shot2Base); shot2.AddChildPhysicsObject(shot2Light); Matrix4 turretGun2Rotation = matrixIdentity; Vector3 shot2Position = vectorZero; Vector3 shot2LocalPosition = vectorZero; turretGun2.MainWorldTransform.GetRotation(ref turretGun2Rotation); shot2LocalPosition.X = 0.0f; shot2LocalPosition.Y = 2.0f; shot2LocalPosition.Z = 0.0f; Vector3.TransformVector(ref shot2LocalPosition, ref turretGun2Rotation, out shot2Position); Vector3.Add(ref shot2Position, ref turretGun1Position, out shot2Position); Vector3 shot2Direction = vectorZero; Vector3 shot2Scale = vectorZero; shot2Direction.X = turretGun2Rotation.Row1.X; shot2Direction.Y = turretGun2Rotation.Row1.Y; shot2Direction.Z = turretGun2Rotation.Row1.Z; shot2Scale.X = shot2Scale.Y = shot2Scale.Z = 0.5f; shot2.InitLocalTransform.SetRotation(ref matrixIdentity); shot2.InitLocalTransform.SetPosition(ref shot2Position); Vector3.Multiply(ref shot2Direction, 200.0f, out shot2Direction); shot2.InitLocalTransform.SetLinearVelocity(ref shot2Direction); shot2.InitLocalTransform.SetAngularVelocity(ref vectorZero); shot2.MaxSimulationFrameCount = maxShotSimulationFrameCount; shot2.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false; shot2Base.Shape = sphere; shot2Base.UserDataStr = sphereName; shot2Base.Material.RigidGroup = true; shot2Base.InitLocalTransform.SetScale(ref shot2Scale); shot2Base.Integral.SetDensity(10.0f); shot2Base.EnableCollisions = true; shot2Base.DisableCollision(turretGun2, true); shot2Base.MaxDisableCollisionFrameCount = 10; shot2Base.EnableBreakRigidGroup = false; shot2Base.CreateSound(true); shot2Light.Shape = sphere; shot2Light.UserDataStr = sphereName; shot2Light.CreateLight(true); shot2Light.Light.Type = PhysicsLightType.Point; shot2Light.Light.Range = 20.0f; shot2Light.Light.SetDiffuse(1.0f, 0.7f, 0.0f); shot2Light.InitLocalTransform.SetScale(20.0f); shot2Light.Material.RigidGroup = true; shot2Light.Material.UserDataStr = yellowName; shot2Light.EnableBreakRigidGroup = false; shot2Light.EnableCollisions = false; shot2Light.EnableCursorInteraction = false; shot2Light.EnableAddToCameraDrawTransparentPhysicsObjects = false; scene.UpdateFromInitLocalTransform(shot2); } Vector3 bodyUpPosition = vectorZero; Vector3 upDirection = vectorZero; bodyDown.MainWorldTransform.GetPosition(ref bodyDownPosition); bodyUp.MainWorldTransform.GetPosition(ref bodyUpPosition); Vector3.Subtract(ref bodyDownPosition, ref bodyUpPosition, out upDirection); upDirection.Normalize(); float bodyAngle = 0.0f; Vector3 axis = vectorZero; Vector3.Dot(ref upDirection, ref gravityDirection, out bodyAngle); bodyAngle = (float)Math.Acos(bodyAngle); if (Math.Abs(bodyAngle) > 0.005f) { bodyAngle *= 0.005f / Math.Abs(bodyAngle); } Vector3.Cross(ref gravityDirection, ref upDirection, out axis); objectBase.MainWorldTransform.GetAngularVelocity(ref velocity); Vector3.Multiply(ref velocity, 0.98f, out velocity); Vector3.Multiply(ref axis, bodyAngle * 400.0f, out axis); Vector3.Add(ref velocity, ref axis, out velocity); objectBase.MainWorldTransform.SetAngularVelocity(ref velocity); Vector3 turretBodyUpPosition = vectorZero; turretBodyUp.MainWorldTransform.GetPosition(ref turretBodyUpPosition); Vector3.Subtract(ref turretBodyDownPosition, ref turretBodyUpPosition, out upDirection); upDirection.Normalize(); Vector3.Dot(ref upDirection, ref gravityDirection, out bodyAngle); bodyAngle = (float)Math.Acos(bodyAngle); if (Math.Abs(bodyAngle) > 0.005f) { bodyAngle *= 0.005f / Math.Abs(bodyAngle); } Vector3.Cross(ref gravityDirection, ref upDirection, out axis); turret.MainWorldTransform.GetAngularVelocity(ref velocity); Vector3.Multiply(ref velocity, 0.98f, out velocity); Vector3.Multiply(ref axis, bodyAngle * 400.0f, out axis); Vector3.Add(ref velocity, ref axis, out velocity); turret.MainWorldTransform.SetAngularVelocity(ref velocity); }
public void Create() { Shape point = scene.Factory.ShapeManager.Find("Point"); Shape edge = scene.Factory.ShapeManager.Find("Edge"); Shape box = scene.Factory.ShapeManager.Find("Box"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); Shape sphere = scene.Factory.ShapeManager.Find("Sphere"); Shape hemisphereZ = scene.Factory.ShapeManager.Find("HemisphereZ"); Shape coneY = scene.Factory.ShapeManager.Find("ConeY"); Shape capsuleY = scene.Factory.ShapeManager.Find("CapsuleY"); Shape triangle1 = scene.Factory.ShapeManager.Find("Triangle1"); Shape triangle2 = scene.Factory.ShapeManager.Find("Triangle2"); Shape convexTorus1 = scene.Factory.ShapeManager.Find("ConvexTorus1"); Shape userMesh1 = scene.Factory.ShapeManager.Find("UserMesh1"); Shape cylinder2RY = scene.Factory.ShapeManager.Find("Cylinder2RY"); PhysicsObject objectBase = null; objectBase = scene.Factory.PhysicsObjectManager.Create("Cylinder2R 1"); objectBase.Shape = cylinder2RY; objectBase.UserDataStr = "Cylinder2RY"; objectBase.CreateSound(true); objectBase.Sound.HitPitch = 0.5f; objectBase.Sound.RollPitch = 0.5f; objectBase.Sound.SlidePitch = 0.5f; objectBase.InitLocalTransform.SetPosition(10.0f, 20.0f, 10.0f); objectBase.InitLocalTransform.SetScale(1.5f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Cylinder 1"); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(0.0f, 20.0f, 20.0f); objectBase.InitLocalTransform.SetScale(2.0f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Cone 1"); objectBase.Shape = coneY; objectBase.UserDataStr = "ConeY"; objectBase.Material.RigidGroup = true; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-10.0f, 20.0f, 20.0f); objectBase.InitLocalTransform.SetScale(3.0f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Capsule 1"); objectBase.Shape = capsuleY; objectBase.UserDataStr = "CapsuleY"; objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 1500.0f; objectBase.InitLocalTransform.SetPosition(-20.0f, 20.0f, 20.0f); objectBase.InitLocalTransform.SetScale(2.0f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Sphere 1"); objectBase.Shape = sphere; objectBase.UserDataStr = "Sphere"; objectBase.Material.SetSpecular(0.1f, 0.1f, 0.1f); objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-30.0f, 20.0f, 20.0f); objectBase.InitLocalTransform.SetScale(2.0f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Cylinder 2"); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(0.0f, 20.0f, 10.0f); objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 2.0f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Cone 2"); objectBase.Shape = coneY; objectBase.UserDataStr = "ConeY"; objectBase.Material.RigidGroup = true; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-10.0f, 20.0f, 10.0f); objectBase.InitLocalTransform.SetScale(2.0f, 3.0f, 3.0f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Capsule 2"); objectBase.Shape = capsuleY; objectBase.UserDataStr = "CapsuleY"; objectBase.Material.SetSpecular(0.1f, 0.1f, 0.1f); objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-20.0f, 20.0f, 10.0f); objectBase.InitLocalTransform.SetScale(2.0f, 2.0f, 1.0f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Sphere 2"); objectBase.Shape = sphere; objectBase.UserDataStr = "Sphere"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-30.0f, 20.0f, 10.0f); objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 2.0f); objectBase.Integral.SetDensity(1.0f); objectBase.Integral.EnableInertia = false; scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Box 1"); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-5.0f, 40.0f, 20.0f); objectBase.InitLocalTransform.SetScale(0.1f, 10.0f, 0.1f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Torus 1"); objectBase.Shape = convexTorus1; objectBase.UserDataStr = "TorusMesh1"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-30.0f, 50.0f, 30.0f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Tube 1"); objectBase.Shape = cylinderY; objectBase.UserDataStr = "TubeMesh1"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-20.0f, 50.0f, 30.0f); objectBase.InitLocalTransform.SetScale(2.0f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Hemisphere 1"); objectBase.Shape = hemisphereZ; objectBase.UserDataStr = "HemisphereZ"; objectBase.Material.SetSpecular(0.1f, 0.1f, 0.1f); objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-40.0f, 20.0f, 20.0f); objectBase.InitLocalTransform.SetScale(2.0f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Hemisphere 2"); objectBase.Shape = hemisphereZ; objectBase.UserDataStr = "HemisphereZ"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-40.0f, 20.0f, 10.0f); objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 2.0f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("User TriangleMesh 1"); objectBase.Shape = userMesh1; objectBase.UserDataStr = "UserMesh1"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-40.0f, 50.0f, 30.0f); objectBase.InitLocalTransform.SetScale(3.0f); objectBase.Integral.SetDensity(1.0f); objectBase.Integral.EnableInertia = false; scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Point"); objectBase.Shape = point; objectBase.UserDataStr = "Point"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(0.0f, 20.0f, 0.0f); objectBase.InitLocalTransform.SetScale(0.1f); objectBase.Integral.SetDensity(2.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Edge"); objectBase.Shape = edge; objectBase.UserDataStr = "Edge"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(10.0f, 20.0f, 0.0f); objectBase.InitLocalTransform.SetScale(0.1f, 1.0f, 0.1f); objectBase.Integral.SetDensity(1.0f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Triangle 1"); objectBase.Shape = triangle1; objectBase.UserDataStr = "Triangle1"; objectBase.CreateSound(true); objectBase.Sound.UserDataStr = "RollSlide"; objectBase.InitLocalTransform.SetPosition(-10.0f, 10.0f, 30.0f); objectBase.InitLocalTransform.SetScale(3.0f, 10.0f, 3.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(180.0f))); objectBase.Integral.SetDensity(0.1f); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Triangle 2"); objectBase.Shape = triangle2; objectBase.UserDataStr = "Triangle2"; objectBase.CreateSound(true); objectBase.Sound.UserDataStr = "RollSlide"; objectBase.InitLocalTransform.SetPosition(0.0f, 10.0f, 30.0f); objectBase.InitLocalTransform.SetScale(3.0f, 5.0f, 3.0f); objectBase.Integral.SetDensity(0.1f); scene.UpdateFromInitLocalTransform(objectBase); PhysicsObject objectRoot = scene.Factory.PhysicsObjectManager.Create("ConcaveTorus1"); objectRoot.UserDataStr = "TorusMesh1"; int i = 1; while ((objectBase = scene.Factory.PhysicsObjectManager.Find("ConcaveTorus1 " + i.ToString())) != null) { objectBase.Shape.CreateMesh(0.0f); if (!demo.Meshes.ContainsKey("ConcaveTorus1 " + i.ToString())) { demo.Meshes.Add("ConcaveTorus1 " + i.ToString(), new DemoMesh(demo, objectBase.Shape, demo.Textures["Default"], Vector2.One, false, false, false, false, true, CullFaceMode.Back, false, false)); } objectBase.UserDataStr = "ConcaveTorus1 " + i.ToString(); objectBase.Material.RigidGroup = true; objectBase.CreateSound(true); objectBase.Integral.SetMass(1.0f); objectRoot.AddChildPhysicsObject(objectBase); i++; } objectRoot.InitLocalTransform.SetScale(0.5f); objectRoot.InitLocalTransform.SetPosition(18.0f, 20.0f, 10.0f); scene.UpdateFromInitLocalTransform(objectRoot); objectRoot = scene.Factory.PhysicsObjectManager.Create("ConcaveTorus2"); objectRoot.UserDataStr = "TorusMesh1"; i = 1; while ((objectBase = scene.Factory.PhysicsObjectManager.Find("ConcaveTorus2 " + i.ToString())) != null) { objectBase.Shape.CreateMesh(0.0f); if (!demo.Meshes.ContainsKey("ConcaveTorus2 " + i.ToString())) { demo.Meshes.Add("ConcaveTorus2 " + i.ToString(), new DemoMesh(demo, objectBase.Shape, demo.Textures["Default"], Vector2.One, false, false, false, false, true, CullFaceMode.Back, false, false)); } objectBase.UserDataStr = "ConcaveTorus2 " + i.ToString(); objectBase.Material.RigidGroup = true; objectBase.CreateSound(true); objectBase.Integral.SetMass(1.0f); objectRoot.AddChildPhysicsObject(objectBase); i++; } objectRoot.InitLocalTransform.SetScale(0.5f); objectRoot.InitLocalTransform.SetPosition(19.0f, 20.0f, 10.0f); objectRoot.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(90.0f))); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Move(SimulateMethodArgs args) { PhysicsScene scene = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex); PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex); if (!objectBase.Camera.Enabled) { return; } if (!objectBase.Camera.Active) { return; } float time = (float)args.Time; Vector3 deltaRotation = vectorZero; Vector3 deltaTranslation = vectorZero; float rotationSpeed = 8.0f; float translationSpeed = 8.0f; float jumpSpeed = 8.0f; float swimUpSpeed = 0.2f; float swimUpOnSurfaceSpeed = 0.06f; float translationInFluidFactor = 0.15f; float soundPositionFactor = 0.1f; bool enableJump = false; bool enableSwimUp = false; bool enableShot = false; bool cameraBodyCollision = cameraBody.IsColliding(); bool cameraDownCollision = cameraDown.IsColliding(); DemoMouseState mouseState = demo.GetMouseState(); DemoKeyboardState keyboardState = demo.GetKeyboardState(); if (mouseState[MouseButton.Right]) { deltaRotation.Y += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.X - oldMouseState.X) * time); deltaRotation.X += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.Y - oldMouseState.Y) * time); } mousePosition.X = mouseState.X; mousePosition.Y = mouseState.Y; if (!objectBase.Camera.EnableControl) { if (mouseState[MouseButton.Middle] && !oldMouseState[MouseButton.Middle]) { enableShot = true; } if ((keyboardState[Key.ControlRight] && !oldKeyboardState[Key.ControlRight]) || (keyboardState[Key.ControlLeft] && !oldKeyboardState[Key.ControlLeft])) { enableShot = true; } } PhysicsObject cursorA = scene.Factory.PhysicsObjectManager.Find(cursorAName); PhysicsObject cursorB = scene.Factory.PhysicsObjectManager.Find(cursorBName); if (!demo.EnableMenu) { if (cursorA != null) { cursorA.EnableDrawing = true; } if (cursorB != null) { cursorB.EnableDrawing = true; } } else { if (cursorA != null) { cursorA.EnableDrawing = false; } if (cursorB != null) { cursorB.EnableDrawing = false; } } if (!objectBase.Camera.EnableControl) { if (keyboardState[Key.W]) { deltaTranslation.Z += translationSpeed * time; } if (keyboardState[Key.S]) { deltaTranslation.Z -= translationSpeed * time; } if (keyboardState[Key.D]) { deltaTranslation.X += translationSpeed * time; } if (keyboardState[Key.A]) { deltaTranslation.X -= translationSpeed * time; } if (keyboardState[Key.Space] && !oldKeyboardState[Key.Space]) { enableJump = true; } if (keyboardState[Key.Space]) { enableSwimUp = true; } } if (keyboardState[Key.Tab] && !oldKeyboardState[Key.Tab]) { enableDistance = !enableDistance; } oldMouseState = mouseState; oldKeyboardState = keyboardState; Vector3 gravityDirection = vectorZero; scene.GetGravityDirection(ref gravityDirection); if (!objectBase.Camera.EnableControl) { if (deltaRotation.LengthSquared != 0.0f) { Vector3 euler = vectorZero; objectBase.Camera.GetEuler(ref euler); Vector3.Add(ref euler, ref deltaRotation, out euler); objectBase.Camera.SetEuler(ref euler); Matrix4 rotationX, rotationY; Matrix4.CreateRotationX(-euler.X, out rotationX); Matrix4.CreateRotationY(-euler.Y, out rotationY); Matrix4.Mult(ref rotationY, ref rotationX, out cameraRotation); objectBase.Camera.SetRotation(ref cameraRotation); Matrix4.CreateRotationY(euler.Y, out rotation); objectBase.RigidGroupOwner.MainWorldTransform.SetRotation(ref rotation); objectBase.RigidGroupOwner.RecalculateMainTransform(); } } else { Vector3 euler = vectorZero; Matrix4 objectRotation = matrixIdentity; objectBase.Camera.GetEuler(ref euler); Vector3.Add(ref euler, ref deltaRotation, out euler); objectBase.RigidGroupOwner.MainWorldTransform.GetRotation(ref objectRotation); Matrix4 rotationX, rotationY; Matrix4.CreateRotationX(euler.X, out rotationX); Matrix4.CreateRotationY(euler.Y, out rotationY); Matrix4.Mult(ref rotationX, ref rotationY, out cameraRotation); Matrix4.Mult(ref cameraRotation, ref objectRotation, out rotation); objectBase.Camera.SetEuler(ref euler); objectBase.Camera.SetTransposeRotation(ref rotation); } if (deltaTranslation.LengthSquared != 0.0f) { if (objectBase.RigidGroupOwner.IsUnderFluidSurface) { objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity = 10.0f; objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 10.0f; if (enableSwimUp) { objectBase.InitLocalTransform.GetTransposeRotation(ref rotation); Vector3.TransformVector(ref deltaTranslation, ref rotation, out direction); objectBase.MainWorldTransform.GetRotation(ref rotation); Vector3.TransformVector(ref direction, ref rotation, out moveForce); Vector3.Multiply(ref moveForce, translationInFluidFactor * objectBase.RigidGroupOwner.Integral.Mass / (time * time), out moveForce); objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce); } else { objectBase.Camera.GetTransposeRotation(ref rotation); Vector3.TransformVector(ref deltaTranslation, ref rotation, out moveForce); Vector3.Multiply(ref moveForce, translationInFluidFactor * objectBase.RigidGroupOwner.Integral.Mass / (time * time), out moveForce); objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce); } } else { if (cameraDownCollision) { objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity = 100000.0f; objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 100000.0f; objectBase.InitLocalTransform.GetTransposeRotation(ref rotation); Vector3.TransformVector(ref deltaTranslation, ref rotation, out direction); objectBase.MainWorldTransform.GetRotation(ref rotation); Vector3.TransformVector(ref direction, ref rotation, out moveForce); Vector3.Multiply(ref moveForce, objectBase.RigidGroupOwner.Integral.Mass / (time * time), out moveForce); objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce); cameraDown.UpdateFeedbackForce(ref moveForce); } else { if (objectBase.RigidGroupOwner.IsInFluid) { objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity = 10.0f; objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 10.0f; objectBase.InitLocalTransform.GetTransposeRotation(ref rotation); Vector3.TransformVector(ref deltaTranslation, ref rotation, out direction); objectBase.MainWorldTransform.GetRotation(ref rotation); Vector3.TransformVector(ref direction, ref rotation, out moveForce); Vector3.Multiply(ref moveForce, translationInFluidFactor * objectBase.RigidGroupOwner.Integral.Mass / (time * time), out moveForce); objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce); } } } } if (enableSwimUp) { if (cameraDown.IsUnderFluidSurface && cameraBody.IsUnderFluidSurface) { objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity = 10.0f; objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 10.0f; PhysicsObject fluidPhysicsObject = objectBase.RigidGroupOwner.FluidPhysicsObject; fluidPhysicsObject.InternalControllers.FluidController.GetNormal(ref fluidNormal); Vector3.Multiply(ref fluidNormal, swimUpSpeed * objectBase.RigidGroupOwner.Integral.Mass / time, out moveForce); objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce); } else if (!cameraDownCollision && cameraBody.IsInFluid && (deltaTranslation.LengthSquared == 0.0f)) { objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity = 10.0f; objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 10.0f; PhysicsObject fluidPhysicsObject = objectBase.RigidGroupOwner.FluidPhysicsObject; fluidPhysicsObject.InternalControllers.FluidController.GetNormal(ref fluidNormal); Vector3.Multiply(ref fluidNormal, swimUpOnSurfaceSpeed * objectBase.RigidGroupOwner.Integral.Mass / time, out moveForce); objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce); } } if (enableJump) { if (!enableControl && !objectBase.Camera.EnableControl && cameraDownCollision && !cameraDown.IsUnderFluidSurface && !cameraBody.IsUnderFluidSurface) { objectBase.RigidGroupOwner.MaxPreUpdateLinearVelocity = 100000.0f; objectBase.RigidGroupOwner.MaxPostUpdateLinearVelocity = 100000.0f; Vector3.Multiply(ref gravityDirection, -jumpSpeed * objectBase.RigidGroupOwner.Integral.Mass / time, out moveForce); objectBase.RigidGroupOwner.WorldAccumulator.AddWorldForce(ref moveForce); cameraDown.UpdateFeedbackForce(ref moveForce); } } if (enableDistance) { if (distance > maxDistance) { distance -= 2.0f; } if (enableDistanceCollision) { float margin = 1.0f; objectBase.MainWorldTransform.GetPosition(ref startPoint); objectBase.Camera.GetTransposeRotation(ref cameraRotation); direction.X = cameraRotation.Row2.X; direction.Y = cameraRotation.Row2.Y; direction.Z = cameraRotation.Row2.Z; Vector3.Multiply(ref direction, distance, out direction); Vector3.Add(ref startPoint, ref direction, out endPoint); scene.UpdatePhysicsObjectsIntersectedBySegment(ref startPoint, ref endPoint, margin, true); float minDistance = float.MaxValue; float curDistance = 0.0f; for (int i = 0; i < scene.IntersectedPhysicsObjectsCount; i++) { PhysicsObject hitObject = scene.GetIntersectedPhysicsObject(i, ref hitPoint); if (hitObject.RigidGroupOwner == objectBase.RigidGroupOwner) { continue; } //if ((hitObject.InternalControllers.FluidController != null) && hitObject.InternalControllers.FluidController.Enabled) // continue; if (!hitObject.EnableCollisions) { continue; } Vector3.Subtract(ref startPoint, ref hitPoint, out hitDistance); curDistance = hitDistance.Length; if (curDistance < minDistance) { minDistance = curDistance; } } if (minDistance < Math.Abs(distance)) { distance = -minDistance; } } } else { if (distance < 0.0f) { distance += 2.0f; } if (distance > 0.0f) { distance = 0.0f; } } if (enableDistance) { if (distance > maxDistance) { if ((cameraUp != null) && (cameraBody != null) && (cameraDown != null)) { objectBase.RigidGroupOwner.EnableDrawing = true; cameraUp.EnableDrawing = true; cameraBody.EnableDrawing = true; cameraDown.EnableDrawing = true; } } } else { if (distance >= 0.0f) { if ((cameraUp != null) && (cameraBody != null) && (cameraDown != null)) { objectBase.RigidGroupOwner.EnableDrawing = false; cameraUp.EnableDrawing = false; cameraBody.EnableDrawing = false; cameraDown.EnableDrawing = false; } } } enableControl = objectBase.Camera.EnableControl; float gravityDistance = 0.0f; Vector3 gravityLinearVelocity = vectorZero; Vector3 tangentLinearVelocity = vectorZero; Vector3 velocity = vectorZero; objectBase.MainWorldTransform.GetLinearVelocity(ref velocity); Vector3.Dot(ref gravityDirection, ref velocity, out gravityDistance); Vector3.Multiply(ref gravityDirection, gravityDistance, out gravityLinearVelocity); Vector3.Subtract(ref velocity, ref gravityLinearVelocity, out tangentLinearVelocity); float tangentLength = tangentLinearVelocity.Length; if (tangentLength > maxTangentLength) { tangentLinearVelocity *= maxTangentLength / tangentLength; } Vector3.Add(ref gravityLinearVelocity, ref tangentLinearVelocity, out velocity); objectBase.RigidGroupOwner.MainWorldTransform.SetLinearVelocity(ref velocity); objectBase.Camera.Projection.CreatePerspectiveLH(1.0f, 11000.0f, 70.0f, demo.WindowWidth, demo.WindowHeight); objectBase.MainWorldTransform.GetPosition(ref position); objectBase.Camera.GetTransposeRotation(ref cameraRotation); objectBase.Camera.View.CreateLookAtLH(ref position, ref cameraRotation, distance); objectBase.Camera.UpdateFrustum(); objectBase.Camera.View.GetViewMatrix(ref view); objectBase.Camera.Projection.GetProjectionMatrix(ref projection); Vector3 rayPosition, rayDirection; rayPosition = rayDirection = vectorZero; objectBase.UnProjectToRay(ref mousePosition, 0, 0, demo.WindowWidth, demo.WindowHeight, 0.0f, 1.0f, ref view, ref matrixIdentity, ref projection, ref rayPosition, ref rayDirection); PhysicsObject cursor = scene.Factory.PhysicsObjectManager.Find(cursorName); if (cursor != null) { Vector3 cursorPosition = vectorZero; Matrix4 cursorLocalRotation = matrixIdentity; Matrix4 cursorWorldRotation = matrixIdentity; cursor.InitLocalTransform.GetPosition(ref cursorPosition); cursor.InitLocalTransform.GetRotation(ref cursorLocalRotation); cursor.MainWorldTransform.GetRotation(ref cursorWorldRotation); objectBase.Camera.GetTransposeRotation(ref cameraRotation); Matrix4.Mult(ref cursorLocalRotation, ref cameraRotation, out rotation); Vector3.TransformVector(ref cursorPosition, ref cursorWorldRotation, out position); cursor.MainWorldTransform.SetRotation(ref rotation); Vector3.Add(ref position, ref rayPosition, out position); Vector3.Add(ref position, ref rayDirection, out position); cursor.MainWorldTransform.SetPosition(ref position); cursor.RecalculateMainTransform(); } CursorController cursorController = objectBase.InternalControllers.CursorController; if (cursorController.IsDragging) { if (cursorController.HitPhysicsObject.Integral.IsStatic && (cursorController.HitPhysicsObject.InternalControllers.HeightmapController != null) && cursorController.HitPhysicsObject.InternalControllers.HeightmapController.Enabled) { Vector3 cursorStartPosition = vectorZero; Vector3 cursorEndPosition = vectorZero; cursorController.GetAnchor1(ref cursorStartPosition); cursorController.GetAnchor2(ref cursorEndPosition); Vector3.Subtract(ref cursorEndPosition, ref cursorStartPosition, out direction); float dir = direction.Y; if (dir != 0.0f) { Vector3 scale = vectorZero; cursorController.HitPhysicsObject.MainWorldTransform.GetScale(ref scale); float positionX = cursorStartPosition.X + 0.5f * scale.X; float positionY = cursorStartPosition.Y + 0.5f * scale.Y; float positionZ = cursorStartPosition.Z + 0.5f * scale.Z; cursorController.HitPhysicsObject.InternalControllers.HeightmapController.AddHeight(positionX, positionY, positionZ, dir / scale.Y); cursorController.HitPhysicsObject.InternalControllers.HeightmapController.UpdateBounding(); // To change the friction and restitution of the heightmap surface by the cursor, add the following lines of code //cursorController.HitPhysicsObject.InternalControllers.HeightmapController.SetFriction(positionX, positionY, positionZ, 0.0f); //cursorController.HitPhysicsObject.InternalControllers.HeightmapController.SetRestitution(positionX, positionY, positionZ, 2.0f); cursorStartPosition.Y += dir; cursorController.SetAnchor1(ref cursorStartPosition); } } if (cursorController.HitPhysicsObject.Integral.IsStatic && (cursorController.HitPhysicsObject.InternalControllers.HeightmapController != null) && cursorController.HitPhysicsObject.InternalControllers.HeightmapController.Enabled) { Vector3 cursorStartPosition = vectorZero; Vector3 cursorEndPosition = vectorZero; cursorController.GetAnchor1(ref cursorStartPosition); cursorController.GetAnchor2(ref cursorEndPosition); Vector3.Subtract(ref cursorEndPosition, ref cursorStartPosition, out direction); if (direction.LengthSquared != 0.0f) { // To move the heightmap surface by the cursor, add the following lines of code //cursorController.HitPhysicsObject.MainWorldTransform.GetPosition(ref cursorStartPosition); //Vector3.Add(ref cursorStartPosition, ref direction, out cursorStartPosition); //cursorController.HitPhysicsObject.MainWorldTransform.SetPosition(ref cursorStartPosition); //cursorController.HitPhysicsObject.RecalculateMainTransform(); } } if (cursorController.HitPhysicsObject.Integral.IsStatic && (cursorController.HitPhysicsObject.InternalControllers.FluidController != null) && cursorController.HitPhysicsObject.InternalControllers.FluidController.Enabled) { Vector3 cursorStartPosition = vectorZero; Vector3 cursorEndPosition = vectorZero; cursorController.GetAnchor1(ref cursorStartPosition); cursorController.GetAnchor2(ref cursorEndPosition); Vector3.Subtract(ref cursorEndPosition, ref cursorStartPosition, out direction); if (direction.LengthSquared != 0.0f) { // To move the fluid surface by the cursor, add the following lines of code // and set EnableCursorInteraction flag to true in the Lake class //cursorController.HitPhysicsObject.MainWorldTransform.GetPosition(ref cursorStartPosition); //Vector3.Add(ref cursorStartPosition, ref direction, out cursorStartPosition); //cursorController.HitPhysicsObject.MainWorldTransform.SetPosition(ref cursorStartPosition); //cursorController.HitPhysicsObject.RecalculateMainTransform(); } } } objectBase.MainWorldTransform.GetPosition(ref listenerPosition); objectBase.Camera.GetTransposeRotation(ref rotation); Vector3.Multiply(ref listenerPosition, soundPositionFactor, out position); listenerTopDirection.X = rotation.Row1.X; listenerTopDirection.Y = rotation.Row1.Y; listenerTopDirection.Z = rotation.Row1.Z; listenerFrontDirection.X = rotation.Row2.X; listenerFrontDirection.Y = rotation.Row2.Y; listenerFrontDirection.Z = rotation.Row2.Z; listener.Position = position; listener.TopDirection = listenerTopDirection; listener.FrontDirection = listenerFrontDirection; listenerRange = objectBase.Sound.Range; if (enableShot) { Vector3 shotScale, shotColor; shotCount = (shotCount + 1) % shotTab.Length; string shotCountName = shotCount.ToString(); PhysicsObject shot = scene.Factory.PhysicsObjectManager.FindOrCreate(shotName + shotCountName); PhysicsObject shotBase = scene.Factory.PhysicsObjectManager.FindOrCreate(shotBaseName + shotCountName); PhysicsObject shotLight = scene.Factory.PhysicsObjectManager.FindOrCreate(shotLightName + shotCountName); shot.AddChildPhysicsObject(shotBase); shot.AddChildPhysicsObject(shotLight); shotTab[shotCount] = shotBase; enableShotTab = true; shotScale = shotColor = vectorZero; shotScale.X = shotScale.Y = shotScale.Z = 0.5f; Vector3.Multiply(ref rayDirection, 300.0f, out rayDirection); shot.InitLocalTransform.SetRotation(ref matrixIdentity); shot.InitLocalTransform.SetPosition(ref rayPosition); shot.InitLocalTransform.SetLinearVelocity(ref rayDirection); shot.InitLocalTransform.SetAngularVelocity(ref vectorZero); shot.MaxSimulationFrameCount = 200; shot.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false; //shot.EnableLocalGravity = true; shotBase.Shape = sphere; shotBase.UserDataStr = sphereName; shotBase.InitLocalTransform.SetScale(ref shotScale); shotBase.Integral.SetDensity(10.0f); shotBase.Material.RigidGroup = true; shotBase.EnableBreakRigidGroup = false; shotBase.EnableCollisions = true; shotBase.CreateSound(true); if ((cameraUp != null) && (cameraBody != null) && (cameraDown != null)) { shotBase.DisableCollision(cameraUp, true); shotBase.DisableCollision(cameraBody, true); shotBase.DisableCollision(cameraDown, true); shotBase.MaxDisableCollisionFrameCount = 50; } shotLight.Shape = sphere; shotLight.UserDataStr = sphereName; shotLight.CreateLight(true); shotLight.Light.Type = PhysicsLightType.Point; shotLight.Light.Range = 20.0f; shotColor.X = (float)Math.Max(random.NextDouble(), random.NextDouble()); shotColor.Y = (float)Math.Max(random.NextDouble(), random.NextDouble()); shotColor.Z = (float)Math.Max(random.NextDouble(), random.NextDouble()); shotLight.Light.SetDiffuse(ref shotColor); shotLight.InitLocalTransform.SetScale(20.0f); shotLight.Material.RigidGroup = true; shotLight.Material.UserDataStr = yellowName; shotLight.EnableBreakRigidGroup = false; shotLight.EnableCollisions = false; shotLight.EnableCursorInteraction = false; shotLight.EnableAddToCameraDrawTransparentPhysicsObjects = false; scene.UpdateFromInitLocalTransform(shot); shotSoundGroup = demo.SoundGroups[hitName]; shotSoundGroup.MaxHitRepeatTime = 0.0f; if (shotSound == null) { shotSound = shotSoundGroup.GetSound(objectBase.Sound, listener, emitter); } shotSound.Update(time); Vector3.Multiply(ref rayPosition, soundPositionFactor, out shotSound.HitPosition); shotSound.HitVolume = 1.0f; shotSound.FrontDirection.X = rotation.Row2.X; shotSound.FrontDirection.Y = rotation.Row2.Y; shotSound.FrontDirection.Z = rotation.Row2.Z; demo.SoundQueue.EnqueueSound(shotSound); } else { PhysicsObject shotBase; DemoSound shotBaseSound; if (shotSound != null) { shotSound.Update(time); if (shotSound.Stop()) { shotSound.SoundGroup.SetSound(shotSound); shotSound = null; } } if (enableShotTab) { enableShotTab = false; for (int i = 0; i < shotTab.Length; i++) { shotBase = shotTab[i]; if (shotBase != null) { if (shotBase.Sound.UserDataObj != null) { enableShotTab = true; shotBaseSound = (DemoSound)shotBase.Sound.UserDataObj; shotBaseSound.Update(time); if (shotBaseSound.Stop()) { shotBaseSound.SoundGroup.SetSound(shotBaseSound); shotBase.Sound.UserDataObj = null; shotTab[i] = null; } } } } } } objectBase.Camera.UpdatePhysicsObjects(true, true, true); objectBase.Camera.SortDrawPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType); objectBase.Camera.SortTransparentPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType); objectBase.Camera.SortLightPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType); PhysicsObject currentPhysicsObject; PhysicsSound currentSound; DemoSoundGroup soundGroup; DemoSound sound; if (demo.SoundQueue.SoundCount > 0) { return; } for (int i = 0; i < scene.TotalPhysicsObjectCount; i++) { if (demo.SoundQueue.SoundCount >= demo.SoundQueue.MaxSoundCount) { break; } currentPhysicsObject = scene.GetPhysicsObject(i); currentSound = !currentPhysicsObject.EnableSoundFromRigidGroupOwner ? currentPhysicsObject.Sound : currentPhysicsObject.RigidGroupOwner.Sound; if (currentSound == null) { continue; } if (!currentSound.Enabled) { continue; } if (currentSound.UserDataStr == null) { soundGroup = demo.SoundGroups[defaultName]; } else { soundGroup = demo.SoundGroups[currentSound.UserDataStr]; } if (currentPhysicsObject.IsSleeping && (currentSound.UserDataObj == null) && !soundGroup.EnableBackground) { continue; } if (currentPhysicsObject.GetSoundData(ref listenerPosition, listenerRange, soundGroup.EnableHit, soundGroup.EnableRoll, soundGroup.EnableSlide, soundGroup.EnableBackground, currentSound.BackgroundVolumeVelocityModulation, ref hitPosition, ref rollPosition, ref slidePosition, ref backgroundPosition, ref hitVolume, ref rollVolume, ref slideVolume, ref backgroundVolume)) { if (currentSound.UserDataObj == null) { sound = soundGroup.GetSound(currentSound, listener, emitter); currentSound.UserDataObj = sound; } else { sound = (DemoSound)currentSound.UserDataObj; } sound.Update(time); currentPhysicsObject.MainWorldTransform.GetTransposeRotation(ref rotation); Vector3.Multiply(ref hitPosition, soundPositionFactor, out sound.HitPosition); Vector3.Multiply(ref rollPosition, soundPositionFactor, out sound.RollPosition); Vector3.Multiply(ref slidePosition, soundPositionFactor, out sound.SlidePosition); Vector3.Multiply(ref backgroundPosition, soundPositionFactor, out sound.BackgroundPosition); sound.HitVolume = hitVolume; sound.RollVolume = rollVolume; sound.SlideVolume = slideVolume; sound.BackgroundVolume = backgroundVolume; sound.FrontDirection.X = rotation.Row2.X; sound.FrontDirection.Y = rotation.Row2.Y; sound.FrontDirection.Z = rotation.Row2.Z; demo.SoundQueue.EnqueueSound(sound); } else { if (currentSound.UserDataObj != null) { sound = (DemoSound)currentSound.UserDataObj; sound.Update(time); if (sound.Stop()) { soundGroup.SetSound(sound); currentSound.UserDataObj = null; } } } } }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, int pointWidth, int pointHeight, float segmentWidth, float segmentHeight, bool rigidSegment, float density, float force) { Shape point = scene.Factory.ShapeManager.Find("Point"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Point Cloth " + instanceIndexName); float halfLenghtWidth = 0.5f * ((pointWidth - 1) * segmentWidth); float halfLenghtHeight = 0.5f * ((pointHeight - 1) * segmentHeight); this.pointWidth = pointWidth; this.pointHeight = pointHeight; for (int i = 0; i < pointHeight; i++) { for (int j = 0; j < pointWidth; j++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Point Cloth Point " + i.ToString() + " " + j.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = point; objectBase.UserDataStr = "Point"; objectBase.InitLocalTransform.SetPosition(j * segmentWidth - halfLenghtWidth, 0.0f, -i * segmentHeight + halfLenghtHeight); objectBase.InitLocalTransform.SetScale(0.1f); objectBase.Integral.SetDensity(density); } } objectRoot.UpdateFromInitLocalTransform(); Constraint constraint = null; for (int i = 0; i < pointHeight; i++) { for (int j = 0; j < pointWidth - 1; j++) { constraint = scene.Factory.ConstraintManager.Create("Point Cloth Horizontal Constraint " + i.ToString() + " " + j.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + i.ToString() + " " + j.ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + i.ToString() + " " + (j + 1).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.SetAnchor1(position1); constraint.SetAnchor2(position2); constraint.Distance = rigidSegment ? -segmentWidth : segmentWidth; constraint.Force = force; constraint.EnableBreak = true; constraint.MinBreakVelocity = 20.0f; constraint.Update(); } } for (int i = 0; i < pointHeight - 1; i++) { for (int j = 0; j < pointWidth; j++) { constraint = scene.Factory.ConstraintManager.Create("Point Cloth Vertical Constraint " + i.ToString() + " " + j.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + i.ToString() + " " + j.ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + (i + 1).ToString() + " " + j.ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.SetAnchor1(position1); constraint.SetAnchor2(position2); constraint.Distance = rigidSegment ? -segmentHeight : segmentHeight; constraint.Force = force; constraint.EnableBreak = true; constraint.MinBreakVelocity = 20.0f; constraint.Update(); } } float segmentDistance = 0.0f; for (int i = 0; i < pointHeight - 1; i++) { for (int j = 0; j < pointWidth - 1; j++) { segmentDistance = rigidSegment ? (float)-Math.Sqrt(segmentWidth * segmentWidth + segmentHeight * segmentHeight) : (float)Math.Sqrt(segmentWidth * segmentWidth + segmentHeight * segmentHeight); constraint = scene.Factory.ConstraintManager.Create("Point Cloth Diagonal 1 Constraint " + i.ToString() + " " + j.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + i.ToString() + " " + j.ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + (i + 1).ToString() + " " + (j + 1).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.SetAnchor1(position1); constraint.SetAnchor2(position2); constraint.Distance = segmentDistance; constraint.Force = force; constraint.EnableBreak = true; constraint.MinBreakVelocity = 20.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Point Cloth Diagonal 2 Constraint " + i.ToString() + " " + j.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + i.ToString() + " " + (j + 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Point Cloth Point " + (i + 1).ToString() + " " + j.ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.SetAnchor1(position1); constraint.SetAnchor2(position2); constraint.Distance = segmentDistance; constraint.Force = force; constraint.EnableBreak = true; constraint.MinBreakVelocity = 20.0f; constraint.Update(); } } objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation) { Shape box = scene.Factory.ShapeManager.Find("Box"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; PhysicsObject objectA = null; PhysicsObject objectB = null; Vector3 position1 = Vector3.Zero; Quaternion orientation1 = Quaternion.Identity; Quaternion orientation2 = Quaternion.Identity; objectRoot = scene.Factory.PhysicsObjectManager.Create("Vehicle 1" + instanceIndexName); objectA = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Body" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectA); objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Body Up" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Paint2"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(0.0f, 1.5f, 0.0f); objectBase.InitLocalTransform.SetScale(3.0f, 0.5f, 3.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Body Down" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Paint2"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetScale(4.0f, 1.0f, 4.0f); objectBase.Integral.SetDensity(1.0f); objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Wing Right" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Plastic1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(4.0f, -1.0f, 0.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(10.0f))); objectBase.InitLocalTransform.SetScale(4.0f, 0.1f, 3.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Wing Left" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Plastic1"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(-4.0f, -1.0f, 0.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-10.0f))); objectBase.InitLocalTransform.SetScale(4.0f, 0.1f, 3.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectB = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Turret" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectB); objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Turret Body Up" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Paint2"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(0.0f, 4.0f, 0.0f); objectBase.InitLocalTransform.SetScale(3.0f, 0.5f, 3.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Turret Body Down" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Paint2"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(0.0f, 2.5f, 0.0f); objectBase.InitLocalTransform.SetScale(4.0f, 1.0f, 4.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Turret Gun 1" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(-1.0f, 2.5f, 5.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.InitLocalTransform.SetScale(0.5f, 2.0f, 0.5f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Vehicle 1 Turret Gun 2" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.InitLocalTransform.SetPosition(1.0f, 2.5f, 5.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.InitLocalTransform.SetScale(0.5f, 2.0f, 0.5f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectRoot.UpdateFromInitLocalTransform(); Constraint constraint = null; constraint = scene.Factory.ConstraintManager.Create("Vehicle 1 Turret Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Vehicle 1 Turret Body Down" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Vehicle 1 Body Up" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(0.0f, -1.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(0.0f, -1.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleZ = true; constraint.EnableControlAngleY = true; constraint.EnableBreak = true; constraint.MinBreakVelocity = 50.0f; constraint.Update(); objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation) { Shape box = scene.Factory.ShapeManager.Find("Box"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Pier 1 Base" + instanceIndexName); for (int i = 0; i < 25; i++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Pier 1 Base Cylinder Left " + i.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Wood1"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-50.0f, -110.0f, -400.0f + i * 10.0f); objectBase.InitLocalTransform.SetScale(2.0f, 20.0f, 2.0f); } for (int i = 0; i < 25; i++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Pier 1 Base Cylinder Right " + i.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Wood1"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-15.0f, -110.0f, -400.0f + i * 10.0f); objectBase.InitLocalTransform.SetScale(2.0f, 20.0f, 2.0f); } objectRoot.UpdateFromInitLocalTransform(); objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); objectRoot = scene.Factory.PhysicsObjectManager.Create("Pier 1 Platform" + instanceIndexName); objectBase = scene.Factory.PhysicsObjectManager.Create("Pier 1 Platform Cylinder 1" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.Material.UserDataStr = "Wood2"; objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 7000.0f; objectBase.InitLocalTransform.SetPosition(-42.0f, -91.0f, -282.0f); objectBase.InitLocalTransform.SetScale(1.0f, 122.0f, 1.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(1.0f); objectBase = scene.Factory.PhysicsObjectManager.Create("Pier 1 Platform Cylinder 2" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.Material.UserDataStr = "Wood2"; objectBase.CreateSound(true); objectBase.Sound.MinNextImpactForce = 7000.0f; objectBase.InitLocalTransform.SetPosition(-13.0f, -91.0f, -285.0f); objectBase.InitLocalTransform.SetScale(1.0f, 118.0f, 1.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitX, MathHelper.DegreesToRadians(-90.0f))); objectBase.Integral.SetDensity(1.0f); for (int i = 0; i < 21; i++) { objectBase = scene.Factory.PhysicsObjectManager.Create("Pier 1 Platform Box " + i.ToString() + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.Material.UserDataStr = "Wood2"; objectBase.CreateSound(true); objectBase.InitLocalTransform.SetPosition(-27.0f, -89.5f, -400.0f + i * 11.5f); objectBase.InitLocalTransform.SetScale(5.0f, 0.5f, 25.0f); objectBase.InitLocalTransform.SetRotation(Matrix4.CreateRotationY(MathHelper.DegreesToRadians(90.0f))); objectBase.Integral.SetDensity(1.0f); } objectRoot.UpdateFromInitLocalTransform(); objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation) { PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Plant" + instanceIndexName); string leafInstanceIndexName1 = " 1"; string leafInstanceIndexName2 = " 2"; string leafInstanceIndexName3 = " 3"; string leafInstanceIndexName4 = " 4"; int trunkCount = 8; Vector3 trunkScale = new Vector3(1.0f, 5.0f, 1.0f); int leafCount = 4; Vector3 leafScale = new Vector3(4.0f, 0.1f, 1.0f); CreateTrunk(scene, instanceIndexName, trunkCount, trunkScale, Vector3.Zero, Vector3.One, Quaternion.Identity); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName1, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 0.0f, 0.0f), Vector3.One, Quaternion.Identity); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName2, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 0.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90.0f))); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName3, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 0.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(180.0f))); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName4, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 0.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(270.0f))); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Trunk" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); Constraint constraint = null; constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName1 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + (trunkCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleZ = -10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName2 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + (trunkCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, leafScale.X)); constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, leafScale.X)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MaxLimitDegAngleX = 10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName3 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + (trunkCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleZ = -10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName4 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk " + (trunkCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.0f, leafScale.X)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.0f, leafScale.X)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MaxLimitDegAngleX = 10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName1 + leafInstanceIndexName2 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName3 + leafInstanceIndexName4 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, leafScale.X)); constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, leafScale.X)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); PhysicsObject objectA = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + (leafCount - 1).ToString() + instanceIndexName); PhysicsObject objectB = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + (leafCount - 1).ToString() + instanceIndexName); PhysicsObject objectC = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + (leafCount - 1).ToString() + instanceIndexName); PhysicsObject objectD = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + (leafCount - 1).ToString() + instanceIndexName); if (objectA != null) { objectA.DisableCollision(objectB, true); objectA.DisableCollision(objectC, true); objectA.DisableCollision(objectD, true); } if (objectB != null) { objectB.DisableCollision(objectC, true); objectB.DisableCollision(objectD, true); } if (objectC != null) { objectC.DisableCollision(objectD, true); } objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); objectRoot.UpdateFromInitLocalTransform(); constraint = scene.Factory.ConstraintManager.Create("Trunk Constraint " + trunkCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 0" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Quad 1"); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.EnableBreak = true; constraint.MinBreakVelocity = 30.0f; constraint.Update(); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation) { PhysicsObject objectRoot = null; PhysicsObject objectBase = null; objectRoot = scene.Factory.PhysicsObjectManager.Create("Plant" + instanceIndexName); string leafInstanceIndexName1 = " 1 "; string leafInstanceIndexName2 = " 2 "; string leafInstanceIndexName3 = " 3 "; string leafInstanceIndexName4 = " 4 "; string leafInstanceIndexName5 = " 5 "; string leafInstanceIndexName6 = " 6 "; string leafInstanceIndexName7 = " 7 "; string leafInstanceIndexName8 = " 8 "; string leafInstanceIndexName9 = " 9 "; string leafInstanceIndexName10 = " 10 "; string leafInstanceIndexName11 = " 11 "; string leafInstanceIndexName12 = " 12 "; int trunkCount = 8; Vector3 trunkScale = new Vector3(1.0f, 5.0f, 1.0f); int leafCount = 3; Vector3 leafScale = new Vector3(4.0f, 0.1f, 1.0f); CreateTrunk(scene, instanceIndexName, trunkCount, trunkScale, Vector3.Zero, Vector3.One, Quaternion.Identity); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName1, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 16.0f, 0.0f), new Vector3(0.4f, 0.4f, 0.4f), Quaternion.Identity); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName2, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 11.0f, 0.0f), new Vector3(0.5f, 0.5f, 0.5f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90.0f))); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName3, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 5.0f, 0.0f), new Vector3(0.6f, 0.6f, 0.6f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(180.0f))); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName4, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 9.0f, 0.0f), new Vector3(0.5f, 0.5f, 0.5f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(270.0f))); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName5, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.7f, 0.7f, 0.7f), Quaternion.Identity); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName6, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -1.0f, 0.0f), new Vector3(0.7f, 0.7f, 0.7f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90.0f))); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName7, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -3.0f, 0.0f), new Vector3(0.7f, 0.7f, 0.7f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(180.0f))); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName8, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -2.0f, 0.0f), new Vector3(0.7f, 0.7f, 0.7f), Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(270.0f))); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName9, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -11.0f, 0.0f), Vector3.One, Quaternion.Identity); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName10, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -12.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90.0f))); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName11, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -14.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(180.0f))); CreateLeaf(scene, instanceIndexName, leafInstanceIndexName12, trunkCount, trunkScale, leafCount, leafScale, new Vector3(0.0f, -13.0f, 0.0f), Vector3.One, Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(270.0f))); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Trunk" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName5 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName6 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName7 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName8 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName9 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName10 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName11 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName12 + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); Constraint constraint = null; constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName1 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName1 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 7" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(leafScale.X * 0.4f, 0.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(leafScale.X * 0.4f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleZ = -10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName2 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName2 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 7" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, leafScale.X * 0.5f)); constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, leafScale.X * 0.5f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MaxLimitDegAngleX = 10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName3 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName3 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 6" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(leafScale.X * 0.6f, 0.0f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(leafScale.X * 0.6f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleZ = -10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName4 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName4 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 6" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.0f, leafScale.X * 0.5f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.0f, leafScale.X * 0.5f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MaxLimitDegAngleX = 10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName5 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName5 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 5" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(leafScale.X * 0.7f, 0.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(leafScale.X * 0.7f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleZ = -10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName6 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName6 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 5" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, leafScale.X * 0.7f)); constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, leafScale.X * 0.7f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MaxLimitDegAngleX = 10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName7 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName7 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 4" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(leafScale.X * 0.7f, 0.0f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(leafScale.X * 0.7f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleZ = -10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName8 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName8 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 4" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.0f, leafScale.X * 0.7f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.0f, leafScale.X * 0.7f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MaxLimitDegAngleX = 10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName9 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName9 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 3" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleZ = -10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName10 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName10 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 3" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.0f, leafScale.X)); constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.0f, leafScale.X)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MaxLimitDegAngleX = 10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Leaf Constraint" + leafInstanceIndexName11 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName11 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 2" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(leafScale.X, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleZ = -10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("LeafC Constraint" + leafInstanceIndexName12 + leafCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Leaf" + leafInstanceIndexName12 + (leafCount - 1).ToString() + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 2" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.0f, leafScale.X)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.0f, leafScale.X)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MaxLimitDegAngleX = 10.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 200.0f; constraint.Update(); objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); objectRoot.UpdateFromInitLocalTransform(); constraint = scene.Factory.ConstraintManager.Create("Trunk Constraint " + trunkCount.ToString() + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Plant Trunk 0" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Quad 1"); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.5f * trunkScale.Y, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.EnableBreak = true; constraint.MinBreakVelocity = 30.0f; constraint.Update(); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation) { Shape sphere = scene.Factory.ShapeManager.Find("Sphere"); Shape box = scene.Factory.ShapeManager.Find("Box"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; PhysicsObject objectA = null; PhysicsObject objectB = null; PhysicsObject objectC = null; PhysicsObject objectD = null; Vector3 position1 = Vector3.Zero; Vector3 position2 = Vector3.Zero; Quaternion orientation1 = Quaternion.Identity; Quaternion orientation2 = Quaternion.Identity; objectRoot = scene.Factory.PhysicsObjectManager.Create("Cargo Jack" + instanceIndexName); objectA = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Body" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectA); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Body Down" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(-5.0f, 0.0f, 0.0f); objectBase.InitLocalTransform.SetScale(5.0f, 0.5f, 10.0f); objectBase.Integral.SetDensity(5.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Body Motor" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(-5.0f, 1.0f, 0.0f); objectBase.InitLocalTransform.SetScale(2.0f, 0.5f, 2.0f); objectBase.Integral.SetDensity(10.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Motor" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.InitLocalTransform.SetPosition(-5.0f, 6.5f, 0.0f); objectBase.InitLocalTransform.SetScale(1.0f, 5.0f, 1.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectB = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectB); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Down" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(-5.0f, 7.5f, 0.0f); objectBase.InitLocalTransform.SetScale(0.5f, 5.0f, 0.5f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Up" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(0.0f, 12.7f, 0.0f); objectBase.InitLocalTransform.SetScale(15.0f, 0.2f, 0.2f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Counterbalance" + instanceIndexName); objectB.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(-14.0f, 11.5f, 0.0f); objectBase.InitLocalTransform.SetScale(1.0f, 1.0f, 1.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectD = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectD); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel Body" + instanceIndexName); objectD.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(-6.4f, 5.0f, 0.0f); objectBase.InitLocalTransform.SetScale(0.1f, 1.0f, 1.0f); objectBase.Integral.SetDensity(10.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel Down" + instanceIndexName); objectD.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(-6.2f, 3.5f, 0.0f); objectBase.InitLocalTransform.SetScale(0.1f, 2.0f, 0.1f); objectBase.Integral.SetDensity(10.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel Button" + instanceIndexName); objectD.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.TwoSidedNormals = true; objectBase.Material.SetAmbient(0.4f, 0.7f, 0.4f); objectBase.Material.SetDiffuse(0.4f, 1.0f, 0.4f); objectBase.InitLocalTransform.SetPosition(-6.6f, 5.0f, 0.0f); objectBase.InitLocalTransform.SetScale(0.1f, 0.1f, 0.1f); objectBase.Integral.SetDensity(1.0f); objectBase.Integral.InertiaScaleFactor = 10.0f; objectBase.EnableBreakRigidGroup = false; objectBase.CreateSound(true); objectBase.Sound.UserDataStr = "Glass"; objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel Button Switch" + instanceIndexName); objectD.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.Material.RigidGroup = true; objectBase.Material.TransparencyFactor = 0.5f; objectBase.InitLocalTransform.SetPosition(-6.7f, 5.0f, 0.0f); objectBase.InitLocalTransform.SetScale(0.2f, 0.2f, 0.2f); objectBase.EnableBreakRigidGroup = false; objectBase.EnableCollisionResponse = false; objectBase.EnableCursorInteraction = false; objectBase.EnableDrawing = false; objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Panel Button Light" + instanceIndexName); objectD.AddChildPhysicsObject(objectBase); objectBase.Shape = sphere; objectBase.UserDataStr = "Sphere"; objectBase.Material.RigidGroup = true; objectBase.Material.UserDataStr = "Yellow"; objectBase.InitLocalTransform.SetPosition(-6.6f, 5.0f, 0.0f); objectBase.InitLocalTransform.SetScale(2.0f); objectBase.CreateLight(true); objectBase.Light.Type = PhysicsLightType.Point; objectBase.Light.SetDiffuse(0.2f, 1.0f, 0.2f); objectBase.Light.Range = 2.0f; objectBase.EnableBreakRigidGroup = false; objectBase.EnableCollisions = false; objectBase.EnableCursorInteraction = false; objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false; objectC = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectC); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Up" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(14.0f, 12.0f, 0.0f); objectBase.InitLocalTransform.SetScale(0.1f, 0.5f, 0.1f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Middle Bottom" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(14.0f, 9.8f, 7.5f); objectBase.InitLocalTransform.SetScale(0.1f, 1.5f, 0.1f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Middle" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(14.0f, 11.4f, 0.0f); objectBase.InitLocalTransform.SetScale(0.1f, 0.1f, 7.6f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Middle Top" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(14.0f, 9.8f, -7.5f); objectBase.InitLocalTransform.SetScale(0.1f, 1.5f, 0.1f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Bottom" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(14.0f, 8.2f, 7.5f); objectBase.InitLocalTransform.SetScale(7.6f, 0.1f, 0.1f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Cargo Jack Arm Handle Top" + instanceIndexName); objectC.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 200.0f; objectBase.InitLocalTransform.SetPosition(14.0f, 8.2f, -7.5f); objectBase.InitLocalTransform.SetScale(7.6f, 0.1f, 0.1f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectRoot.UpdateFromInitLocalTransform(); Constraint constraint = null; constraint = scene.Factory.ConstraintManager.Create("Cargo Jack Constraint 1" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Panel Down" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Body Motor" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 2.0f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 2.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.EnableBreak = true; constraint.MinBreakVelocity = 150.0f; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Cargo Jack Constraint 2" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Arm Motor" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Body Motor" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 5.0f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 5.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleZ = true; constraint.EnableBreak = true; constraint.MinBreakVelocity = 50.0f; constraint.EnableControlAngleY = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Cargo Jack Constraint 3" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Arm Down" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Arm Motor" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(0.0f, 5.0f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(0.0f, 5.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDistanceY = 0.0f; constraint.MaxLimitDistanceY = 9.0f; constraint.EnableBreak = true; constraint.MinBreakVelocity = 50.0f; constraint.EnableControlDistanceY = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Cargo Jack Constraint 4" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Arm Handle Up" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Cargo Jack Arm Up" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.SetAnchor1(position1 + new Vector3(0.0f, 0.5f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(0.0f, 0.5f, 0.0f)); constraint.EnableBreak = true; constraint.MinBreakVelocity = 50.0f; constraint.Update(); objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Move(SimulateMethodArgs args) { PhysicsScene scene = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex); PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex); if (!objectBase.Camera.Enabled) { return; } if (!objectBase.Camera.Active) { return; } float time = (float)args.Time; Vector3 deltaRotation = vectorZero; Vector3 deltaTranslation = vectorZero; float rotationSpeed = 8.0f; float translationSpeed = 8.0f; float soundPositionFactor = 0.1f; bool enableShot = false; DemoMouseState mouseState = demo.GetMouseState(); DemoKeyboardState keyboardState = demo.GetKeyboardState(); if (mouseState[MouseButton.Right]) { deltaRotation.Y += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.X - oldMouseState.X) * time); deltaRotation.X += MathHelper.DegreesToRadians(rotationSpeed * (mouseState.Y - oldMouseState.Y) * time); } mousePosition.X = mouseState.X; mousePosition.Y = mouseState.Y; if (mouseState[MouseButton.Middle] && !oldMouseState[MouseButton.Middle]) { enableShot = true; } if ((keyboardState[Key.ControlRight] && !oldKeyboardState[Key.ControlRight]) || (keyboardState[Key.ControlLeft] && !oldKeyboardState[Key.ControlLeft])) { enableShot = true; } PhysicsObject cursorA = scene.Factory.PhysicsObjectManager.Find(cursorAName); PhysicsObject cursorB = scene.Factory.PhysicsObjectManager.Find(cursorBName); if (!demo.EnableMenu) { if (cursorA != null) { cursorA.EnableDrawing = true; } if (cursorB != null) { cursorB.EnableDrawing = true; } } else { if (cursorA != null) { cursorA.EnableDrawing = false; } if (cursorB != null) { cursorB.EnableDrawing = false; } } if (keyboardState[Key.W]) { deltaTranslation.Z += translationSpeed * time; } if (keyboardState[Key.S]) { deltaTranslation.Z -= translationSpeed * time; } if (keyboardState[Key.D]) { deltaTranslation.X += translationSpeed * time; } if (keyboardState[Key.A]) { deltaTranslation.X -= translationSpeed * time; } oldMouseState = mouseState; oldKeyboardState = keyboardState; if (deltaRotation.LengthSquared != 0.0f) { Vector3 euler = vectorZero; objectBase.Camera.GetEuler(ref euler); Vector3.Add(ref euler, ref deltaRotation, out euler); objectBase.Camera.SetEuler(ref euler); Matrix4 rotationX, rotationY; Matrix4.CreateRotationX(-euler.X, out rotationX); Matrix4.CreateRotationY(-euler.Y, out rotationY); Matrix4.Mult(ref rotationY, ref rotationX, out cameraRotation); objectBase.Camera.SetRotation(ref cameraRotation); objectBase.MainWorldTransform.SetTransposeRotation(ref cameraRotation); objectBase.RecalculateMainTransform(); } if (deltaTranslation.LengthSquared != 0.0f) { objectBase.MainWorldTransform.GetRotation(ref rotation); Vector3.TransformVector(ref deltaTranslation, ref rotation, out direction); objectBase.MainWorldTransform.GetPosition(ref position); Vector3.Add(ref position, ref direction, out position); objectBase.MainWorldTransform.SetPosition(ref position); objectBase.RecalculateMainTransform(); } objectBase.Camera.Projection.CreatePerspectiveLH(1.0f, 11000.0f, 70.0f, demo.WindowWidth, demo.WindowHeight); objectBase.MainWorldTransform.GetPosition(ref position); objectBase.Camera.GetTransposeRotation(ref cameraRotation); objectBase.Camera.View.CreateLookAtLH(ref position, ref cameraRotation, 0.0f); objectBase.Camera.UpdateFrustum(); objectBase.Camera.View.GetViewMatrix(ref view); objectBase.Camera.Projection.GetProjectionMatrix(ref projection); Vector3 rayPosition, rayDirection; rayPosition = rayDirection = vectorZero; objectBase.UnProjectToRay(ref mousePosition, 0, 0, demo.WindowWidth, demo.WindowHeight, 0.0f, 1.0f, ref view, ref matrixIdentity, ref projection, ref rayPosition, ref rayDirection); PhysicsObject cursor = scene.Factory.PhysicsObjectManager.Find(cursorName); if (cursor != null) { Vector3 cursorPosition = vectorZero; Matrix4 cursorLocalRotation = matrixIdentity; Matrix4 cursorWorldRotation = matrixIdentity; cursor.InitLocalTransform.GetPosition(ref cursorPosition); cursor.InitLocalTransform.GetRotation(ref cursorLocalRotation); cursor.MainWorldTransform.GetRotation(ref cursorWorldRotation); objectBase.Camera.GetTransposeRotation(ref cameraRotation); Matrix4.Mult(ref cursorLocalRotation, ref cameraRotation, out rotation); Vector3.TransformVector(ref cursorPosition, ref cursorWorldRotation, out position); cursor.MainWorldTransform.SetRotation(ref rotation); Vector3.Add(ref position, ref rayPosition, out position); Vector3.Add(ref position, ref rayDirection, out position); cursor.MainWorldTransform.SetPosition(ref position); cursor.RecalculateMainTransform(); } CursorController cursorController = objectBase.InternalControllers.CursorController; if (cursorController.IsDragging) { if (cursorController.HitPhysicsObject.Integral.IsStatic && (cursorController.HitPhysicsObject.Shape != null) && (cursorController.HitPhysicsObject.Shape.ShapePrimitive != null) && (cursorController.HitPhysicsObject.Shape.ShapePrimitive.ShapePrimitiveType == ShapePrimitiveType.TriangleMesh)) { Vector3 cursorStartPosition = vectorZero; Vector3 cursorEndPosition = vectorZero; cursorController.GetAnchor1(ref cursorStartPosition); cursorController.GetAnchor2(ref cursorEndPosition); Vector3.Subtract(ref cursorEndPosition, ref cursorStartPosition, out direction); if (direction.LengthSquared != 0.0f) { cursorController.HitPhysicsObject.MainWorldTransform.GetPosition(ref cursorStartPosition); Vector3.Add(ref cursorStartPosition, ref direction, out cursorStartPosition); cursorController.HitPhysicsObject.MainWorldTransform.SetPosition(ref cursorStartPosition); cursorController.HitPhysicsObject.RecalculateMainTransform(); } } } objectBase.MainWorldTransform.GetPosition(ref listenerPosition); objectBase.Camera.GetTransposeRotation(ref rotation); Vector3.Multiply(ref listenerPosition, soundPositionFactor, out position); listenerTopDirection.X = rotation.Row1.X; listenerTopDirection.Y = rotation.Row1.Y; listenerTopDirection.Z = rotation.Row1.Z; listenerFrontDirection.X = rotation.Row2.X; listenerFrontDirection.Y = rotation.Row2.Y; listenerFrontDirection.Z = rotation.Row2.Z; listener.Position = position; listener.TopDirection = listenerTopDirection; listener.FrontDirection = listenerFrontDirection; listenerRange = objectBase.Sound.Range; if (enableShot) { Vector3 shotScale, shotColor; shotCount = (shotCount + 1) % shotTab.Length; string shotCountName = shotCount.ToString(); PhysicsObject shot = scene.Factory.PhysicsObjectManager.FindOrCreate(shotName + shotCountName); PhysicsObject shotBase = scene.Factory.PhysicsObjectManager.FindOrCreate(shotBaseName + shotCountName); PhysicsObject shotLight = scene.Factory.PhysicsObjectManager.FindOrCreate(shotLightName + shotCountName); shot.AddChildPhysicsObject(shotBase); shot.AddChildPhysicsObject(shotLight); shotTab[shotCount] = shotBase; enableShotTab = true; shotScale = shotColor = vectorZero; shotScale.X = shotScale.Y = shotScale.Z = 0.5f; Vector3.Multiply(ref rayDirection, 300.0f, out rayDirection); shot.InitLocalTransform.SetRotation(ref matrixIdentity); shot.InitLocalTransform.SetPosition(ref rayPosition); shot.InitLocalTransform.SetLinearVelocity(ref rayDirection); shot.InitLocalTransform.SetAngularVelocity(ref vectorZero); shot.MaxSimulationFrameCount = 200; shot.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false; //shot.EnableLocalGravity = true; shotBase.Shape = sphere; shotBase.UserDataStr = sphereName; shotBase.InitLocalTransform.SetScale(ref shotScale); shotBase.Integral.SetDensity(10.0f); shotBase.Material.RigidGroup = true; shotBase.EnableBreakRigidGroup = false; shotBase.EnableCollisions = true; shotBase.DisableCollision(objectBase, true); shotBase.MaxDisableCollisionFrameCount = 50; shotBase.CreateSound(true); shotLight.Shape = sphere; shotLight.UserDataStr = sphereName; shotLight.CreateLight(true); shotLight.Light.Type = PhysicsLightType.Point; shotLight.Light.Range = 20.0f; shotColor.X = (float)Math.Max(random.NextDouble(), random.NextDouble()); shotColor.Y = (float)Math.Max(random.NextDouble(), random.NextDouble()); shotColor.Z = (float)Math.Max(random.NextDouble(), random.NextDouble()); shotLight.Light.SetDiffuse(ref shotColor); shotLight.InitLocalTransform.SetScale(20.0f); shotLight.Material.UserDataStr = yellowName; shotLight.Material.RigidGroup = true; shotLight.EnableBreakRigidGroup = false; shotLight.EnableCollisions = false; shotLight.EnableCursorInteraction = false; shotLight.EnableAddToCameraDrawTransparentPhysicsObjects = false; scene.UpdateFromInitLocalTransform(shot); shotSoundGroup = demo.SoundGroups[hitName]; shotSoundGroup.MaxHitRepeatTime = 0.0f; if (shotSound == null) { shotSound = shotSoundGroup.GetSound(objectBase.Sound, listener, emitter); } shotSound.Update(time); Vector3.Multiply(ref rayPosition, soundPositionFactor, out shotSound.HitPosition); shotSound.HitVolume = 1.0f; shotSound.FrontDirection.X = rotation.Row2.X; shotSound.FrontDirection.Y = rotation.Row2.Y; shotSound.FrontDirection.Z = rotation.Row2.Z; demo.SoundQueue.EnqueueSound(shotSound); } else { PhysicsObject shotBase; DemoSound shotBaseSound; if (shotSound != null) { shotSound.Update(time); if (shotSound.Stop()) { shotSound.SoundGroup.SetSound(shotSound); shotSound = null; } } if (enableShotTab) { enableShotTab = false; for (int i = 0; i < shotTab.Length; i++) { shotBase = shotTab[i]; if (shotBase != null) { if (shotBase.Sound.UserDataObj != null) { enableShotTab = true; shotBaseSound = (DemoSound)shotBase.Sound.UserDataObj; shotBaseSound.Update(time); if (shotBaseSound.Stop()) { shotBaseSound.SoundGroup.SetSound(shotBaseSound); shotBase.Sound.UserDataObj = null; shotTab[i] = null; } } } } } } objectBase.Camera.UpdatePhysicsObjects(true, true, true); objectBase.Camera.SortDrawPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType); objectBase.Camera.SortTransparentPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType); objectBase.Camera.SortLightPhysicsObjects(PhysicsCameraSortOrderType.DrawPriorityShapePrimitiveType); PhysicsObject currentPhysicsObject; PhysicsSound currentSound; DemoSoundGroup soundGroup; DemoSound sound; if (demo.SoundQueue.SoundCount > 0) { return; } for (int i = 0; i < scene.TotalPhysicsObjectCount; i++) { if (demo.SoundQueue.SoundCount >= demo.SoundQueue.MaxSoundCount) { break; } currentPhysicsObject = scene.GetPhysicsObject(i); currentSound = !currentPhysicsObject.EnableSoundFromRigidGroupOwner ? currentPhysicsObject.Sound : currentPhysicsObject.RigidGroupOwner.Sound; if (currentSound == null) { continue; } if (!currentSound.Enabled) { continue; } if (currentSound.UserDataStr == null) { soundGroup = demo.SoundGroups[defaultName]; } else { soundGroup = demo.SoundGroups[currentSound.UserDataStr]; } if (currentPhysicsObject.IsSleeping && (currentSound.UserDataObj == null) && !soundGroup.EnableBackground) { continue; } if (currentPhysicsObject.GetSoundData(ref listenerPosition, listenerRange, soundGroup.EnableHit, soundGroup.EnableRoll, soundGroup.EnableSlide, soundGroup.EnableBackground, currentSound.BackgroundVolumeVelocityModulation, ref hitPosition, ref rollPosition, ref slidePosition, ref backgroundPosition, ref hitVolume, ref rollVolume, ref slideVolume, ref backgroundVolume)) { if (currentSound.UserDataObj == null) { sound = soundGroup.GetSound(currentSound, listener, emitter); currentSound.UserDataObj = sound; } else { sound = (DemoSound)currentSound.UserDataObj; } sound.Update(time); currentPhysicsObject.MainWorldTransform.GetTransposeRotation(ref rotation); Vector3.Multiply(ref hitPosition, soundPositionFactor, out sound.HitPosition); Vector3.Multiply(ref rollPosition, soundPositionFactor, out sound.RollPosition); Vector3.Multiply(ref slidePosition, soundPositionFactor, out sound.SlidePosition); Vector3.Multiply(ref backgroundPosition, soundPositionFactor, out sound.BackgroundPosition); sound.HitVolume = hitVolume; sound.RollVolume = rollVolume; sound.SlideVolume = slideVolume; sound.BackgroundVolume = backgroundVolume; sound.FrontDirection.X = rotation.Row2.X; sound.FrontDirection.Y = rotation.Row2.Y; sound.FrontDirection.Z = rotation.Row2.Z; demo.SoundQueue.EnqueueSound(sound); } else { if (currentSound.UserDataObj != null) { sound = (DemoSound)currentSound.UserDataObj; sound.Update(time); if (sound.Stop()) { soundGroup.SetSound(sound); currentSound.UserDataObj = null; } } } } }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, bool enableControl, bool enableControlWithDeformation, float minAngleDeformationVelocity) { Shape box = scene.Factory.ShapeManager.Find("Box"); Shape capsuleY1 = scene.Factory.ShapeManager.Find("CapsuleY1"); Shape capsuleY2 = scene.Factory.ShapeManager.Find("CapsuleY2"); Shape capsuleY3 = scene.Factory.ShapeManager.Find("CapsuleY3"); Shape sphere = scene.Factory.ShapeManager.Find("Sphere"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; Vector3 position1 = Vector3.Zero; Vector3 position2 = Vector3.Zero; Quaternion orientation1 = Quaternion.Identity; Quaternion orientation2 = Quaternion.Identity; objectRoot = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3" + instanceIndexName); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Head" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = sphere; objectBase.UserDataStr = "Sphere"; objectBase.InitLocalTransform.SetPosition(0.0f, 43.0f, 20.0f); objectBase.InitLocalTransform.SetScale(0.9f, 0.9f, 0.9f); objectBase.Integral.SetDensity(1.64f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Upper Torso" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = capsuleY1; objectBase.UserDataStr = "CapsuleY1"; objectBase.CreateSound(true); objectBase.Sound.HitVolume = 0.25f; objectBase.Sound.RollVolume = 0.25f; objectBase.Sound.SlideVolume = 0.25f; objectBase.Sound.MinFirstImpactForce = 100.0f; objectBase.InitLocalTransform.SetPosition(0.0f, 41.0f, 20.0f); objectBase.Integral.SetDensity(1.44f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Lower Torso" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = capsuleY1; objectBase.UserDataStr = "CapsuleY1"; objectBase.CreateSound(true); objectBase.Sound.HitVolume = 0.25f; objectBase.Sound.RollVolume = 0.25f; objectBase.Sound.SlideVolume = 0.25f; objectBase.Sound.MinFirstImpactForce = 100.0f; objectBase.InitLocalTransform.SetPosition(0.0f, 39.0f, 20.0f); objectBase.Integral.SetDensity(1.84f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Upper Arm" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = capsuleY2; objectBase.UserDataStr = "CapsuleY2"; objectBase.InitLocalTransform.SetPosition(2.0f, 41.5f, 20.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f))); objectBase.Integral.SetDensity(2.145f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Lower Arm" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = capsuleY2; objectBase.UserDataStr = "CapsuleY2"; objectBase.InitLocalTransform.SetPosition(4.0f, 41.5f, 20.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f))); objectBase.Integral.SetDensity(2.145f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Hand" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.CreateSound(true); objectBase.Sound.HitVolume = 0.25f; objectBase.Sound.RollVolume = 0.25f; objectBase.Sound.SlideVolume = 0.25f; objectBase.Sound.MinFirstImpactForce = 100.0f; objectBase.InitLocalTransform.SetPosition(5.8f, 41.5f, 20.0f); objectBase.InitLocalTransform.SetScale(0.5f, 0.4f, 0.2f); objectBase.Integral.SetDensity(2.145f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Upper Arm" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = capsuleY2; objectBase.UserDataStr = "CapsuleY2"; objectBase.InitLocalTransform.SetPosition(-2.0f, 41.5f, 20.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f))); objectBase.Integral.SetDensity(2.145f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Lower Arm" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = capsuleY2; objectBase.UserDataStr = "CapsuleY2"; objectBase.InitLocalTransform.SetPosition(-4.0f, 41.5f, 20.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f))); objectBase.Integral.SetDensity(2.145f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Hand" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.CreateSound(true); objectBase.Sound.HitVolume = 0.25f; objectBase.Sound.RollVolume = 0.25f; objectBase.Sound.SlideVolume = 0.25f; objectBase.Sound.MinFirstImpactForce = 100.0f; objectBase.InitLocalTransform.SetPosition(-5.8f, 41.5f, 20.0f); objectBase.InitLocalTransform.SetScale(0.5f, 0.4f, 0.2f); objectBase.Integral.SetDensity(2.145f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Upper Leg" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = capsuleY3; objectBase.UserDataStr = "CapsuleY3"; objectBase.InitLocalTransform.SetPosition(0.6f, 36.75f, 20.0f); objectBase.Integral.SetDensity(2.145f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Lower Leg" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = capsuleY3; objectBase.UserDataStr = "CapsuleY3"; objectBase.InitLocalTransform.SetPosition(0.6f, 34.25f, 20.0f); objectBase.Integral.SetDensity(2.145f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Right Foot" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.CreateSound(true); objectBase.Sound.HitVolume = 0.25f; objectBase.Sound.RollVolume = 0.25f; objectBase.Sound.SlideVolume = 0.25f; objectBase.Sound.MinFirstImpactForce = 100.0f; objectBase.InitLocalTransform.SetPosition(0.6f, 32.6f, 19.7f); objectBase.InitLocalTransform.SetScale(0.4f, 0.2f, 0.8f); objectBase.Integral.SetDensity(2.145f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Upper Leg" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = capsuleY3; objectBase.UserDataStr = "CapsuleY3"; objectBase.InitLocalTransform.SetPosition(-0.6f, 36.75f, 20.0f); objectBase.Integral.SetDensity(2.145f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Lower Leg" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = capsuleY3; objectBase.UserDataStr = "CapsuleY3"; objectBase.InitLocalTransform.SetPosition(-0.6f, 34.25f, 20.0f); objectBase.Integral.SetDensity(2.145f); objectBase = scene.Factory.PhysicsObjectManager.Create("Ragdoll 3 Left Foot" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.CreateSound(true); objectBase.Sound.HitVolume = 0.25f; objectBase.Sound.RollVolume = 0.25f; objectBase.Sound.SlideVolume = 0.25f; objectBase.Sound.MinFirstImpactForce = 100.0f; objectBase.InitLocalTransform.SetPosition(-0.6f, 32.6f, 19.7f); objectBase.InitLocalTransform.SetScale(0.4f, 0.2f, 0.8f); objectBase.Integral.SetDensity(2.145f); objectRoot.UpdateFromInitLocalTransform(); Constraint constraint = null; constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 1" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Head" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Upper Torso" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 0.9f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 0.9f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleX = -20.0f; constraint.MaxLimitDegAngleX = 45.0f; constraint.MinLimitDegAngleY = -45.0f; constraint.MaxLimitDegAngleY = 45.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 2" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Upper Torso" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Lower Torso" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 1.0f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 1.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleX = -10.0f; constraint.MaxLimitDegAngleX = 45.0f; constraint.MinLimitDegAngleZ = -10.0f; constraint.MaxLimitDegAngleZ = 10.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 3" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Upper Torso" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Upper Arm" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 - new Vector3(1.0f, 0.0f, 0.0f)); constraint.SetAnchor2(position2 - new Vector3(1.0f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleY = -20.0f; constraint.MaxLimitDegAngleY = 90.0f; constraint.MinLimitDegAngleZ = -90.0f; constraint.MaxLimitDegAngleZ = 45.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 4" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Upper Torso" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Upper Arm" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(1.0f, 0.0f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(1.0f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleY = -90.0f; constraint.MaxLimitDegAngleY = 20.0f; constraint.MinLimitDegAngleZ = -45.0f; constraint.MaxLimitDegAngleZ = 90.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 5" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Lower Torso" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Upper Leg" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleX = -10.0f; constraint.MaxLimitDegAngleX = 100.0f; constraint.MinLimitDegAngleY = -20.0f; constraint.MaxLimitDegAngleY = 0.0f; constraint.MinLimitDegAngleZ = -45.0f; constraint.MaxLimitDegAngleZ = 45.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 6" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Lower Torso" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Upper Leg" + instanceIndexName); constraint.PhysicsObject2.MainWorldTransform.GetPosition(ref position2); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position2 + new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetAnchor2(position2 + new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleX = -10.0f; constraint.MaxLimitDegAngleX = 100.0f; constraint.MinLimitDegAngleY = -20.0f; constraint.MaxLimitDegAngleY = 0.0f; constraint.MinLimitDegAngleZ = -45.0f; constraint.MaxLimitDegAngleZ = 45.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 7" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Upper Arm" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Lower Arm" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(1.0f, 0.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(1.0f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleY = -2.0f; constraint.MaxLimitDegAngleY = 135.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 8" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Lower Arm" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Hand" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 + new Vector3(1.4f, 0.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(1.4f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleY = -20.0f; constraint.MaxLimitDegAngleY = 60.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 9" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Upper Arm" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Lower Arm" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(1.0f, 0.0f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(1.0f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleY = -135.0f; constraint.MaxLimitDegAngleY = 2.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 10" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Lower Arm" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Hand" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(1.4f, 0.0f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(1.4f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleY = -60.0f; constraint.MaxLimitDegAngleY = 20.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 11" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Upper Leg" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Lower Leg" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleX = -135.0f; constraint.MaxLimitDegAngleX = 2.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 12" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Lower Leg" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Right Foot" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleX = -45.0f; constraint.MaxLimitDegAngleX = 2.0f; constraint.MinLimitDegAngleZ = -10.0f; constraint.MaxLimitDegAngleZ = 10.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 13" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Upper Leg" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Lower Leg" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleX = -135.0f; constraint.MaxLimitDegAngleX = 2.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Ragdoll 3 Constraint 14" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Lower Leg" + instanceIndexName); constraint.PhysicsObject2 = scene.Factory.PhysicsObjectManager.Find("Ragdoll 3 Left Foot" + instanceIndexName); constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.PhysicsObject2.MainWorldTransform.GetOrientation(ref orientation2); constraint.SetAnchor1(position1 - new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetAnchor2(position1 - new Vector3(0.0f, 1.25f, 0.0f)); constraint.SetInitWorldOrientation1(ref orientation1); constraint.SetInitWorldOrientation2(ref orientation2); constraint.EnableBreak = true; constraint.MinBreakVelocity = 300.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.MinLimitDegAngleX = -45.0f; constraint.MaxLimitDegAngleX = 2.0f; constraint.MinLimitDegAngleZ = -10.0f; constraint.MaxLimitDegAngleZ = 10.0f; constraint.LimitAngleMode = LimitAngleMode.EulerYZX; if (enableControl) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; } else if (enableControlWithDeformation) { constraint.EnableControlAngleX = true; constraint.EnableControlAngleY = true; constraint.EnableControlAngleZ = true; constraint.EnableControlAngleWithDeformation = true; constraint.MinAngleDeformationVelocity = minAngleDeformationVelocity; constraint.AngularDamping = 1.0f; } constraint.Update(); objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); }
public void Move(SimulateMethodArgs args) { PhysicsScene scene = demo.Engine.Factory.PhysicsSceneManager.Get(args.OwnerSceneIndex); PhysicsObject objectBase = scene.Factory.PhysicsObjectManager.Get(args.OwnerIndex); float time = args.Time; if ((turretGun == null) || (turretConstraint == null) || (turretGunConstraint == null)) { return; } Vector3 deltaTranslation = vectorZero; bool turretWorking = true; if (objectBase.IsBrokenRigidGroup || turretConstraint.IsBroken) { turretWorking = false; } bool turretGunWorking = true; if (!turretWorking || turretGun.IsBrokenRigidGroup || turretGunConstraint.IsBroken) { turretGunWorking = false; } DemoKeyboardState keyboardState = demo.GetKeyboardState(); if (keyboardState[Key.Up]) { deltaTranslation.Z += 10000.0f; } if (keyboardState[Key.Down]) { deltaTranslation.Z -= 10000.0f; } if (deltaTranslation.LengthSquared != 0.0f) { objectBase.WorldAccumulator.AddLocalForce(ref deltaTranslation); } if (turretWorking) { if (keyboardState[Key.Right]) { turretConstraint.ControlDegAngleY -= 2.0f; } if (keyboardState[Key.Left]) { turretConstraint.ControlDegAngleY += 2.0f; } } if (turretGunWorking) { if (keyboardState[Key.PageUp]) { turretGunConstraint.ControlDegAngleX += 1.0f; } if (keyboardState[Key.PageDown]) { turretGunConstraint.ControlDegAngleX -= 1.0f; } if (keyboardState[Key.F] && !oldKeyboardState[Key.F]) { shotCount = (shotCount + 1) % maxShotCount; string shotCountName = shotCount.ToString(); if (turretGun1 != null) { shot = scene.Factory.PhysicsObjectManager.FindOrCreate(shot1Name + shotCountName); shotBase = scene.Factory.PhysicsObjectManager.FindOrCreate(shot1BaseName + shotCountName); shotLight = scene.Factory.PhysicsObjectManager.FindOrCreate(shot1LightName + shotCountName); shot.AddChildPhysicsObject(shotBase); shot.AddChildPhysicsObject(shotLight); Vector3 turretGunPosition = vectorZero; Matrix4 turretGunRotation = matrixIdentity; turretGun1.MainWorldTransform.GetPosition(ref turretGunPosition); turretGun1.MainWorldTransform.GetRotation(ref turretGunRotation); Vector3 shotPosition = vectorZero; Vector3 shotLocalPosition = vectorZero; shotLocalPosition.X = 0.0f; shotLocalPosition.Y = 2.0f; shotLocalPosition.Z = 0.0f; Vector3.TransformVector(ref shotLocalPosition, ref turretGunRotation, out shotPosition); Vector3.Add(ref shotPosition, ref turretGunPosition, out shotPosition); Vector3 shotDirection = vectorZero; Vector3 shotScale = vectorZero; shotDirection.X = turretGunRotation.Row1.X; shotDirection.Y = turretGunRotation.Row1.Y; shotDirection.Z = turretGunRotation.Row1.Z; shotScale.X = shotScale.Y = shotScale.Z = 0.5f; shot.InitLocalTransform.SetRotation(ref matrixIdentity); shot.InitLocalTransform.SetPosition(ref shotPosition); Vector3.Multiply(ref shotDirection, 200.0f, out shotDirection); shot.InitLocalTransform.SetLinearVelocity(ref shotDirection); shot.InitLocalTransform.SetAngularVelocity(ref vectorZero); shot.MaxSimulationFrameCount = 100; shot.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false; shotBase.Shape = sphere; shotBase.UserDataStr = sphereName; shotBase.Material.RigidGroup = true; shotBase.InitLocalTransform.SetScale(ref shotScale); shotBase.Integral.SetDensity(1.0f); shotBase.EnableCollisions = true; shotBase.DisableCollision(turretGun1, true); shotBase.MaxDisableCollisionFrameCount = 10; shotBase.EnableBreakRigidGroup = false; shotBase.CreateSound(true); shotLight.Shape = sphere; shotLight.UserDataStr = sphereName; shotLight.CreateLight(true); shotLight.Light.Type = PhysicsLightType.Point; shotLight.Light.Range = 20.0f; shotLight.Light.SetDiffuse(1.0f, 0.7f, 0.0f); shotLight.InitLocalTransform.SetScale(20.0f); shotLight.Material.RigidGroup = true; shotLight.Material.UserDataStr = yellowName; shotLight.EnableBreakRigidGroup = false; shotLight.EnableCollisions = false; shotLight.EnableCursorInteraction = false; shotLight.EnableAddToCameraDrawTransparentPhysicsObjects = false; scene.UpdateFromInitLocalTransform(shot); } if (turretGun2 != null) { shot = scene.Factory.PhysicsObjectManager.FindOrCreate(shot2Name + shotCountName); shotBase = scene.Factory.PhysicsObjectManager.FindOrCreate(shot2BaseName + shotCountName); shotLight = scene.Factory.PhysicsObjectManager.FindOrCreate(shot2LightName + shotCountName); shot.AddChildPhysicsObject(shotBase); shot.AddChildPhysicsObject(shotLight); Vector3 turretGunPosition = vectorZero; Matrix4 turretGunRotation = matrixIdentity; turretGun2.MainWorldTransform.GetPosition(ref turretGunPosition); turretGun2.MainWorldTransform.GetRotation(ref turretGunRotation); Vector3 shotPosition = vectorZero; Vector3 shotLocalPosition = vectorZero; shotLocalPosition.X = 0.0f; shotLocalPosition.Y = 2.0f; shotLocalPosition.Z = 0.0f; Vector3.TransformVector(ref shotLocalPosition, ref turretGunRotation, out shotPosition); Vector3.Add(ref shotPosition, ref turretGunPosition, out shotPosition); Vector3 shotDirection = vectorZero; Vector3 shotScale = vectorZero; shotDirection.X = turretGunRotation.Row1.X; shotDirection.Y = turretGunRotation.Row1.Y; shotDirection.Z = turretGunRotation.Row1.Z; shotScale.X = shotScale.Y = shotScale.Z = 0.5f; shot.InitLocalTransform.SetRotation(ref matrixIdentity); shot.InitLocalTransform.SetPosition(ref shotPosition); Vector3.Multiply(ref shotDirection, 200.0f, out shotDirection); shot.InitLocalTransform.SetLinearVelocity(ref shotDirection); shot.InitLocalTransform.SetAngularVelocity(ref vectorZero); shot.MaxSimulationFrameCount = 100; shot.EnableRemovePhysicsObjectsFromManagerAfterMaxSimulationFrameCount = false; shotBase.Shape = sphere; shotBase.UserDataStr = sphereName; shotBase.Material.RigidGroup = true; shotBase.InitLocalTransform.SetScale(ref shotScale); shotBase.Integral.SetDensity(1.0f); shotBase.EnableCollisions = true; shotBase.DisableCollision(turretGun1, true); shotBase.MaxDisableCollisionFrameCount = 10; shotBase.EnableBreakRigidGroup = false; shotBase.CreateSound(true); shotLight.Shape = sphere; shotLight.UserDataStr = sphereName; shotLight.CreateLight(true); shotLight.Light.Type = PhysicsLightType.Point; shotLight.Light.Range = 20.0f; shotLight.Light.SetDiffuse(1.0f, 0.7f, 0.0f); shotLight.InitLocalTransform.SetScale(20.0f); shotLight.Material.RigidGroup = true; shotLight.Material.UserDataStr = yellowName; shotLight.EnableBreakRigidGroup = false; shotLight.EnableCollisions = false; shotLight.EnableCursorInteraction = false; shotLight.EnableAddToCameraDrawTransparentPhysicsObjects = false; scene.UpdateFromInitLocalTransform(shot); } } } else { if (turretGunConstraint.IsBroken) { turretBodyDown.DisableCollision(turretGun1, false); turretBodyDown.DisableCollision(turretGun2, false); } } oldKeyboardState = keyboardState; }
public void Create() { Shape sphere = scene.Factory.ShapeManager.Find("Sphere"); Shape box = scene.Factory.ShapeManager.Find("Box"); Shape coneY = scene.Factory.ShapeManager.Find("ConeY"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; Constraint constraint = null; string switchInstanceName = null; Vector3 position1 = Vector3.Zero; Quaternion orientation1 = Quaternion.Identity; for (int i = 0; i < 5; i++) { switchInstanceName = "Switch " + i.ToString(); objectBase = scene.Factory.PhysicsObjectManager.Create(switchInstanceName + instanceIndexName); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood1"; objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f); objectBase.Material.TransparencyFactor = 0.9f; objectBase.InitLocalTransform.SetPosition(-22.0f + 11.0f * i, 25.0f, 20.0f); objectBase.InitLocalTransform.SetScale(5.0f, 4.0f, 0.4f); objectBase.Integral.SetDensity(10.0f); objectBase.EnableScreenToRayInteraction = true; objectBase.UpdateFromInitLocalTransform(); constraint = scene.Factory.ConstraintManager.Create(switchInstanceName + " Slider Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find(switchInstanceName + instanceIndexName); constraint.PhysicsObject2 = null; constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.SetAnchor1(ref position1); constraint.SetAnchor2(ref position1); constraint.SetInitWorldOrientation1(ref orientation1); constraint.MinLimitDistanceZ = -5.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create(switchInstanceName + " Spring Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find(switchInstanceName + instanceIndexName); constraint.PhysicsObject2 = null; constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.SetAnchor1(ref position1); constraint.SetAnchor2(ref position1); constraint.SetInitWorldOrientation1(ref orientation1); constraint.EnableSpringMode = true; constraint.Force = 0.01f; constraint.Update(); scene.UpdateFromInitLocalTransform(objectBase); } for (int i = 0; i < 5; i++) { switchInstanceName = "Switch " + (i + 5).ToString(); objectBase = scene.Factory.PhysicsObjectManager.Create(switchInstanceName + instanceIndexName); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood1"; objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f); objectBase.Material.TransparencyFactor = 0.9f; objectBase.InitLocalTransform.SetPosition(-22.0f + 11.0f * i, 16.0f, 20.0f); objectBase.InitLocalTransform.SetScale(5.0f, 4.0f, 0.4f); objectBase.Integral.SetDensity(10.0f); objectBase.EnableScreenToRayInteraction = true; objectBase.UpdateFromInitLocalTransform(); constraint = scene.Factory.ConstraintManager.Create(switchInstanceName + " Slider Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find(switchInstanceName + instanceIndexName); constraint.PhysicsObject2 = null; constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.SetAnchor1(ref position1); constraint.SetAnchor2(ref position1); constraint.SetInitWorldOrientation1(ref orientation1); constraint.MinLimitDistanceZ = -5.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create(switchInstanceName + " Spring Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find(switchInstanceName + instanceIndexName); constraint.PhysicsObject2 = null; constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.SetAnchor1(ref position1); constraint.SetAnchor2(ref position1); constraint.SetInitWorldOrientation1(ref orientation1); constraint.EnableSpringMode = true; constraint.Force = 0.01f; constraint.Update(); scene.UpdateFromInitLocalTransform(objectBase); } objectBase = scene.Factory.PhysicsObjectManager.Create("Switch Right Light" + instanceIndexName); objectBase.Shape = sphere; objectBase.UserDataStr = "Sphere"; objectBase.CreateLight(true); objectBase.Light.Type = PhysicsLightType.Point; objectBase.Light.SetDiffuse(0.5f, 0.5f, 0.5f); objectBase.Light.Range = 20.0f; objectBase.Material.UserDataStr = "Yellow"; objectBase.InitLocalTransform.SetPosition(34.0f, 20.5f, 10.0f); objectBase.InitLocalTransform.SetScale(20.0f); objectBase.EnableCollisions = false; objectBase.EnableCursorInteraction = false; objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false; scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Switch Right" + instanceIndexName); objectBase.Shape = coneY; objectBase.UserDataStr = "ConeY"; objectBase.Material.UserDataStr = "Yellow"; objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f); objectBase.Material.TransparencyFactor = 0.9f; objectBase.InitLocalTransform.SetPosition(32.0f, 20.5f, 20.0f); objectBase.InitLocalTransform.SetScale(5.0f, 3.0f, 0.4f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f)) * Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(-10.0f))); objectBase.Integral.SetDensity(10.0f); objectBase.EnableScreenToRayInteraction = true; objectBase.UpdateFromInitLocalTransform(); constraint = scene.Factory.ConstraintManager.Create("Switch Right Slider Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Switch Right" + instanceIndexName); constraint.PhysicsObject2 = null; constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.SetAnchor1(ref position1); constraint.SetAnchor2(ref position1); constraint.SetInitWorldOrientation1(ref orientation1); constraint.MinLimitDistanceZ = -5.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Switch Right Spring Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Switch Right" + instanceIndexName); constraint.PhysicsObject2 = null; constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.SetAnchor1(ref position1); constraint.SetAnchor2(ref position1); constraint.SetInitWorldOrientation1(ref orientation1); constraint.EnableSpringMode = true; constraint.Force = 0.01f; constraint.Update(); scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Switch Left Light" + instanceIndexName); objectBase.Shape = sphere; objectBase.UserDataStr = "Sphere"; objectBase.CreateLight(true); objectBase.Light.Type = PhysicsLightType.Point; objectBase.Light.SetDiffuse(0.5f, 0.5f, 0.5f); objectBase.Light.Range = 20.0f; objectBase.Material.UserDataStr = "Yellow"; objectBase.InitLocalTransform.SetPosition(-34.0f, 20.5f, 10.0f); objectBase.InitLocalTransform.SetScale(20.0f); objectBase.EnableCollisions = false; objectBase.EnableCursorInteraction = false; objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false; scene.UpdateFromInitLocalTransform(objectBase); objectBase = scene.Factory.PhysicsObjectManager.Create("Switch Left" + instanceIndexName); objectBase.Shape = coneY; objectBase.UserDataStr = "ConeY"; objectBase.Material.UserDataStr = "Yellow"; objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f); objectBase.Material.TransparencyFactor = 0.9f; objectBase.InitLocalTransform.SetPosition(-32.0f, 20.5f, 20.0f); objectBase.InitLocalTransform.SetScale(5.0f, 3.0f, 0.4f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-90.0f)) * Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(10.0f))); objectBase.Integral.SetDensity(10.0f); objectBase.EnableScreenToRayInteraction = true; objectBase.UpdateFromInitLocalTransform(); constraint = scene.Factory.ConstraintManager.Create("Switch Left Slider Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Switch Left" + instanceIndexName); constraint.PhysicsObject2 = null; constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.SetAnchor1(ref position1); constraint.SetAnchor2(ref position1); constraint.SetInitWorldOrientation1(ref orientation1); constraint.MinLimitDistanceZ = -5.0f; constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.Update(); constraint = scene.Factory.ConstraintManager.Create("Switch Left Spring Constraint" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Switch Left" + instanceIndexName); constraint.PhysicsObject2 = null; constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.SetAnchor1(ref position1); constraint.SetAnchor2(ref position1); constraint.SetInitWorldOrientation1(ref orientation1); constraint.EnableSpringMode = true; constraint.Force = 0.01f; constraint.Update(); scene.UpdateFromInitLocalTransform(objectBase); objectRoot = scene.Factory.PhysicsObjectManager.Create("Info" + instanceIndexName); objectRoot.EnableMoving = false; objectRoot.DrawPriority = 1; objectBase = scene.Factory.PhysicsObjectManager.Create("Info Description" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood1"; objectBase.Material.RigidGroup = true; objectBase.Material.SetAmbient(0.51f, 0.52f, 0.51f); objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f); objectBase.Material.TransparencyFactor = 0.9f; objectBase.InitLocalTransform.SetPosition(0.0f, -6.0f, 20.0f); objectBase.InitLocalTransform.SetScale(15.0f, 27.0f, 0.4f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f))); objectBase.Integral.SetDensity(1.0f); objectBase.EnableDrawing = false; objectBase.EnableCollisionResponse = false; objectBase.EnableMoving = false; objectBase = scene.Factory.PhysicsObjectManager.Create("Info Screen" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectBase); objectBase.Shape = box; objectBase.UserDataStr = "Box"; objectBase.Material.UserDataStr = "Wood1"; objectBase.Material.RigidGroup = true; objectBase.Material.SetDiffuse(1.0f, 1.0f, 1.0f); objectBase.Material.TransparencyFactor = 0.9f; objectBase.InitLocalTransform.SetPosition(18.2f, 1.6f, 20.0f - 0.4f - 0.01f); objectBase.InitLocalTransform.SetScale(7.0f, 6.0f, 0.01f); objectBase.Integral.SetDensity(1.0f); objectBase.EnableDrawing = false; objectBase.EnableCollisionResponse = false; objectBase.EnableMoving = false; scene.UpdateFromInitLocalTransform(objectRoot); }
public void Create(Vector3 objectPosition, Vector3 objectScale, Quaternion objectOrientation, PhysicsObject joinPhysicsObject) { Shape sphere = scene.Factory.ShapeManager.Find("Sphere"); Shape cylinderY = scene.Factory.ShapeManager.Find("CylinderY"); Shape convex = scene.Factory.ShapeManager.Find("Lamp1Convex"); PhysicsObject objectRoot = null; PhysicsObject objectBase = null; PhysicsObject objectA = null; Vector3 position1 = Vector3.Zero; Quaternion orientation1 = Quaternion.Identity; objectRoot = scene.Factory.PhysicsObjectManager.Create("Lamp 1" + instanceIndexName); objectA = scene.Factory.PhysicsObjectManager.Create("Lamp 1 Body" + instanceIndexName); objectRoot.AddChildPhysicsObject(objectA); objectBase = scene.Factory.PhysicsObjectManager.Create("Lamp 1 Body Main" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = convex; objectBase.UserDataStr = "Lamp1Convex"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.InitLocalTransform.SetPosition(0.0f, 0.0f, 0.0f); objectBase.InitLocalTransform.SetScale(1.0f, 2.0f, 1.0f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Lamp 1 Body Emitter" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Yellow"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.InitLocalTransform.SetPosition(0.0f, 2.2f, 0.0f); objectBase.InitLocalTransform.SetScale(0.1f, 0.2f, 0.1f); objectBase.Integral.InertiaScaleFactor = 3.0f; objectBase.Integral.SetDensity(1.0f); objectBase.MinResponseAngularVelocity = 0.05f; objectBase.MinResponseLinearVelocity = 0.05f; objectBase.CreateSound(true); objectBase = scene.Factory.PhysicsObjectManager.Create("Lamp 1 Body Light" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = sphere; objectBase.UserDataStr = "Sphere"; objectBase.Material.RigidGroup = true; objectBase.Material.UserDataStr = "Yellow"; objectBase.InitLocalTransform.SetPosition(0.0f, 2.2f, 0.0f); objectBase.InitLocalTransform.SetScale(15.0f); objectBase.CreateLight(true); objectBase.Light.Type = PhysicsLightType.Point; objectBase.Light.SetDiffuse(1.0f, 0.8f, 0.1f); objectBase.Light.Range = 15.0f; objectBase.EnableBreakRigidGroup = false; objectBase.EnableCollisions = false; objectBase.EnableCursorInteraction = false; objectBase.EnableAddToCameraDrawTransparentPhysicsObjects = false; objectBase = scene.Factory.PhysicsObjectManager.Create("Lamp 1 Body Handle" + instanceIndexName); objectA.AddChildPhysicsObject(objectBase); objectBase.Shape = cylinderY; objectBase.UserDataStr = "CylinderY"; objectBase.Material.UserDataStr = "Iron"; objectBase.Material.RigidGroup = true; objectBase.Material.MinBreakRigidGroupVelocity = 400.0f; objectBase.InitLocalTransform.SetPosition(-2.0f, 0.0f, 0.0f); objectBase.InitLocalTransform.SetOrientation(Quaternion.FromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(90.0f))); objectBase.InitLocalTransform.SetScale(0.5f, 2.0f, 0.5f); objectBase.Integral.SetDensity(1.0f); objectBase.CreateSound(true); objectRoot.UpdateFromInitLocalTransform(); objectRoot.InitLocalTransform.SetOrientation(ref objectOrientation); objectRoot.InitLocalTransform.SetScale(ref objectScale); objectRoot.InitLocalTransform.SetPosition(ref objectPosition); scene.UpdateFromInitLocalTransform(objectRoot); Constraint constraint = null; constraint = scene.Factory.ConstraintManager.Create("Lamp 1 Constraint 1" + instanceIndexName); constraint.PhysicsObject1 = scene.Factory.PhysicsObjectManager.Find("Lamp 1 Body Handle" + instanceIndexName); constraint.PhysicsObject2 = joinPhysicsObject; constraint.PhysicsObject1.MainWorldTransform.GetPosition(ref position1); constraint.PhysicsObject1.MainWorldTransform.GetOrientation(ref orientation1); constraint.SetAnchor1(position1 + new Vector3(-2.0f, 0.0f, 0.0f)); constraint.SetAnchor2(position1 + new Vector3(-2.0f, 0.0f, 0.0f)); constraint.SetInitWorldOrientation1(orientation1); constraint.SetInitWorldOrientation2(orientation1); constraint.EnableLimitAngleX = true; constraint.EnableLimitAngleY = true; constraint.EnableLimitAngleZ = true; constraint.EnableBreak = true; constraint.Update(); }