void Update() { //Update presets if changed if (SBPresetSelect != lastSBPresetSelect) { SoftBodySettings.ResetToSoftBodyPresets(SBPresetSelect); } lastSBPresetSelect = SBPresetSelect; if (!enableRain) { return; } if ((Time.time - lastBunnyTime) > (1 / softBodiesPerSecond)) { Vector3 pos = new Vector3(0, 0, 0); pos.x = startAreaOfRain.center.x + UnityEngine.Random.Range(-startAreaOfRain.width / 2, startAreaOfRain.width / 2); pos.z = startAreaOfRain.center.y + UnityEngine.Random.Range(-startAreaOfRain.height / 2, startAreaOfRain.height / 2); pos.y = fromHeight; GameObject go = BSoftBodyWMesh.CreateNew(pos, UnityEngine.Random.rotation, anyMeshSettings.Build(), false, SBPresetSelect); BSoftBodyWMesh bSoft = go.GetComponent <BSoftBodyWMesh>(); bSoft.meshSettings.autoWeldVertices = anyMeshSettings.autoWeldVertices; bSoft.meshSettings.autoWeldThreshold = anyMeshSettings.autoWeldThreshold; bSoft.meshSettings.recalculateNormals = anyMeshSettings.recalculateNormals; bSoft.meshSettings.addBackFaceTriangles = anyMeshSettings.addBackFaceTriangles; bSoft.meshSettings.recalculateBounds = anyMeshSettings.recalculateBounds; //bSoft.meshSettings.optimize = anyMeshSettings.optimize; bSoft.SoftBodySettings = SoftBodySettings; //play with settings //bSoft.SoftBodySettings.config.Collisions = collisionMask; bSoft._BuildCollisionObject(); //randomize color for effect go.GetComponent <MeshRenderer>().material.color = new Color(UnityEngine.Random.Range(0.0f, 1.0f), UnityEngine.Random.Range(0.0f, 1.0f), UnityEngine.Random.Range(0.0f, 1.0f)); Destroy(go, lifetime); lastBunnyTime = Time.time; } }
/// <summary> /// Create new SoftBody object using a Mesh /// </summary> /// <param name="position">World position</param> /// <param name="rotation">rotation</param> /// <param name="mesh">Need to provide a mesh</param> /// <param name="buildNow">Build now or configure properties and call BuildSoftBody() after</param> /// <param name="sBpresetSelect">Use a particular softBody configuration pre select values</param> /// <returns></returns> public static GameObject CreateNew(Vector3 position, Quaternion rotation, Mesh mesh, bool buildNow, SBSettingsPresets sBpresetSelect = SBSettingsPresets.ShapeMatching) { GameObject go = new GameObject(); go.transform.position = position; go.transform.rotation = rotation; BSoftBodyWMesh BSoft = go.AddComponent<BSoftBodyWMesh>(); BSoft.meshSettings.UserMesh = mesh; MeshRenderer meshRenderer = go.GetComponent<MeshRenderer>(); UnityEngine.Material material = new UnityEngine.Material(Shader.Find("Standard")); meshRenderer.material = material; BSoft.SoftBodySettings.ResetToSoftBodyPresets(sBpresetSelect); //Apply SoftBody settings presets if (buildNow) BSoft.BuildSoftBody(); //Build the SoftBody go.name = "BSoftBodyWMesh"; return go; }
void Update() { //Update presets if changed if (SBPresetSelect != lastSBPresetSelect) SoftBodySettings.ResetToSoftBodyPresets(SBPresetSelect); lastSBPresetSelect = SBPresetSelect; if (!enableRain) return; if ((Time.time - lastBunnyTime) > (1 / softBodiesPerSecond)) { Vector3 pos = new Vector3(0, 0, 0); pos.x = startAreaOfRain.center.x + UnityEngine.Random.Range(-startAreaOfRain.width / 2, startAreaOfRain.width / 2); pos.z = startAreaOfRain.center.y + UnityEngine.Random.Range(-startAreaOfRain.height / 2, startAreaOfRain.height / 2); pos.y = fromHeight; GameObject go = BSoftBodyWMesh.CreateNew(pos, UnityEngine.Random.rotation, anyMeshSettings.Build(), false, SBPresetSelect); BSoftBodyWMesh bSoft = go.GetComponent<BSoftBodyWMesh>(); bSoft.meshSettings. autoWeldVertices = anyMeshSettings.autoWeldVertices; bSoft.meshSettings.autoWeldThreshold = anyMeshSettings.autoWeldThreshold; bSoft.meshSettings.recalculateNormals = anyMeshSettings.recalculateNormals; bSoft.meshSettings.addBackFaceTriangles = anyMeshSettings.addBackFaceTriangles; bSoft.meshSettings.recalculateBounds = anyMeshSettings.recalculateBounds; bSoft.meshSettings.optimize = anyMeshSettings.optimize; bSoft.SoftBodySettings = SoftBodySettings; //play with settings //bSoft.SoftBodySettings.config.Collisions = collisionMask; bSoft._BuildCollisionObject(); //randomize color for effect go.GetComponent<MeshRenderer>().material.color = new Color(UnityEngine.Random.Range(0.0f, 1.0f), UnityEngine.Random.Range(0.0f, 1.0f), UnityEngine.Random.Range(0.0f, 1.0f)); Destroy(go, lifetime); lastBunnyTime = Time.time; } }
//TODO: lots! These presets need work. /// <summary> /// Reset and Configure SoftBody settings for some general preset values. Can use as a starting point before optimization. /// </summary> /// <param name="preset"></param> public void ResetToSoftBodyPresets(SBSettingsPresets preset) { sBpresetSelect = preset; //save last applied preset totalMass = 10f; scale = Vector3.one; fromFaces = true; bframe = true; bvolume = false; generateClusters = false; bendingConstraintDistance = 2; randomizeConstraints = true; config = new SBConfig(); sBMaterial = new SBMaterial(); switch (preset) { case SBSettingsPresets.Default: //reset itself break; case SBSettingsPresets.Cloth: fromFaces = false; bvolume = false; bframe = false; sBMaterial.LinearStiffness = 0.5f; break; case SBSettingsPresets.Rope: config.PositionIterations = 20; sBMaterial.LinearStiffness = 0.5f; bendingConstraintDistance = 0; randomizeConstraints = false; fromFaces = false; bframe = false; bvolume = false; break; case SBSettingsPresets.ConvexHull: break; case SBSettingsPresets.Pressurized: sBMaterial.LinearStiffness = 0.1f; config.DynamicFriction = 1; config.Damping = 0.001f; // fun factor... config.Pressure = 2500; fromFaces = true; break; case SBSettingsPresets.Aerodynamic: config.Lift = 0.004f; config.Drag = 0.0003f; config.aeroModel = AeroModel.VertexTwoSided; break; case SBSettingsPresets.Volume: sBMaterial.LinearStiffness = 0.45f; config.VolumeConversation = 20; totalMass = 50f; fromFaces = true; bvolume = true; bframe = false; break; case SBSettingsPresets.ShapeMatching: sBMaterial.LinearStiffness = 0.5f; config.DynamicFriction = 0.5f; config.PoseMatching = 0.05f; config.PositionIterations = 10; randomizeConstraints = true; totalMass = 100f; fromFaces = true; bvolume = false; bframe = true; break; case SBSettingsPresets.ropeStick: config.AnchorHardness = 0.7f; config.ClusterIterations = 4; config.RigidContactHardness = 0.1f; config.DynamicFriction = 0.2f; config.Drag = 0f; config.DriftIterations = 0; config.Damping = 0.005f; config.KineticContactHardness = 0.1f; config.Lift = 0; config.PoseMatching = 0; config.MaxVolume = 1.0f; config.PositionIterations = 1; config.Pressure = 0; config.SoftKineticImpulseSplit = 0.5f; config.SoftRigidImpulseSplit = 0.5f; config.SoftSoftImpulseSplit = 0.5f; config.Shr = 1f; config.SoftKineticHardness = 1f; config.SoftRigidHardness = 0.1f; config.SoftSoftHardness = 0.5f; config.Timescale = 1; config.VolumeConversation = 0f; config.VelocityCorrectionFactor = 1f; config.VelocityIterations = 0; sBMaterial.LinearStiffness = 1.0f; sBMaterial.AngularStiffness = 1.0f; sBMaterial.VolumeStiffness = 1.0f; bframe = false; fromFaces = false; bvolume = false; generateClusters = false; totalMass = 0.01f; break; default: break; } }
//TODO: lots! These presets need work. /// <summary> /// Reset and Configure SoftBody settings for some general preset values. Can use as a starting point before optimization. /// </summary> /// <param name="preset"></param> public void ResetToSoftBodyPresets(SBSettingsPresets preset) { sBpresetSelect = preset; //save last applied preset totalMass = 10f; scale = Vector3.one; fromFaces = true; bframe = true; bvolume = false; generateClusters = false; bendingConstraintDistance = 2; randomizeConstraints = true; config = new SBConfig(); sBMaterial = new SBMaterial(); switch (preset) { case SBSettingsPresets.Default: //reset itself break; case SBSettingsPresets.Cloth: fromFaces = false; bvolume = false; bframe = false; sBMaterial.LST = 0.5f; break; case SBSettingsPresets.Rope: config.PIterations = 20; sBMaterial.LST = 0.5f; bendingConstraintDistance = 0; randomizeConstraints = false; fromFaces = false; bframe = false; bvolume = false; break; case SBSettingsPresets.ConvexHull: break; case SBSettingsPresets.Pressurized: sBMaterial.LST = 0.1f; config.DF = 1; config.DP = 0.001f; // fun factor... config.PR = 2500; fromFaces = true; break; case SBSettingsPresets.Aerodynamic: config.LF = 0.004f; config.DG = 0.0003f; config.aeroModel = AeroModel.VTwoSided; break; case SBSettingsPresets.Volume: sBMaterial.LST = 0.45f; config.VC = 20; totalMass = 50f; fromFaces = true; bvolume = true; bframe = false; break; case SBSettingsPresets.ShapeMatching: sBMaterial.LST = 0.5f; config.DF = 0.5f; config.MT = 0.05f; config.PIterations = 10; randomizeConstraints = true; totalMass = 100f; fromFaces = true; bvolume = false; bframe = true; break; case SBSettingsPresets.ropeStick: config.Ahr = 0.7f; config.CIterations = 4; config.Chr = 0.1f; config.DF = 0.2f; config.DG = 0f; config.DIterations = 0; config.DP = 0.005f; config.Khr = 0.1f; config.LF = 0; config.MT = 0; config.MaxVolume = 1.0f; config.PIterations = 1; config.PR = 0; config.SKSplitCL = 0.5f; config.SRSplitCL = 0.5f; config.SSSplitCL = 0.5f; config.Shr = 1f; config.SkhrCL = 1f; config.SrhrCL = 0.1f; config.SshrCL = 0.5f; config.Timescale = 1; config.VC = 0f; config.Vcf = 1f; config.Viterations = 0; sBMaterial.LST = 1.0f; sBMaterial.AST = 1.0f; sBMaterial.VST = 1.0f; bframe = false; fromFaces = false; bvolume = false; generateClusters = false; totalMass = 0.01f; break; default: break; } }
/// <summary> /// Create new SoftBody object using a Mesh /// </summary> /// <param name="position">World position</param> /// <param name="rotation">rotation</param> /// <param name="mesh">Need to provide a mesh</param> /// <param name="buildNow">Build now or configure properties and call BuildSoftBody() after</param> /// <param name="sBpresetSelect">Use a particular softBody configuration pre select values</param> /// <returns></returns> public static GameObject CreateNew(Vector3 position, Quaternion rotation, Mesh mesh, bool buildNow, SBSettingsPresets sBpresetSelect = SBSettingsPresets.ShapeMatching) { GameObject go = new GameObject("SoftBodyWMesh"); go.transform.position = position; go.transform.rotation = rotation; BSoftBodyWMesh BSoft = go.AddComponent <BSoftBodyWMesh>(); BSoft.meshSettings.UserMesh = mesh; MeshRenderer meshRenderer = go.GetComponent <MeshRenderer>(); UnityEngine.Material material = new UnityEngine.Material(Shader.Find("Standard")); meshRenderer.material = material; BSoft.SoftBodySettings.ResetToSoftBodyPresets(sBpresetSelect); //Apply SoftBody settings presets if (buildNow) { BSoft._BuildCollisionObject(); //Build the SoftBody } go.name = "BSoftBodyWMesh"; return(go); }