即使System.Numerics.Vectors
库通过的NuGet是获得对视图和投影矩阵我想要实现它自己,只是使用向量和矩阵结构自身的功能。与System.Numerics
不幸的是与(正确)视图矩阵相乘,我的目标矢量的情况下,我已经接到了完全错误的结果。我用右手坐标系和下列说明
具有以下功能
private static Matrix4x4 LookAt(Vector4 cameraVector4, Vector4 focusVector4, Vector4 upVector4) {
if (cameraVector4 == focusVector4) return Matrix4x4.Identity;
var z = Vector4.Normalize(cameraVector4 - focusVector4);
var x = Vector4.Normalize(upVector4.Cross(z));
var y = Vector4.Normalize(z.Cross(x));
return new Matrix4x4(
x.X, x.Y, x.Z, -Vector4.Dot(x, cameraVector4),
y.X, y.Y, y.Z, -Vector4.Dot(y, cameraVector4),
z.X, z.Y, z.Z, -Vector4.Dot(z, cameraVector4),
0, 0, 0, 1);
}
public static class Vector4Extensions {
public static Vector4 Cross(this Vector4 self, Vector4 vector4) {
return new Vector4(
self.Y * vector4.Z - self.Z * vector4.Y,
self.Z * vector4.X - self.X * vector4.Z,
self.X * vector4.Y - self.Y * vector4.X,
0);
}
}
在我的示例预期视图矩阵以上是
和vMatrix4
确实具有相同的价值。乘法vMatrix4
到targetVector4
但是应该产生<1, 0.894427, -4.91935, 1>
但Visual Studio报表<1, -0.8944272, -0.4472136, 5.472136>
。
我的问题是,该库是否具有计算结果数值的问题,我是否有数据类型不匹配,还是我使用不当Vector4.Transform
期待它返回ViewMatrix * TargetVector
。
EDIT
当使用下面的自定义扩展方法
public static Vector4 ApplyMatrix(this Vector4 self, Matrix4x4 matrix) {
return new Vector4(
matrix.M11 * self.X + matrix.M12 * self.Y + matrix.M13 * self.Z + matrix.M14 * self.W,
matrix.M21 * self.X + matrix.M22 * self.Y + matrix.M23 * self.Z + matrix.M24 * self.W,
matrix.M31 * self.X + matrix.M32 * self.Y + matrix.M33 * self.Z + matrix.M34 * self.W,
matrix.M41 * self.X + matrix.M42 * self.Y + matrix.M43 * self.Z + matrix.M44 * self.W
);
}
呼叫targetVector4.ApplyMatrix(targetVector4)
产生正确的结果。这意味着内部Vector4.Transform
似乎在做一些非常意想不到的事情。
[Vector4.cs](https://github.com/dotnet/corefx/blob/master/src/System.Numerics.Vectors/src/System/Numerics/Vector4.cs),第315-329行。不需要反编译器,这个东西是开源的。 –
@JeroenMostert哦谢谢你提供的链接。我只是偶然发现了没有在GitHub上实现的签名文件。 –