C++ glm::点积返回意外值

C++ glm::点积返回意外值,c++,glm-math,dot-product,C++,Glm Math,Dot Product,我面临以下问题。在我的代码中,我处理的是-1.#IND000000000000值。进行调试时,该值似乎由0/0除法返回。为了解决这个问题,我试图找出为什么会有这些意外的0值。事实证明,glm::dot产品并没有按预期工作。我有以下代码: double jacobian = 1.0; double baseGeom = fabs(dot(baseDir, n1)) * fabs(dot(baseDir, baseN0)) / baseDist2; double shiftGeom = fabs(d

我面临以下问题。在我的代码中,我处理的是-1.#IND000000000000值。进行调试时,该值似乎由0/0除法返回。为了解决这个问题,我试图找出为什么会有这些意外的0值。事实证明,glm::dot产品并没有按预期工作。我有以下代码:

double jacobian = 1.0;
double baseGeom = fabs(dot(baseDir, n1)) * fabs(dot(baseDir, baseN0)) / baseDist2;
double shiftGeom = fabs(dot(shiftDir, n1)) * fabs(dot(shiftDir, tri->N)) / shiftDist2;
jacobian *= (shiftGeom / baseGeom);
在我的例子中,shiftGeom和baseGeom都是两个等于0.0的浮点数,这应该是非法除法。实际上,我得到的雅可比矩阵等于-1。因此,我倒退了。我们可以只考虑baseGeom浮点和第一个内部点积:dot(baseDir,n1)

根据调试,my baseDir vec3的值为:

baseDir.x = -0.98280960321426392
baseDir.y = -0.18137875199317932
baseDir.z = 0.034456323832273483
n1.x = 0.024055255576968193
n1.y = 0.059235699474811554
n1.z = 0.99795418977737427
而vec3 n1具有以下值:

baseDir.x = -0.98280960321426392
baseDir.y = -0.18137875199317932
baseDir.z = 0.034456323832273483
n1.x = 0.024055255576968193
n1.y = 0.059235699474811554
n1.z = 0.99795418977737427
通过手动执行dot产品:

n1.x *= baseDir.x;
n1.y *= baseDir.y;
n1.z *= baseDir.z;
double result = n1.x + n1.y + n1.z;

我有这个结果=-7.002585090529982E-010。但是,glm::dot返回的结果是0.00000000000000000。您认为错误是什么?

这是一个浮点精度问题;如果您更改为
glm::dvec3
,您将获得双精度数学和所需结果您是否确保baseDir和n1向量使用双精度类型进行存储?如果非要我猜的话,我会说你的值被转换成了float,你失去了精度。我对雅可比不太熟悉,但你们能简单地缩放你们的矢量,这样你们就有了更大的数字和更高的精度吗?你们都是对的。。vec3似乎使用了浮点值,并将其转换为glm::dvec3,正如@m.s.所建议的那样,解决了这个问题。。那么,这是否意味着glm::dot给出的结果也是一个浮点(因为我在使用浮点值的vec3向量之间做点积),因此整数不能包含在浮点中,但我需要一个双精度?如果向量成直角,点积可能产生零。因此,您需要能够接受零。