Я использую алгоритм Marching Cubes . Допустим, у меня есть 3D-изображение, похожее на этот рисунок картинка . Когда я использую алгоритм MC, я получаю что-то вроде этого: эффект
Везде, где угол составляет ~ 90 градусов. Алгоритм MC также приближает эти элементы (это следует из интерполяционной функции, но меня особенно интересует отключение приближение везде, где угол ~ 90 градусов).
Таким образом, вместо , что , я хочу что-то вроде это (но только там, где угол ~ 90, везде, где я ожидаю, нормальное приближение (классика из алгоритма MC).
Текущая интерполирующая функция
Я использовал Функция расстояния со знаком (SDF).
Vector3 interpolate(Vector3 v1, Vector3 v2, float sdf1, float sdf2)
{
float offset;
float d = sdf2-sdf1;
if(fabs(delta) < 1e-5)
{
offset = 0.5;
}else
{
offset = (1e-5 - sdf1)/delta
}
return Vector3(v1+offset*(v2-v1));
}
Возможное решение
Одним из решений является установка меньшего размера для кубов (вокселей). Но я не могу сделать это из-за производительности. Поэтому я думаю, что ключ - это интерполирующая функция.