Tangents were completely wrong, however I have to manually calculate them AND set the upvector of the spline. It all works apart from the very first point which I cannot figure out.
void AGESGame_Orrery::SetTorusForOrbit(const FOrbitParams& InOrbit, float Radius)
{
const FRotator OrbitPlane_Rot = FRotator(0.f, InOrbit.LongitudeAscendingNode, InOrbit.Inclination * -1.0f);
const FVector OrbitPlane_Up = FRotationMatrix(OrbitPlane_Rot).GetScaledAxis(EAxis::Z).GetSafeNormal();
// Plots the Orbit Torus for a given Orbit
const double EAngle = 360.f / NumTorusPoints;
for (int32 i = 0; i < NumTorusPoints; i++)
{
TorusSplinePositions* = UGESGameplayStatics::PosFromEccAnomaly(FMath::DegreesToRadians(i * EAngle), InOrbit);
}
for (int32 i = 0; i < NumTorusPoints; i++)
{
const FVector PrevPosition = TorusSplinePositions[UGESGameplayStatics::GetRolloverArrayIndex(NumTorusPoints, i - 1)];
const FVector StartPosition = TorusSplinePositions*;
const FVector EndPosition = TorusSplinePositions[UGESGameplayStatics::GetRolloverArrayIndex(NumTorusPoints, i + 1)];
const FVector NextEndPosition = TorusSplinePositions[UGESGameplayStatics::GetRolloverArrayIndex(NumTorusPoints, i + 2)];
const FVector EndTangent = FVector(StartPosition - NextEndPosition).GetSafeNormal();
const FVector StartTangent = FVector(PrevPosition - EndPosition).GetSafeNormal();
TorusSplinePoints*->SetStartPosition(StartPosition);
TorusSplinePoints*->SetEndPosition(EndPosition);
TorusSplinePoints*->SetSplineUpDir(OrbitPlane_Up);
TorusSplinePoints*->SetStartTangent(StartTangent);
TorusSplinePoints*->SetEndTangent(EndTangent);
TorusSplinePoints*->SetWorldScale3D(FVector(Radius));
DrawDebugString(GetWorld(), StartPosition, FString::Printf(TEXT("%i"), i), NULL, FColor::Green, 5.f, true);
}
}
Honestly, this is driving me insane now.