Это окончательный код для определения банка. Обратите внимание, что мне нужно было определить знак угла:
// project Y on plan perpendicular to look
Vector3D Yproj = new Vector3D(
-(lookDirection.Y * lookDirection.X),
1 - (lookDirection.Y * lookDirection.Y),
-(lookDirection.Y * lookDirection.Z));
Yproj.Normalize();
// get absolute angle between Y projected and Up
double absAngle = Vector3D.AngleBetween(upDirection, Yproj);
// magic formula
Vector3D cross = Vector3D.CrossProduct(upDirection, Yproj);
double dot = Vector3D.DotProduct(lookDirection, cross);
// set actual signed angle
BDeg = (dot >= 0) ? absAngle : -absAngle;