14
Marching Cubes Josué Machado Erasmo Artur Computação Gráfica II

Marching Cubes

Embed Size (px)

Citation preview

Page 1: Marching Cubes

Marching Cubes

Josué Machado

Erasmo Artur

Computação Gráfica II

Page 2: Marching Cubes

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

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

• Conclusão

Page 3: Marching Cubes

• 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.

Page 4: Marching Cubes

• 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

Page 5: Marching Cubes

• 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

Page 6: Marching Cubes

• 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

Page 7: Marching Cubes

• 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

Page 8: Marching Cubes

• Interpolação

– Interpolação linear simples

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

Page 9: Marching Cubes

• 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

Page 10: Marching Cubes

• 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

Page 11: Marching Cubes

– 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

Page 12: Marching Cubes

• 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

Page 13: Marching Cubes

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

Page 14: Marching Cubes

• Renderização relativamente rápida

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