public Quaternion Direction(Vector3d d, AttitudeReference referer)
{
double ang_diff = Math.Abs(Vector3d.Angle(attitudeGetReferenceRotation(referer) * Target * Vector3d.forward, attitudeGetReferenceRotation(referer) * d));
Vector3 up, dir = d;
if ((ang_diff > 45))
{
up = attitudeWorldToReference(-vessel.ReferenceTransform.forward, referer);
}
else
{
up = attitudeWorldToReference(attitudeReferenceToWorld(Target * Vector3d.up, Reference), referer);
}
Vector3.OrthoNormalize(ref dir, ref up);
return Quaternion.LookRotation(dir, up);
}