コード例 #1
0
        public void TimestepUpdate(float deltaPosition)
        {
            if (FirstWheelsetSegment == null || LastWheelsetSegment == null)
            {
                return;
            }

            SavePreviousParameters();

            // Move first wheelset to travel signedSpeed * deltaTime
            float signedDistanceToMove = deltaPosition * FirstWheelsetDirectionOfT;
            float segmentT             = FirstWheelsetSegmentT;
            int   directionOfT         = FirstWheelsetDirectionOfT;

            FirstWheelsetSegment = FirstWheelsetSegment.MoveSignedDistance(signedDistanceToMove, ref segmentT, ref directionOfT);
            if (FirstWheelsetSegment == null)
            {
                return;
            }
            FirstWheelsetSegmentT     = segmentT;
            FirstWheelsetDirectionOfT = directionOfT;

            // Move last wheelset to keep up with first wheelset
            UpdateLastWheelsetPosition();
            if (LastWheelsetSegment == null)
            {
                return;
            }

            WheelsetsTimeStepUpdate(deltaPosition);
        }
コード例 #2
0
        public void TimestepUpdate(Bogie previousBogie, float deltaPosition)
        {
            if (FirstWheelsetSegment == null || LastWheelsetSegment == null)
            {
                return;
            }

            SavePreviousParameters();

            // Move first wheelset to keep up with previous bogie
            Vector3 lastWheelsetPosition  = previousBogie.LastWheelsetSegment.GetCurvePositionInWorldSpace(previousBogie.LastWheelsetSegmentT);
            Vector3 firstWheelsetPosition = FirstWheelsetSegment.GetCurvePositionInWorldSpace(FirstWheelsetSegmentT);
            float   wantedDistance        = DistanceFromLastWheelsetOfPreviousBogieToFirstWheelset(previousBogie);
            float   actualDistance        = (lastWheelsetPosition - firstWheelsetPosition).magnitude;
            float   distanceToMove        = FirstWheelsetDirectionOfT * (actualDistance - wantedDistance);

            FirstWheelsetSegment = FirstWheelsetSegment.MoveSignedDistance(distanceToMove, ref FirstWheelsetSegmentT, ref FirstWheelsetDirectionOfT);
            if (FirstWheelsetSegment == null)
            {
                return;
            }

            // Move last wheelset to keep up with first wheelset
            UpdateLastWheelsetPosition();
            if (LastWheelsetSegment == null)
            {
                return;
            }

            WheelsetsTimeStepUpdate(deltaPosition);
        }
コード例 #3
0
        private void PutLastWheelsetOnTrack()
        {
            float distance = Definition.DistanceFromFirstToLastWheelset * -FirstWheelsetDirectionOfT;

            LastWheelsetSegmentT     = FirstWheelsetSegmentT;
            LastWheelsetDirectionOfT = FirstWheelsetDirectionOfT;
            LastWheelsetSegment      = FirstWheelsetSegment.MoveSignedDistance(distance, ref LastWheelsetSegmentT, ref LastWheelsetDirectionOfT);
        }
コード例 #4
0
        public void FramestepUpdate(Transform[] debugWheelsetMarkers)
        {
            if (FirstWheelsetSegment == null || LastWheelsetSegment == null)
            {
                return;
            }

            Vector3 firstWheelsetPosition = FirstWheelsetSegment.GetCurvePositionInWorldSpace(FirstWheelsetSegmentT);

            if (debugWheelsetMarkers != null)
            {
                debugWheelsetMarkers[0].localPosition = firstWheelsetPosition + new Vector3(0, FirstWheelsetSegment.RailPiece.RailTopHeight, 0);
            }

            Vector3 firstToLastWheelsetDirection;

            if (Definition.Wheelsets.Length == 1)
            {
                firstToLastWheelsetDirection = -FirstWheelsetDirectionOfT *FirstWheelsetSegment.GetCurveTangentInWorldSpace(FirstWheelsetSegmentT);
            }
            else
            {
                Vector3 lastWheelsetPosition = LastWheelsetSegment.GetCurvePositionInWorldSpace(LastWheelsetSegmentT);
                if (debugWheelsetMarkers != null)
                {
                    debugWheelsetMarkers[1].localPosition = lastWheelsetPosition + new Vector3(0, FirstWheelsetSegment.RailPiece.RailTopHeight, 0);
                }

                firstToLastWheelsetDirection = lastWheelsetPosition - firstWheelsetPosition;
                firstToLastWheelsetDirection.Normalize();
            }

            Vector3 bogiePosition = firstWheelsetPosition + Definition.Wheelsets[0].SignedDistanceToBogie * firstToLastWheelsetDirection;

            bogiePosition.y += Definition.Translation.y + FirstWheelsetSegment.RailPiece.RailTopHeight;

            float angle = -Mathf.Atan2(-firstToLastWheelsetDirection.z, -firstToLastWheelsetDirection.x);

            Transform.localPosition = bogiePosition;
            Transform.localRotation = Quaternion.Euler(0, angle, 0);

            for (int wheelsetIndex = 0; wheelsetIndex < m_wheelsetTransforms.Length; wheelsetIndex++)
            {
                Vector3 wheelsetPositionInBogieSpace = m_wheelsetTransforms[wheelsetIndex].localPosition;
                m_wheelsetTransforms[wheelsetIndex].localRotation = Quaternion.Euler(0, 0, -m_wheelsetRotations[wheelsetIndex]);
                m_wheelsetTransforms[wheelsetIndex].localPosition = wheelsetPositionInBogieSpace;
            }
        }
コード例 #5
0
        private void UpdateLastWheelsetPosition()
        {
            if (Definition.Wheelsets.Length == 1)
            {
                LastWheelsetSegment      = FirstWheelsetSegment;
                LastWheelsetSegmentT     = FirstWheelsetSegmentT;
                LastWheelsetDirectionOfT = FirstWheelsetDirectionOfT;
                return;
            }
            Vector3 firstWheelsetPosition = FirstWheelsetSegment.GetCurvePositionInWorldSpace(FirstWheelsetSegmentT);
            Vector3 lastWheelsetPosition  = LastWheelsetSegment.GetCurvePositionInWorldSpace(LastWheelsetSegmentT);
            float   wantedDistance        = Definition.DistanceFromFirstToLastWheelset;
            float   actualDistance        = (firstWheelsetPosition - lastWheelsetPosition).magnitude;
            float   distanceToMove        = LastWheelsetDirectionOfT * (actualDistance - wantedDistance);

            LastWheelsetSegment = LastWheelsetSegment.MoveSignedDistance(distanceToMove, ref LastWheelsetSegmentT, ref LastWheelsetDirectionOfT);
        }