- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
即使 System.Numerics.Vectors
可通过 NuGet 获得的库有自己的 View 和投影矩阵函数,我想自己实现它,只使用向量和矩阵结构。
不幸的是,当我将目标向量与(正确的) View 矩阵相乘时,我已经得到了一个完全错误的结果。我使用的是右手坐标系和以下说明
var cameraVector4 = new Vector4(0, 4, 2, 1);
var focusVector4 = new Vector4(0, 0, 0, 1);
var vMatrix4 = LookAt(cameraVector4, focusVector4, new Vector4(0, 1.0f, 0, 0));
var targetVector4 = new Vector4(1, 0, -1, 1);
var targetViewVector4 = Vector4.Transform(targetVector4, vMatrix4);
具有以下功能
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);
}
}
在我上面的示例中,预期的 View 矩阵是
和vMatrix4
确实具有相同的值(value)。乘法 vMatrix4
至 targetVector4
然而应该产生<1, 0.894427, -4.91935, 1>
但 Visual Studio 报告 <1, -0.8944272, -0.4472136, 5.472136>
.
我的问题是,库是否在计算结果时遇到数值问题,我是否遇到数据类型不匹配或者我是否使用了 Vector4.Transform
错误地期望它返回 ViewMatrix * TargetVector
.
当使用下面的自定义扩展方法时
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
似乎在做一些真正出乎意料的事情。
最佳答案
我使用 dotPeek 反编译了 System.Numerics
库并偶然发现了这个:
public static Vector4 Transform(Vector4 vector, Matrix4x4 matrix) {
return
new Vector4(
(float)
(vector.X * (double) matrix.M11 +
vector.Y * (double) matrix.M21 +
vector.Z * (double) matrix.M31 +
vector.W * (double) matrix.M41),
(float)
(vector.X * (double) matrix.M12 +
vector.Y * (double) matrix.M22 +
vector.Z * (double) matrix.M32 +
vector.W * (double) matrix.M42),
(float)
(vector.X * (double) matrix.M13 +
vector.Y * (double) matrix.M23 +
vector.Z * (double) matrix.M33 +
vector.W * (double) matrix.M43),
(float)
(vector.X * (double) matrix.M14 +
vector.Y * (double) matrix.M24 +
vector.Z * (double) matrix.M34 +
vector.W * (double) matrix.M44));
}
此方法意味着库将向量解释为行向量并从右侧乘以矩阵,而不是将矩阵乘以列向量左侧的“通常”方式。要解决此问题,您有两种选择:
关于c# - System.Numerics 的矩阵乘法值完全错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41933843/
我以默认数字 js 格式存储数字和货币格式。我允许用户根据他们的区域设置拥有自己的格式。我正在尝试弄清楚如何将他们的自定义格式转换回默认格式,以便一致地存储它,以防他们更改语言环境。 例如设置电流:
我以默认数字 js 格式存储数字和货币格式。我允许用户根据他们的区域设置拥有自己的格式。我正在尝试弄清楚如何将他们的自定义格式转换回默认格式,以便一致地存储它,以防他们更改语言环境。 例如设置电流:
我正在为 as.POSIXct.numeric 苦苦挣扎。以下代码有效: dates <- structure(c(1649285787, 1651134684), class = c("POSIXc
我正在使用 Azavea Numeric Scala 库进行通用数学运算。但是,我无法将它们与 Scala Collections API 一起使用,因为它们需要 scala Numeric,并且
我在仔细阅读文档时注意到,Numeric 类有一个方法 arg,其解释为“如果值为正,则返回 0,否则返回 pi。直接在这个上面的docs 是一个名为 angle 的方法,其解释相同。 我不明白这个方
我试图总结两列并获得错误:二进制运算符的非数字参数。但是,这两列都是数字。因此,我不明白为什么会收到此错误消息。谢谢你的帮助? data_all% mutate(total='5min'+'10min
我正在尝试创建六个站点上物种丰富度的热图。 我有一个站点与物种的矩阵,其中有数字丰度数据。 但是,当我运行代码时,R返回一个错误,指出我的矩阵是非数字的。 谁能想到这个?我感到难过。 导出的数据框链接
我正在使用一个返回 float 的java函数 private float getEventScaledX(float eventX, float resX) { return (eventX
我有一个函数接收 SearchCriteria 的集合对象:列名或键、运算符( = ### && :letter_date <= ### 我在两个日期之间查找。我不能两次使用相同的参数名称,因此我在遍
我正在尝试将值插入到表中,但我不断收到错误消息 ORA-01858: a non-numeric character was found where a numeric was expected 这是
sort 提供两种数字排序。这是来自手册页: -g, --general-numeric-sort compare according to general numerica
我遇到了一个奇怪的问题,将日期列与 SYSDATE 进行比较会产生以下错误: 01858. 00000 - "a non-numeric character was found where a nu
这是表格 CREATE TABLE Employee (EmpID number(5) primary key, SIN Number(9) Not null, Las
在 bash 中按 alt + numeric 会得到 (arg [numeric]) 那是什么? (这类问题更适合问人,而不是试图“猜测”正确的术语以通过互联网搜索文档)。 最佳答案 您要搜索的字词
当我执行准备好的语句时,我得到了 ORA-01858:在需要数字的地方发现了一个非数字字符。当我搜索一些论坛时,他们说这是因为日期数据类型。我准备好的声明是 insert into OPRS_ZON
我正在使用 Elasticsearch Java API 创建索引并编写搜索查询。 索引是在各种字段上创建的。字段之一是创建索引的数字(整数)。 现在我们得到的输入是字符串的形式。我们必须在所有字段中
我想重新映射启用 Numlock 的数字小键盘,使其表现得像关闭 Numlock 的数字小键盘,包括能够在按住 Shift/Ctrl 的情况下扩展选择范围。 我遇到的问题如下 Numpad8::Up
所以我有一个训练集,其中一个属性的域如下: A = {Type1, Type2, Type3, ... ,Type5} 如果域保持这种形式,我就无法应用线性回归,因为数学假设不可能成立,例如: H =
为什么我会通过 Java 应用程序执行此查询从 Oracle 收到上述 SQL 错误? SELECT * FROM TestSchema.TestTable WHERE userid = :userI
我在 JSP 中添加了以下代码,并在将实体保存到数据库时出现一些异常。 $('.validateWeight').click(function(event) { var id = event.tar
我是一名优秀的程序员,十分优秀!