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); }
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); }
private void PutLastWheelsetOnTrack() { float distance = Definition.DistanceFromFirstToLastWheelset * -FirstWheelsetDirectionOfT; LastWheelsetSegmentT = FirstWheelsetSegmentT; LastWheelsetDirectionOfT = FirstWheelsetDirectionOfT; LastWheelsetSegment = FirstWheelsetSegment.MoveSignedDistance(distance, ref LastWheelsetSegmentT, ref LastWheelsetDirectionOfT); }
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; } }
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); }