Пример #1
0
 private void FixedUpdate()
 {
     _VertexPositions = GlobalCarCalculations.CalculateVertexPositonsOfBoxCollider(GetManager.GetBoxCollider, 0);
     Suspension();
     Gravity();
     GetManager.TranslateTransform(_SuspensionGravityVelocity, Space.World);
 }
Пример #2
0
    private void Suspension()
    {
        RaycastInformarionAtDesirablePosition();

        _Grounded = GlobalCarCalculations.GroundCheck(_CompressionRatios);

        if (_Grounded)
        {
            _CombinedSurviceNormal = GlobalCarCalculations.ReturnAverageSurviceNormal(_SurviceNormals);
        }

        RotateObjectToNormal(_InterpolatedNormal);

        _GravityForceDirection = GlobalCarCalculations.CalculateGravity(_InterpolatedNormal, GetManager.GetGravityMultiplier);

        if (_EngineIsOn)
        {
            _SuspensionForceDirection = GlobalCarCalculations.CalculateSuspensionForceDirection(_InterpolatedNormal, GetManager.GetSuspensionForceMultipleir);
        }
        else
        {
            _SuspensionForceDirection = _GravityForceDirection + (_GravityForceDirection * 0.01f);
        }

        _HighestCompressionRatio  = GlobalCarCalculations.ReturnHighestCompressionRatio(_CompressionRatios);
        _CombinedCompressionRatio = GlobalCarCalculations.ReturnAverageCompressionRatio(_CompressionRatios);

        if (_HighestCompressionRatio == 1 && Vector3.Dot(_SuspensionGravityVelocity, _InterpolatedNormal) < 0)
        {
            _SuspensionGravityVelocity = Vector3.zero;
        }

        ElaborateSuspensionForce(_CombinedCompressionRatio); //Interchangeable with "_HighestCompressionRatio" and "_CombinedCompressionRatio"

        if (_Grounded && _EngineIsOn)
        {
            FrictionDuringSuspension();
        }

        _PreHighestCompressionRatio = _HighestCompressionRatio;
    }
Пример #3
0
    private void RaycastInformarionAtDesirablePosition()
    {
        float xOffset = 0.2f;
        float yOffset = transform.lossyScale.y * GetManager.GetRaycastYoffset;
        float zOffset = 0.2f;

        RaycastHit[] hits = new RaycastHit[_CompressionRatios.Length];

        if (Physics.Raycast(_VertexPositions[2] + ((-transform.right * xOffset) + (transform.up * yOffset) + (-transform.forward * zOffset)), -transform.up, out hits[0], (GetManager.GetRaycastDistence + yOffset)))
        {
            _CompressionRatios[0] = GlobalCarCalculations.CalculateCompressionRatio(hits[0].distance - yOffset, GetManager.GetRaycastDistence);
            _SurviceNormals[0]    = hits[0].normal;
            _PreSurviceNormals[0] = _SurviceNormals[0];
        }
        else
        {
            _CompressionRatios[0] = 0;
            _SurviceNormals[0]    = Vector3.zero;
        }

        if (Physics.Raycast(_VertexPositions[3] + ((transform.right * xOffset) + (transform.up * yOffset) + (-transform.forward * zOffset)), -transform.up, out hits[1], (GetManager.GetRaycastDistence + yOffset)))
        {
            _CompressionRatios[1] = GlobalCarCalculations.CalculateCompressionRatio(hits[1].distance - yOffset, GetManager.GetRaycastDistence);
            _SurviceNormals[1]    = hits[1].normal;
            _PreSurviceNormals[1] = _SurviceNormals[1];
        }
        else
        {
            _CompressionRatios[1] = 0;
            _SurviceNormals[1]    = Vector3.zero;
        }

        if (Physics.Raycast(_VertexPositions[6] + ((-transform.right * xOffset) + (transform.up * yOffset) + (transform.forward * zOffset)), -transform.up, out hits[2], (GetManager.GetRaycastDistence + yOffset)))
        {
            _CompressionRatios[2] = GlobalCarCalculations.CalculateCompressionRatio(hits[2].distance - yOffset, GetManager.GetRaycastDistence);
            _SurviceNormals[2]    = hits[2].normal;
            _PreSurviceNormals[2] = _SurviceNormals[2];
        }
        else
        {
            _CompressionRatios[2] = 0;
            _SurviceNormals[2]    = Vector3.zero;
        }

        if (Physics.Raycast(_VertexPositions[7] + ((transform.right * xOffset) + (transform.up * yOffset) + (transform.forward * zOffset)), -transform.up, out hits[3], (GetManager.GetRaycastDistence + yOffset)))
        {
            _CompressionRatios[3] = GlobalCarCalculations.CalculateCompressionRatio(hits[3].distance - yOffset, GetManager.GetRaycastDistence);
            _SurviceNormals[3]    = hits[3].normal;
            _PreSurviceNormals[3] = _SurviceNormals[3];
        }
        else
        {
            _CompressionRatios[3] = 0;
            _SurviceNormals[3]    = Vector3.zero;
        }

        ///
        Vector3 _RaycastPosition = ((_VertexPositions[2] + _VertexPositions[3] + _VertexPositions[6] + _VertexPositions[7]) * 0.25f);

        RaycastHit hit = new RaycastHit();

        if (Physics.Raycast(_RaycastPosition + (transform.up * yOffset), -transform.up, out hit, (GetManager.GetRaycastDistence + yOffset)))
        {
            if (_Mesh != hit.collider.gameObject.GetComponent <MeshCollider>().sharedMesh)
            {
                _Mesh      = hit.collider.gameObject.GetComponent <MeshCollider>().sharedMesh;
                _Normals   = _Mesh.normals;
                _Triangles = _Mesh.triangles;
            }

            Vector3 n0                 = _Normals[_Triangles[hit.triangleIndex * 3 + 0]];
            Vector3 n1                 = _Normals[_Triangles[hit.triangleIndex * 3 + 1]];
            Vector3 n2                 = _Normals[_Triangles[hit.triangleIndex * 3 + 2]];
            Vector3 baryCenter         = hit.barycentricCoordinate;
            Vector3 interpolatedNormal = n0 * baryCenter.x + n1 * baryCenter.y + n2 * baryCenter.z;
            interpolatedNormal = interpolatedNormal.normalized;
            Transform hitTransform = hit.collider.transform;
            interpolatedNormal = hitTransform.TransformDirection(interpolatedNormal);


            _InterpolatedNormal = interpolatedNormal;
        }
    }