Marching Cubes

Preview:

Citation preview

Marching Cubes

Josué Machado

Erasmo Artur

Computação Gráfica II

• Introdução • Motivação • Metodologia

– Dados – Grade de dados – Classificação dos cubos – Interpolação – Definindo triângulos – Imprimindo

• Conclusão

• Desenvolvido por Lorensen e Cline in 1987

• Aproxima uma isosuperfície pela subdivisão de uma região do espaço numa grade tridimensional de voxels

• O usuário define um limiar que determina a isosuperfície

• Cada vértice dos voxels possui um peso

• Cada vértice é classificado como maior ou menor que o limiar

• Voxels que possuem vértices classificados como maiores e menores faz parte da isosuperfície

• Geralmente renderiza uma superfície por vez.

• Permitir que um ou mais fenômenos ou estruturas de interesse em um conjunto de dados a ser isolado e renderizado

• Rápida renderização, podendo ocorrer em hardware genéricos

• Dados: – Formatos suportados: “vol” e “raw”

– Geralmente no formato binário

– Valores armazenados como “unsigned char”

– Faixa de valores entre [0, 255]

– Armazenados em ordem x, y, z

– Provenientes de: http://www.gris.uni-tuebingen.de/edu/areas/scivis/volren/datasets/datasets.html e http://idav.ucdavis.edu/~okreylos/PhDStudies/Spring2000/ECS277/DataSets.html

• Grade de dados

– Organiza os dados de forma a gerar voxels virtuais

– Resolução de acordo com o arquivo de dados, geralmente 256x256x256

– Cada valor representa o vértice de um(alguns) voxel(s)

– Consome considerável quantidade de memória

• Classificação dos voxels

– Baseado na implementação de Paul Bourke

– Verifica quais vértices do voxel é maior ou igual ao limiar

– Utiliza um inteiro “cubeIndex” para armazenar o “estado” do voxel

– Para cada vértice n que satisfaz realiza a operação: • cubeIndex |= (1 << n)

0000 0001 1001

• Interpolação

– Interpolação linear simples

• p = p1 + (p2 - p1)/(p2.w - p1.w)*(value - p1.w)

• Triangulação

– Determinado a partir de tabela pré-definida

– Originalmente 256 casos

– Removendo-se casos de simetria de rotação e reflexão os casos se resumem a 14

• Triangulação

– A operação & (bitwise and) é realizada entre o valor obtido pela tabela edgeTable (pelo cubeIndex) e os valores [1, 2, 4, 8,..., 2048]

– Se o resultado for 1 a aresta deve ser interpolada

• Ex: if(edgeTable[cubeIndex] & 32)

intvtx[5] = interpolation(vtx[5], vtx[6], isovalue);

– Por fim é utilizado a tabela triTable para definir os pontos(interpolados) de cada triângulo

– Exemplo:

cubeIndex = 1001 edgeTable[cubeIndex] = 100100000101

triTable[cubeIndex][0] = 0 triTable[cubeIndex][1] = 11 triTable[cubeIndex][2] = 2 triTable[cubeIndex][3] = 8 triTable[cubeIndex][4] = 11 triTable[cubeIndex][5] = 0 triTable[cubeIndex][6] = -1

• Imprimindo

– O resultado do algoritmo é uma conjunto de triângulos

– Estes podem ser renderizados por métodos tradicionais

– Utilizado OpenGL®

– Normais calculadas a partir de produto vetorial

Name: Skull.vol FileSize: 4.553 KB Resolution: 68x256x256

• Renderização relativamente rápida

• Consumo de memória alto, deve-se ter cuidado no tratamento da mesma

Recommended