Как исправить ошибку с плавающей запятой в следующем физическом моделировании:
- Исходная точка (x, y, z),
- Желаемая точка (x ', y', z ') после приложения сил.
- Два треугольника (A, B, C) и (B, C, D), которые имеют общее ребро BC.
Я использую этот метод для обнаружения столкновений:
For each Triangle
If the original point is in front of the current triangle, and the desired point is behind the desired triangle:
Calculate the intersection point of the ray (original-desired) and the plane (triangle's normal).
If the intersection point is inside the triangle edges (!)
Respond to the collision.
End If
End If
Next Triangle
Проблема, с которой я сталкиваюсь, заключается в том, что иногда точка попадает в серую область математики с плавающей запятой, где она настолько близка к линии BC, что не может столкнуться ни с одним из треугольников, хотя технически она всегда должна сталкиваться с тем или другим, поскольку у них есть общее преимущество. Когда это происходит, точка проходит прямо между двумя треугольниками, разделяющими ребра. Я пометил одну строку кода знаком (!), потому что считаю, что именно здесь мне следует внести изменения.
Одна идея, которая работает в очень ограниченных ситуациях, - пропустить пограничное тестирование. Эффектно превращая треугольники в плоскости. Это работает, только когда мои сетки представляют собой выпуклые оболочки, но я планирую создавать выпуклые формы.
Я специально использую точечный продукт и нормали треугольников для всех моих тестов спереди и сзади.