Я реализую алгоритм марширующих кубов обычно на основе реализации Paul Bourke с некоторыми основными корректировками:Маршевых Кубики Terrassing/Ридж Эффект
(значения с плавающей точкой)- предвычисления из scalarfield
- избежать дублирующих вершин окончательный список с помощью зОго :: карты
- вершины хранения визуализировать конечные сетки в Ogre3D
в принципе я изменил почти 80% его кода. У моей получившейся сетки есть некоторые уродливые страхи, и я не уверен, как их избежать. Я предположил, что использование плавающих точек для скалярного поля будет выполнять эту работу. Это общий эффект? Как вы можете избежать этого?
вычисления позиции вершин по краям. (Cell.val [p1] содержит скалярное значение для данной вершины):
//if there is an intersection on this edge
if (cell.iEdgeFlags & (1 << iEdge))
{
const int* edge = a2iEdgeConnection[iEdge];
int p1 = edge[0];
int p2 = edge[1];
//find the approx intersection point by linear interpolation between the two edges and the density value
float length = cell.val[p1]/(cell.val[p2] + cell.val[p1]);
asEdgeVertex[iEdge] = cell.p[p1] + length * (cell.p[p2] - cell.p[p1]);
}
Вы можете найти полный исходный код здесь: https://github.com/DieOptimistin/MarchingCubes я использую Ogre3D в качестве библиотеки для этого примера.
Это, безусловно, может быть сделано, чтобы быть гладкими, но вы можете сузить это до нескольких строк коды, которые дают вам расположение пикселей, вы не согласны, а скриншот? Это очень сложно помочь вам отладить скриншот ... –
Я отредактировал этот вопрос. Поскольку можно сделать его гладким без какого-либо дополнительного алгоритма сглаживания, я предполагаю, что у меня есть ошибка при вычислении положения вершины. – Anthea
У вас есть исходное сравнение в контексте для рендеринга той же сцены для сравнения? Если да, отправьте снимок экрана. Я бы предположил, что некоторые кэшированные позиции вершин ошибочно выбраны или интерполяция вдоль ребер куба основана на неправильных значениях. – Codor