Exemplo n.º 1
0
    private void SetSegmentSinusoidalPosition(SnakeSegment segment, Vector3 basePosition, float snakeSpeed)
    {
        SnakeTrail.SnakePosition lastCorner = this.trail.GetClosestCornerBehind(segment);

        float distanceInCellsSinceCorner = GetDistanceInCellsSinceLastCorner(segment, lastCorner.Position);
        float sinInterpolationPercent    = GetInterpolationPercent(distanceInCellsSinceCorner);

        if (distanceInCellsSinceCorner < 0.5f)
        {
            // Calculate where based on sin we WANT to end up in half a tile.
            Vector3 sinPosition = GetSinusoidalPosition(segment, sinInterpolationPercent, basePosition);
            segment.transform.localPosition = sinPosition;

            float angleInterpolation = Mathf.Sqrt(distanceInCellsSinceCorner / 0.5f);

            Vector3 angles = InterpolateFacing(segment, lastCorner, angleInterpolation);
            segment.transform.eulerAngles = angles;
        }
        else
        {
            Vector3 sinPosition = GetSinusoidalPosition(segment, sinInterpolationPercent, basePosition);
            Vector3 sinAngles   = GetSinusoidalAngle(segment, sinInterpolationPercent);
            segment.transform.localPosition = sinPosition;
            segment.transform.eulerAngles   = sinAngles;
        }
    }
Exemplo n.º 2
0
    private Vector3 InterpolateFacing(SnakeSegment segment, SnakeTrail.SnakePosition lastCorner, float interpolation)
    {
        Vector3   firstDirectionVector = lastCorner.UnitVectorToPreviousPosition * -1.0f;
        Direction firstDirection       = SerpentConsts.GetDirectionForVector(firstDirectionVector);
        Direction secondDirection      = segment.CurrentDirection;

        Vector3 firstEulerAngles  = SerpentConsts.RotationVector3[(int)firstDirection];
        Vector3 secondEulerAngles = SerpentConsts.RotationVector3[(int)secondDirection];

        // Compare the sign of the angles and make sure they are both positive or both negative to account for the circle.
        if (firstEulerAngles.z * secondEulerAngles.z < 0.0f)
        {
            // sign problem to do with west (90) and south (-180)
            if (firstEulerAngles.z < -90.0f)
            {
                firstEulerAngles *= -1.0f;
            }
            else
            {
                secondEulerAngles *= -1.0f;
            }
        }
        Vector3 currentEulerAngles = firstEulerAngles * (1.0f - interpolation) + secondEulerAngles * interpolation;

        return(currentEulerAngles);
    }