• Aucun résultat trouvé

EXAMPLE OF k-MEANS CLUSTERING AT WORK

Dans le document An Introduction to Data Mining (Page 172-177)

No contexto da aplicação à simulação de tecidos virtuais, o que mais interessa num esquema de subdivisão adaptativa é a capacidade de se refinar a malha e poder voltar-se a simplificá-la, sem introduzir descontinuidades nas equações que regem a simulação. Parece óbvia a inevitabilidade da simplificação produzir essas descontinuidades geométricas, que se transmitirão directamente à avaliação do modelo do tecido. No entanto, mesmo o processo de refinamento pode gerar tais problemas, como se verá de seguida.

Talvez o método de subdivisão mais comum, quando lidamos com malhas de triângulos, seja o método de subdivisão de 1-para-4 de Loop [Loop87]. Cada aresta é

v w n e s ew ee en es swsenwne

dividida em duas e os novos vértices são ligados entre si, produzindo um triângulo central e três outros junto dos vértices iniciais. Este método, quando aplicado de forma não uniforme, tem o problema de gerar cracks na malha, que poderá ser resolvido, como se ilustra na Figura 4(a), dividindo em dois os triângulos circundantes.

(a) Loop (b) √3

Figura 4 - Outros métodos de subdivisão Uma desvantagem evidente é a necessidade de distinguir entre os triângulos regulares e os irregulares (separados entre si, na Figura 4(a), pelas linhas a ponteado). Os triângulos regulares participam da hierarquia, podendo ser subdivididos mais tarde, o mesmo não acontecendo com os triângulos irregulares, que apenas existem para evitar o aparecimento de buracos na malha. Os triângulos irregulares, caso fossem subdivididos, fariam com que a malha degenerasse. Eles são, posteriormente, descartados, sendo substituídos por triângulos regulares quando a subdivisão for efectuada no triângulo (regular) que os contém.

No caso da subdivisão √3, para além de existirem igualmente dois tipos de triângulos – regulares e irregulares, a geometria também pode sofrer perturbações modificando, localmente, o plano da malha. Estas alterações ocorrem na etapa designada por edge swap, que visa a transformação de triângulos irregulares adjacentes em triângulos regulares, como se mostra na Figura 4(b).

No decorrer do nosso trabalho, descobrimos que a maior causa de instabilidade, introduzida pela utilização de um método de subdivisão adaptativa, resulta das perturbações instantâneas da malha que se traduzam em deslocamentos da geometria inicial em direcções normais ao plano do tecido. O fenómeno pode ser observado por um enrugamento (ou encarquilhar) artificial e instantâneo, como resultado da modificação da topologia da malha num determinado local.

Quando as alterações na malha produzem uma variação instantânea na orientação dos triângulos, o resultado é geralmente catastrófico. As forças estruturais que contrariam o alongamento do tecido sofrem, neste caso, uma mudança brusca, não apenas em módulo mas também, e essencialmente, na sua direcção. Ora estas mudanças não são acompanhadas pela evolução das

suas derivadas, usadas na integração numérica do sistema. Apenas referimos as forças de elasticidade porque são as de maior intensidade e as que causam a maior parte dos comportamentos caóticos nas simulações onde o processo de integração numérica entra em divergência.

Não podemos afirmar, taxativamente, que este fenómeno proíbe a utilização de esquemas de subdivisão onde a orientação dos triângulos pode variar bruscamente, no decorrer de uma operação elementar de refinamento ou subdivisão. Podemos, contudo, afirmar que, na ausência de medidas adicionais que resolvam ou atenuem o problema, as quais não vimos ainda referidas na literatura, tais esquemas de subdivisão se tornam impraticáveis na simulação de tecidos. Mesmo que se consiga evitar a divergência na integração numérica, as oscilações causadas na malha não serão facilmente disfarçadas.

Figure 5 - Subdivisão de dois triângulos por diferentes métodos

Uma das grandes vantagens da subdivisão hierárquica 4–8 é a sua simplicidade, facto que a torna uma das técnicas de subdivisão mais eficientes. Outras características importantes, enumeradas em [Velho00] são: o grande poder de expressividade, a profundidade logarítmica (logarithmic depth) e o crescimento linear. Na Figura 5 pode-se ver as diferenças entre as diversas técnicas de subdivisão. O exemplo refere-se à subdivisão de dois triângulos que partilham uma aresta. No caso da subdivisão de Loop, a situação apenas ocorre quando dois triângulos irregulares necessitam ser convertidos em 4 regulares. Como se pode observar, apenas a subdivisão 4–8 produz triângulos cujas orientações são consistentes com a situação de partida, pois os triângulos gerados estão situados no mesmo plano que os triângulos originais.

A subdivisão 4–8 permite ainda uma transição mais gradual e fina entre as sucessivas malhas, visto o número de partículas e triângulos gerados, em cada caso, ser inferior ao das outras duas técnicas. No caso da subdivisão √3, por cada passo de subdivisão uniforme é triplicado o número de faces e por cada triângulo da malha original é gerado um novo vértice. No caso da subdivisão de Loop, o factor de crescimento das faces é ainda maior, sendo criados 4 novos triângulos por cada

(a) configuração inicial

(c) subdivisão √3

(b) subdivisão 4–8

(d) Loop edge swap

triângulo inicial. Estes valores são, em ambos os casos, superiores aos da subdivisão 4–8, onde o número de faces é multiplicado por 2 e o número de vértices adicionais é de 1 por cada dois triângulos.

5. TÉCNICA PROPOSTA

Em primeiro lugar, convém referir alguns detalhes de implementação que se prendem com o modelo do tecido usado, assim como a técnica de integração que faz avançar a simulação.

O nosso trabalho tem como ponto de partida o modelo de tecidos proposto por Baraff e Witkin [Baraff98]. O passo de integração é o passo de Euler implícito, que necessita resolver um sistema de equações esparso. As estruturas de dados programadas foram optimizadas para operarem com matrizes esparsas e o produto de uma matriz esparsa por um vector tem complexidade linear no número de elementos da matriz.

O objectivo principal da utilização do refinamento e redução adaptativos é o de permitir introduzir detalhe onde ele é estritamente necessário, evitando assim gastar tempo de CPU na simulação de zonas do tecido onde uma aproximação poligonal menos rica seria suficiente. No caso da simulação de tecidos, os fenómenos que conferem maior realismo à simulação e que necessitam, simultaneamente, de maior detalhe são os que estão relacionados com a curvatura. As propriedades de elasticidade e de distorção, uma vez que são fenómenos que ocorrem no plano da malha, conseguem-se simular com recurso a malhas pouco discretizadas. Sendo assim, parece natural que o critério que orienta a subdivisão seja baseado na curvatura do tecido. Uma vez que se pretende um processo de subdivisão adaptativa eficiente, esse mesmo critério terá de ser avaliado localmente.

5.1. Critério de refinamento e redução

O estimador de erro por nós usado mede a distância da superfície poligonal da malha a uma superfície curva, idealizada, que aproxima, localmente, a curvatura do tecido virtual. Para cada par de triângulos, partilhando uma aresta, avalia-se a distância dos vértices opostos à aresta de junção e calcula-se a sua média, L. De seguida, o par de triângulos é aproximado por dois triângulos iguais cujos vértices opostos à aresta comum distam desta o mesmo valor L. A curvatura estimada é a de uma circunferência que passa nesses dois vértices e no ponto médio da aresta. A Figura 6 ilustra o que se acabou de referir. Recorrendo à trigonometria, o valor estimado do desvio da malha, em relação à superfície do tecido, é dado por

( )

(

)

( )

θ 2 2 2 θ 1 L d sin cos − =

onde θ é o ângulo formado pelas duas normais aos triângulos considerados.

A cada passo da simulação, as arestas partilhadas são analisadas e, sempre que o estimador ultrapasse um determinado limiar máximo, a subdivisão dessa aresta é accionada. O critério para a simplificação, como

operação inversa, é semelhante, mas seleccionando agora, para possível remoção, apenas as arestas para as quais o valor do estimador é inferior a um valor limiar mínimo. Na realidade, porém, a experiência mostrou que o processo não pode ser assim tão simples e veremos adiante as razões de tal facto, assim como a solução que preconizamos.

Figura 6 - Estimador da curvatura do tecido na junção de dois triângulos

Em [Volkov02] é usado o mesmo estimador do erro da aproximação poligonal à superfície do tecido, enquanto que em [Villard02] se preferiu estimar o erro nos vértices, analisando o maior dos desvios entre a normal no vértice – obtida ponderando as normais dos triângulos vizinhos – e as normais desses mesmos triângulos.

5.2. Algoritmo de subdivisão adaptativa

De um modo geral, os esquemas de subdivisão de malhas decompõem-se em dois tipos de regras:

ƒ Face rules – determinam a localização dos novos vértices.

ƒ Vertex rules – determinam as novas localizações dos vértices, já existentes, envolvidos na subdivisão. Na transposição dos esquemas de subdivisão para a simulação de tecidos, pensamos que apenas o primeiro tipo de regras deverá ser usado. Com efeito, a aplicação das vertex rules provocaria mudanças instantâneas nas posições das partículas e nas orientações dos triângulos, facto que pretendemos evitar a todo o custo. Para além do mais, a eficiência é uma preocupação constante na simulação de tecidos, pelo que, ao deixar cair o segundo tipo de regras, estamos a melhorar o desempenho global da técnica.

Figura 7 - Exemplos de subdivisão de uma aresta exterior a um bloco e de uma subdivisão não

uniforme

Na subdivisão adaptativa de malhas 4–8, sempre que uma aresta desencadeia um processo de subdivisão é

d

θ

necessário ter em conta se se trata de uma aresta interna ao bloco protótipo (Figura 2) ou se é uma aresta fronteira. No caso de se tratar de uma aresta exterior ao bloco, será necessário refinar, em primeiro lugar, cada um dos blocos adjacentes a essa aresta exterior. A situação encontra-se representada na Figura 7, assim como um exemplo da sudivisão adaptativa.

Existe ainda uma outra situação que é necessário precaver e que se manifesta quando a aresta que determina o refinamento une dois blocos de diferentes níveis de detalhe. Contudo, o nível de detalhe apenas poderá diferir de uma unidade, pelo que bastará subdividir recursivamente o bloco de nível inferior antes de se prosseguir. Eis o nosso algoritmo recursivo de subdivisão, apresentado em pseudo-código:

Subdivide48(Edge h)

begin

if h.splited then return

if h.left.level = max_level return

le = BreakingEdge(h.left) re = BreakingEdge(h.right)

if h.left.level < h.right.level then

Subdivide48(le)

else if h.right.level < h.level.right then

Subdivide48(re)

// Criar os 4 novos triângulos nw, sw, ne e se // situados nas direcções cardeais secundárias // assim como as novas arestas en,es, ew, ee // nas direcções cardeais principais

nw.level=sw.level=ne.level=se.level=h.left.level+1

if h.type = internal then

edge_type = external

else edge_type = internal

en.type=ee.type=es.type=ew.type=edge_type

return end

Acrescente-se que a função BreakingEdge procura a aresta de um triângulo que está marcada como internal. A versão implementada é ligeiramente mais complexa que a apresentada, porque é ainda necessário tratar dos casos em que a subdivisão actua sobre uma aresta situada num bordo da malha. Nesse caso, apenas o campo left da aresta estará preenchido.

O processo de simplificação opera de forma inversa. Porém, apenas são consideradas as arestas que tiverem resultado de um processo de subdivisão anterior, sendo as outras dispensadas de testes futuros.

5.3. Estruturas Hierárquicas e gestão da memória

Como em todos os algoritmos hierárquicos de refinamento adaptativo, é necessário guardar a hierarquia de triângulos, exemplificada na Figura 3. No nosso simulador, cada uma das arestas ew e ee contém um apontador para um triplo formado pela aresta inicial h e pelas próprias arestas ew e ee (ver Figura 2). Note-se que, na nossa implementação, a informação acerca das

arestas en e es é recuperada seguindo as ligações das arestas para os triângulos adjacentes a elas. Esta opção permite poupar alguma memória e, das experiências efectuadas, a performance não sai demasiado penalizada pelas indirecções adicionais. Refira-se que a estrutura de dados que codifica a hierarquia não é, na realidade, uma árvore, mas sim uma floresta, existindo várias raízes. Outra característica interessante é que a hierarquia de níveis de detalhe não permite efectuar percursos da raiz até às folhas, o que não é necessário, mas sim no sentido inverso, das folhas para a raiz. Na estratégia de gestão de memória do nosso simulador as operações de subdivisão são penalizadas face às operações de simplificação. Em cada momento, estão presentes, em memória, todos os triângulos (e demais objectos, tais como as arestas) necessários para representar a malha no seu nível de detalhe actual. Para além deles, também os triângulos de níveis superiores (na hierarquia) continuam em memória, apesar de não estarem a ser usados na simulação. Quando ocorre uma simplificação num determinado local da malha, os triângulos a eliminar da malha são destruídos e os do nível acima são reactivados. Este processo de reactivação permite que a simplificação seja uma operação bastante eficiente.

5.4. Simplificação estável da malha

A nossa escolha do método de subdivisão 4–8 elimina a maior parte das causas de instabilidade da simulação, durante os processos de refinamento e de redução da malha. A causa do temido comportamento caótico do tecido modelado é, na maior parte das vezes, originada por alterações instantâneas na geometria da malha que não são suportadas pelas equações que regem e descrevem o comportamento dinâmico do modelo. Apesar de tudo, subsiste ainda o problema das operações de redução (ou simplificação) da malha. Aqui é impossível evitar a descontinuidade, porque o único cenário que o permitiria fazer seria o de ter os dois triângulos, aí em causa, num arranjo coplanar e a efectuarem um movimento solidário entre si.

A nossa primeira tentativa foi proceder à simplificação assim que o erro estimado da aproximação da malha ao tecido fosse inferior ao valor limiar estipulado. Mas este método simples revelou-se catastrófico. Uma análise mais cuidada à situação mostra que não bastará que os dois triângulos a fundir estejam praticamente coplanares. É também necessário saber se o arranjo é estável ou se é meramente transitório. O vector condição C(x), proposto em [Baraff98] e usado para modelar as forças que contrariam a curvatura do tecido é definido, para cada par de triângulos, como sendo o ângulo θ que as normais dos dois triângulos fazem entre si (ver Figura 8).

Numa situação em que o ângulo permanece estável, então a derivada do vector condição, ∂C(x)/∂x, deverá ser nula. Neste caso, a condição C depende apenas das posições das 4 partículas envolvidas (xi, xj, xk e xl), pelo que a sua derivada será obtida pelo vector de gradientes:

(

C

x

i

C

x

j

C

x

k

C

x

l

)

x

C

=

. Felizmente, estes gradientes já necessitavam ser avaliados no decorrer da simulação [Baraff98], pelo que a penalização introduzida por este critério de estabilidade é quase nula. Assim, em vez de verificarmos se os gradientes são vectores nulos, verificamos simplesmente se os seus módulos se encontram abaixo de um valor limiar muito pequeno. Desta forma, a quase totalidade dos problemas de instabilidade, que verificávamos durante a simplificação da malha, ficaram resolvidos com este teste adicional.

Figura 8 - Condição de curvatura

Outro dos problemas detectados foi a possibilidade de a gestão dinâmica do detalhe gerar ciclos apertados de subdivisão e simplificação. Embora estes ciclos sejam, na sua maior parte, transitórios, causam instabilidade, um efeito visual perturbador e gasta-se tempo de CPU desnecessariamente. A estratégia que decidimos implementar impede que o fenómeno possa ter uma alta frequência e traduz-se numa espécie de amortecimento da evolução da malha. Cada triângulo terá que existir por um período mínimo, parametrizável. Esta técnica simples impede que os triângulos gerados numa determinada altura da simulação possam, muito pouco tempo depois, ser destruídos devido ao processo de redução da malha. Note-se que com esta estratégia não impedimos que esses mesmos triângulos sejam subdivididos ainda mais. Esta característica revelou-se fundamental para que a subdivisão se possa adaptar, com rapidez, às variações de curvatura durante a simulação.

5.5. Manutenção das características físicas da malha

Ao contrário do que se verifica com os modelos de tecidos baseados em arranjos mola-massa [Villard02, Zhang02], uma das grandes vantagens do modelo contínuo, por nós utilizado, é a de não haver qualquer necessidade de ir ajustando, ao longo da simulação, as grandezas físicas que descrevem as características do tecido, tais como as constantes de elasticidade, distorção e curvatura.

Não basta, no entanto, calcular as novas propriedades da partícula gerada a cada passo da subdivisão. Se por um lado a sua posição de repouso é trivialmente calculada por interpolação das coordenadas (u,v), no espaço do tecido, das duas partículas situadas nos extremos da aresta subdividida, o cálculo da massa não se limita à

nova partícula gerada, sendo necessário proceder a uma distribuição de massas confome se verá de seguida.

Figura 9 - Tecido em queda livre, suspenso em dois pontos

Durante a subdivisão da malha, a massa total do tecido terá de permanecer constante. No nosso caso, a massa de cada elemento é calculada multiplicando a sua área pela densidade do tecido (uma constante da simulação). A massa é então distribuída pelas três partículas que servem de suporte ao triângulo. Durante o processo de subdivisão e simplificação a massa é calculada de forma incremental. Na primeira fase, cada triângulo a remover

fk fi fj fl xk xj xi xl θ

“liberta” o seu peso das partículas que o suportavam. Os novos triângulos efectuam o processo inverso, distribuindo, como indicado anteriormente, o seu peso pelas três partículas situadas em cada um dos seus vértices.

A distribuição final de massas assim obtida não é uniforme e, apesar de em [Volkov02] se apontar este fenómeno como causa de alguns artefactos durante a simulação, nomeadamente a deformação do tecido durante uma queda livre, as nossas experiências não confirmaram a existência de tais problemas.

6. RESULTADOS

A Figura 9 mostra vários passos de uma experiência, realizada partindo de um tecido, uniformemente dividido, formado por 25 partículas e 32 triângulos, e limitando a subdivisão a 6 níveis de profundidade. O tecido foi largado em queda livre estando, no entanto, suspenso por dois cantos. As imagens mostram como a subdivisão pode ser usada para, partindo de uma malha simplificada, e sem qualquer conhecimento prévio das condições da simulação, simular e mostrar detalhes do tecido que, de outra forma, apenas poderiam ser visíveis usando uma malha uniforme muito refinada.

Figure 10 - Tecido suspenso, subdividido dinamicamente

Na Figura 11 podem ver-se os tempos médios de CPU despendidos pelo algoritmo de subdivisão e simplificação adaptativas, para os primeiros 2 segundos de tempo simulado. O tempo médio de CPU gasto por frame, foi de 284.5ms, variando entre 3.27ms e 835.4ms. Sem recurso ao algoritmo, para se obterem triângulos com a mesma área dos de nível de detalhe maior, seria necessário recorrer a uma malha de 33×33 partículas. Nesse caso, cada passo da simulação demoraria, em média, cerca de 3012.7ms, ou seja, superior em mais de 10 vezes.

Note-se que a subdivisão e simplificação adaptativas apenas consomem, em média, cerca de 3% do tempo total gasto na simulação. Embora, por vezes, essa proporção possa atingir valores consideráveis, conforme se pode visualizar no gráfico, à medida que o número de partículas se torna mais significativo, o tempo de CPU

gasto é dominado pela resolução do sistema de equações lineares. Assim, a percentagem de tempo despendido pelas fases de subdivisão e simplificação converge, de forma rápida, para valores muitos baixos.

Tempo utilizado na subdivisão e simplificação

0,00% 5,00% 10,00% 15,00% 20,00% 25,00% 0 0,140,280,420,56 0,7 0,84 0,98 1,12 1,26 1,41,541,681,821,96 Tempo % C P U 0 100 200 300 400 500 600 Subdiv.+Simpli. Partículas

Figura 11 – Percentagem de tempo de CPU usado Uma experiência diferente pode ser visualizada na Figura 12. Neste caso, uma malha, previamente subdividida de forma regular, é deixada cair sobre uma superfície circular. Na zona de contacto pode ver-se, facilmente, o resultado do processo de simplificação.

Figura 12 - Tecido a cair sobre uma superfície circular

7. CONCLUSÕES E TRABALHO FUTURO

Dans le document An Introduction to Data Mining (Page 172-177)