2009-04-23 16 views
6

Od mojego ostatniego pytania: Marching Cube Question
Implementacja algorytmu marszowego?

Jestem jednak nadal niejasne jak w:

  1. jak stworzyć wyimaginowany modułu/Voxel, by sprawdzić, czy wierzchołek znajduje się poniżej isosurface?
  2. Skąd wiadomo, który wierzchołek znajduje się poniżej powierzchni terenu?
  3. W jaki sposób każda kostka/woksel określa, która kostka/powierzchnia ma być używana?
  4. jak rysować powierzchnię za pomocą danych w triTable?

Załóżmy, że mam dane chmury punktów jabłka.
Jak postępować?

Czy ktoś, kto zna Kostkę Marchingową, może mi pomóc?
znam tylko C++ i opengl. (C jest trochę poza moją ręką)

Odpowiedz

1

1) To zależy od wdrożenia yoru. Musisz mieć strukturę danych, w której możesz sprawdzić wartości w każdym rogu (wierzchołku) woksela lub kostki. Może to być obraz 3D (tj. Tekstura 3D w OpenGL) lub może to być niestandardowa struktura danych macierzy lub dowolny inny format, jaki sobie życzysz.

2) Musisz sprawdzić wierzchołki sześcianu. Są na tym różne optymalizacje, ale ogólnie zacznij od pierwszego rogu i po prostu sprawdź wartości wszystkich 8 rogów sześcianu.

3) Większość (szybkich) algorytmów tworzy maskę bitową, która będzie używana jako tablica przeglądowa w statycznej tablicy opcji. Jest tylko tyle możliwych opcji.

4) Po utworzeniu trójkątów z tabeli trójwymiarowej można użyć OpenGL, aby je renderować.

Załóżmy, że mam dane chmury punktów jabłka. jak mogę kontynuować?

To nie zadziała z maszerującymi kostkami. Kostki marszowe wymagają danych wokseli, więc musisz użyć jakiegoś algorytmu, aby umieścić chmurę punktów w sześciennej objętości. Opcja Gaussa Splatting jest tutaj opcją.

Normalnie, jeśli pracujesz z chmurą punktów i chcesz zobaczyć powierzchnię, powinieneś spojrzeć na algorytmy rekonstrukcji powierzchni zamiast maszerujących kostek.

Jeśli chcesz dowiedzieć się więcej, zdecydowanie polecam lekturę książek na temat technik wizualizacji. Dobry jest od ludzi Kitware - The Visualization Toolkit.

Być może zechcesz rzucić okiem na VTK. Ma implementację C++ Marching Cubes i jest w pełni otwarta.

+0

Czy 6 glQuads równa wokselu? jeśli tak, w jaki sposób relacja voxel jest reletatywna? czy mój punkt jest środkiem sześcianu? – noob88

+0

@ noob88: Nie, niezupełnie. Twój "sześcian" musiałby być jakimś obiektem składającym się z 8 pionów. 6 glQuads może być twarzami kostki/woksela, a wierzchołki, których używasz, mogą być twoimi 8 punktami. Zrobiłbym jednak inną strukturę danych, żeby to zatrzymać. Działa coś tak prostego jak wielowymiarowa tablica. –

+0

Widzę .. Myślę, że potrzebuję czasu, aby go przetestować 1. Mogę mieć twój kontakt? Czy mam dalsze problemy, mam nadzieję, że mogę uzyskać pomoc .. – noob88

2

Po pierwsze, powierzchnia isosurface może być reprezentowana na dwa sposoby. Jednym ze sposobów jest posiadanie skalarnych wartości isovalue i per-point jako zbioru danych z zewnętrznego źródła. Tak działają skany MRI. Drugim podejściem jest utworzenie niejawnej funkcji F(), która przyjmuje punkt/wierzchołek jako jej parametr i zwraca nowy skalar.Rozważmy tę funkcję:

float computeScalar(const Vector3<float>& v) 
{ 
    return std::sqrt(v.x*v.x + v.y*v.y + v.z*v.z); 
} 

Która będzie obliczać odległość od punktu i do punktu początkowego dla każdego punktu w polu skalarnym. Jeśli wartość isovalue jest promieniem, po prostu wymyśliłeś sposób reprezentowania kuli. Dzieje się tak, ponieważ | v | < = R jest prawdziwe dla wszystkich punktów wewnątrz kuli lub w jej wnętrzu. Po prostu sprawdź, które wierzchołki znajdują się wewnątrz kuli, a które są na zewnątrz. Użytkownik chce użyć operatorów mniej lub więcej niż operatorzy, ponieważ wolumin dzieli przestrzeń na dwie części. Kiedy wiesz, które punkty w twoim sześcianie są sklasyfikowane jako wewnętrzne i zewnętrzne, wiesz również, które krawędzie przecinają powierzchnię. Możesz skończyć ze wszystkim, od trójkątów do pięciu trójkątów. Położenie wierzchołków siatki można obliczyć, interpolując przecinające się krawędzie, aby znaleźć rzeczywisty punkt przecięcia.


Jeśli chcesz reprezentować powiedzmy jabłko z pól skalarnych, to albo trzeba uzyskać dane źródłowe zestaw do podłączenia do aplikacji, lub użyć dość złożoną funkcję niejawny. Polecam pobieranie prostych geometrycznych prymitywów, takich jak kule i tori, aby najpierw działały, a następnie rozwijam się.

Powiązane problemy