Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        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]]));
            }
        }