给定两个基矢量,计算矩阵。这不是问题,但我最终做了很多事情。
此类代码的示例:
var uvec = (currentPos - origin);
if (uvec.LengthSquared() <= float.Epsilon)
uvec = Vector3.Up;
else
uvec.Normalize();
var fvec = Forward; // Fixed value
var rvec = Vector3.Cross(fvec, uvec);
if (rvec.LengthSquared() <= float.Epsilon)
rvec = Vector3.Right;
else
rvec.Normalize();
fvec = Vector3.Cross(uvec, rvec);
fvec.Normalize();
var mat = Matrix.Identity;
mat.Forward = fvec;
mat.Right = rvec;
mat.Up = uvec;
mat.Translation = currentPos;
我想要的是一种类似......的方法。
public static class MatrixEx
{
public static Matrix CreateFromVectors(...);
}
但是有各种不同的情况......
所以问题是,如何在不诉诸巨型嵌套if / else的情况下实现这样的方法来处理这些情况?
或者,如果不是这样的方法,那么“干净又高效”的api会是什么?例如,从客户的角度来看,这个api很难使用,不是因为这个设计违反了抽象代码设计原则'foo'。