marching cubes
TRANSCRIPT
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