Alguém pode explicar o contorno duplo?

9

Eu tenho tentado entender a renderização de voxel e tenho observado o contorno duplo (DC).

Até agora eu entendo isso:

  1. Execute uma função de densidade para um conjunto de pontos da grade (função de ruído)
  2. Encontre quais arestas na cintura contêm alterações entre os pontos finais
  3. A partir dessas arestas, crie pontos de interseção (ou seja, vetores)

Agora é aqui que eu estou preso, o próximo seria gerar normais, mas como? Ao olhar para este tópico, esta imagem normalmente aparece.

                                                   Uma grade assinada com bordas marcadas pelos dados Hermite

Fazer pesquisas indica que os normais seriam gerados a partir de uma isossuperfície. É correto pensar que eu vou do barulho para a isosuperfície e para os normais? Se sim, como realizaria cada etapa?

No meu entender, o próximo passo seria o seguinte no artigo da DC ;

Para cada aresta que exibe uma mudança de sinal, gere um quadrilátero conectando os vértices minimizadores dos quatro cubos que contêm a aresta.

Esta citação é representada pela imagem acima?

Finalmente, o próximo passo seria executar o QEF com os pontos de interseção e as normais e isso geraria meus dados de vértice. Isso está correto?

Ensaboado
fonte
Como eu entendo esse processo, é algo como ... ruído> nuvem de pontos> superfície iso> normais ... mas não sou inteligente o suficiente para afirmar que posso explicar esse processo adequadamente, para não tentar uma resposta.
War

Respostas:

3

As normais seriam geradas com base no gradiente da função de densidade ao mesmo tempo em que você obtém os pontos de interseção entre as arestas e a superfície. Se for algo simples e fechado como uma esfera, você poderá calcular os normais analiticamente, mas com o ruído, será necessário coletar amostras.

Você tem os próximos passos na ordem errada. Primeiro, você gera um vértice para cada célula que exibe uma alteração de sinal. O QEF que você está minimizando é simplesmente a distância total para cada um dos planos definidos pelo ponto de interseção / pares normais para essa célula. Em seguida, você percorre as arestas que exibem alterações de sinal e cria um quad usando os quatro vértices adjacentes (que são garantidos como gerados na última etapa).

Agora, meu maior obstáculo na implementação disso foi resolver o QEF. Na verdade, eu vim com uma solução iterativa simples que funcionará bem (por exemplo) em uma GPU em paralelo. Basicamente, você inicia o vértice no centro da célula. Em seguida, você calcula a média de todos os vetores retirados do vértice para cada plano e move o vértice ao longo do resultante e repita essa etapa um número fixo de vezes. Eu achei que movê-lo ~ 70% ao longo do resultante estabilizaria na menor quantidade de iterações.

jmegaffin
fonte
Então, digamos que eu tenho uma célula / voxel que eu sei que exibe uma mudança de sinal (ou seja, um caso como MC), eu executei uma função de ruído para cada 8 cantos da célula para encontrar sua densidade. O que eu estou tendo dificuldade para entender a partir deste como faço para encontrar as variáveis x , n e p da a QEF?
Sabonete
x é a posição do vértice. Para cada ponto de interseção, você tem p (a posição) en (normal), que compõem os planos sobre os quais eu estava falando.
precisa saber é o seguinte
p é encontrado descobrindo onde a média ponderada das duas densidades ao longo da borda é zero. Então você calcula n tomando o gradiente da sua função de densidade em p .
precisa saber é o seguinte
Então, basicamente, para cada cubo, calculo p e n para cada 12 arestas e, em seguida, corro o QEF de cada célula p e n em x , que no seu exemplo está no centro de um voxel / célula para começar? Então, se quatro células compartilham a mesma aresta, eu crio um quad conectando cada quatro células x ? E o quad resultante é meus dados poligonais?
Sabonete
Nem todas as arestas terão uma interseção; portanto, você não está necessariamente resolvendo o QEF para 12 aviões. Fora isso, você conseguiu!
precisa saber é o seguinte
1

Desde a leitura do artigo até a página 2, parece que os pesos do volume estão armazenados nos cantos da grade, em vez de serem o peso do próprio cubo, como preferem os algoritmos normais do estilo Marching Cubes. Esses pesos de canto definem um ponto ao longo da borda entre 2 cantos, onde há uma mudança de sinal de canto para canto. As arestas com alterações de sinal também armazenam um normal para a aresta, que é a linha angular na sua representação 2D no OP. Essas informações normais são definidas durante a criação do volume (por qualquer ferramenta de edição ou método de criação de volumes procedurais sendo usado), não após a geração da isossuperfície, como seria esperado por um algoritmo no estilo Marching Cubes. Esses dados normais "afirmam" que a linha / superfície que passa pelo ponto deve ter o valor normal predefinido. Nos casos em que os Marching Cubes dobram a linha nesse ponto para coincidir com outro ponto em uma aresta adjacente, os Extended Marching Cubes e Dual Contouring estendem a linha / superfície até que ela cruze com a linha / superfície que passa pelo ponto no borda adjacente que tem um valor normal diferente. Isso permite criar cantos nítidos a partir dos dados do volume, onde os algoritmos básicos do Marching Cubes arredondariam a superfície um pouco. Não estou entendendo muito bem como os QEFs (funções de erro quadrático) se encaixam nisso, exceto que parece que eles facilitam a computação do ponto estendido dentro de um cubo onde um canto será localizado. Cubos de marcha estendidos e Contorno duplo estendem a linha / superfície até que ela cruze com a linha / superfície passando pelo ponto na aresta adjacente que possui um valor normal diferente. Isso permite criar cantos nítidos a partir dos dados do volume, onde os algoritmos básicos do Marching Cubes arredondariam a superfície um pouco. Não estou entendendo muito bem como os QEFs (funções de erro quadrático) se encaixam nisso, exceto que parece que eles facilitam a computação do ponto estendido dentro de um cubo onde um canto será localizado. Cubos de marcha estendidos e Contorno duplo estendem a linha / superfície até que ela cruze com a linha / superfície passando pelo ponto na aresta adjacente que possui um valor normal diferente. Isso permite criar cantos nítidos a partir dos dados do volume, onde os algoritmos básicos do Marching Cubes arredondariam a superfície um pouco. Não estou entendendo muito bem como os QEFs (funções de erro quadrático) se encaixam nisso, exceto que parece que eles facilitam a computação do ponto estendido dentro de um cubo onde um canto será localizado.

Observe que eu tenho falado sobre linhas e arestas aqui no sentido 2D, como representado pela representação no OP. Eu precisaria ler e pensar um pouco mais para estender isso ao 3D para geração volumétrica de malha.

Para abordar a segunda metade da sua pergunta sobre como gerar os normais, e pensando do ponto de vista processual orientado a ruídos, parece que você deve preencher seu volume com dados de ruídos, procurar arestas com alterações de sinal e examinar os 4 cubos que compartilham a aresta para descobrir onde os triângulos serão gerados e calculam o vértice normal como faria para qualquer outra interseção de vários triângulos, calculando a média dos normais de cada triângulo que compartilha o vértice. Isso é muito especulativo da minha parte, pois o artigo lida principalmente com operações e volumes CSG gerados a partir de malhas convertidas em varredura, ambas com normais bem definidos nas superfícies.

Espero que pelo menos a 1ª parte desta resposta resolva as diferenças de como os dados de peso são representados e usados ​​de uma maneira bem diferente dos Cubos de Marcha básicos, e por que os dados normais precisam ser criados bastante cedo no processo de geração de volume, onde, com cubos de marcha básicos, os normais são normalmente criados como um último estágio no processo de geração de malha.

Ascendion
fonte