public void CreateTriangleData() { Initialize(); for (int triangleIndex = 0; triangleIndex < meshTriangles.Length / 3; ++triangleIndex) { SetSortedTriangleVertices(triangleIndex); PreviousBuffers[triangleIndex] = CurrentBuffers[triangleIndex]; CurrentBuffers[triangleIndex] = new TriangleBuffer(currentVertices[0].globalVertex, currentVertices[1].globalVertex, currentVertices[2].globalVertex, Rigidbody3d); TriangleState triangleState = SetTriangleState(); switch (triangleState) { case TriangleState.AboveWater: CurrentBuffers[triangleIndex].submergedArea = 0f; break; case TriangleState.TwoAboveWater: CurrentBuffers[triangleIndex].submergedArea = CuttingAlgorithmTwoAbove(currentVertices[0], currentVertices[1], currentVertices[2], triangleIndex); break; case TriangleState.OneAboveWater: CurrentBuffers[triangleIndex].submergedArea = CuttingAlgorithmOneAbove(currentVertices[0], currentVertices[1], currentVertices[2], triangleIndex); break; case TriangleState.Submerged: CuttingAlgorithmHorizontal(currentVertices[0], currentVertices[1], currentVertices[2], triangleIndex); CurrentBuffers[triangleIndex].submergedArea = CurrentBuffers[triangleIndex].originalArea; break; default: break; } } }
public static Vector3 SlammingForce(TriangleBuffer previousBuffer, TriangleBuffer currentBuffer, TriangleInfo triangle, float maxAcceleration, float rampUpPower, float totalMass, float totalArea) { if (triangle.cosine < 0f) { return(Vector3.zero); } Vector3 currentDeltaVolume = currentBuffer.submergedArea * currentBuffer.velocity; Vector3 previousDeltaVolume = previousBuffer.submergedArea * previousBuffer.velocity; Vector3 acceleration = (currentDeltaVolume - previousDeltaVolume) / (currentBuffer.originalArea * Time.fixedDeltaTime); Vector3 stoppingForce = totalMass * triangle.velocity * (2f * triangle.area / totalArea); float realAcceleration = Mathf.Clamp01(acceleration.magnitude / maxAcceleration); return(-1 * Mathf.Pow(realAcceleration, rampUpPower) * triangle.cosine * stoppingForce); }
private void OnEnable() { timeStamp = Time.time; SubmergedTriangles = new List <TriangleInfo>(); TriangleBufferIndices = new List <int>(); meshVertices = Mesh.vertices; meshTriangles = Mesh.triangles; // Count of triangles is always multiple of 3 int triangleCount = meshTriangles.Length / 3; PreviousBuffers = new TriangleBuffer[triangleCount]; CurrentBuffers = new TriangleBuffer[triangleCount]; TotalArea = 0f; for (int triangleIndex = 0; triangleIndex < triangleCount; ++triangleIndex) { TotalArea += WaterInteractionUtils.GetTriangleArea( transform.TransformPoint(meshVertices[meshTriangles[triangleIndex * 3]]), transform.TransformPoint(meshVertices[meshTriangles[triangleIndex * 3 + 1]]), transform.TransformPoint(meshVertices[meshTriangles[triangleIndex * 3 + 2]])); } }