定义这样的函数似乎很简单
/// <summary>
/// Build 3D transform matrix with image of unit vectors of axes, and the image of the origin
/// </summary>
/// <param name="xUnit">The image of x axis unit vector</param>
/// <param name="yUnit">The image of y axis unit vector</param>
/// <param name="zUnit">The image of z axis unit vector</param>
/// <param name="offset">The image of the origin</param>
/// <returns>The matrix</returns>
public static Matrix3D MatrixFromVectors(Vector3D xUnit, Vector3D yUnit, Vector3D zUnit, Vector3D offset)
{
var m = new Matrix3D(
xUnit.X, xUnit.Y, xUnit.Z, 0.0,
yUnit.X, yUnit.Y, yUnit.Z, 0.0,
zUnit.X, zUnit.Y, zUnit.Z, 0.0,
0, 0, 0, 1);
m.Translate(offset);
return m;
}
但是测试代码
...
var m = Geo.MatrixFromVectors(vx,vy,vz,new Vector3D(1,2,3));
var result = m.transform(new Vector3D(1,0,0)) //result: equal to vx
...
表明它根本不使用偏移量。如何使其运作?
Media3D命名空间中的结构区分了矢量和点。Vector3D
用于指定空间中与位置无关的值(例如Axis,Surface法线,加速度等),而Point3D
用于指定位置。
因为不支持向量携带位置,所以信息Matrix3D.Transform(Vector3D)
不会应用偏移量。它仅改变Vector的方向。
如果将aPoint3D
而不是a传递Vector3D
给Matrix3D.Transform(Point3D)
它,它将按预期工作:
...
var m = Geo.MatrixFromVectors(vx,vy,vz,new Vector3D(1,2,3));
var result = m.transform(new Point3D(0,0,0)) // result is 1,2,3
...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句