Я сталкиваюсь со следующей проблемой. В моем коде я имею дело со значением -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. # IND000000000000. Поэтому я пошел назад. Мы можем просто принять во внимание float baseGeom и первое произведение внутренней точки: точка (baseDir, n1).
Согласно отладке, мой baseDir vec3 имеет значения:
baseDir.x = -0.98280960321426392
baseDir.y = -0.18137875199317932
baseDir.z = 0.034456323832273483
в то время как vec3 n1 имеет значения:
n1.x = 0.024055255576968193
n1.y = 0.059235699474811554
n1.z = 0.99795418977737427
вручную делая точечное произведение:
n1.x *= baseDir.x;
n1.y *= baseDir.y;
n1.z *= baseDir.z;
double result = n1.x + n1.y + n1.z;
У меня есть этот результат = -7.0025885090529982e-010. Тем не менее, glm :: точка возвращает меня в результате 0,00000000000000000. Как вы думаете, это ошибка?
Задача ещё не решена.
Других решений пока нет …