%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["a peça saiu errada na tela"] --> B{"a silhueta muda<br/>de qualquer<br/>ângulo?"}
B -->|"sim"| P["posições<br/>um ponto fora do lugar"]
B -->|"não"| C{"buraco de<br/>uns ângulos?"}
C -->|"sim"| O["faces<br/>ordem dos índices<br/>invertida"]
C -->|"não"| D{"brilho<br/>errado?"}
D -->|"sim: gire a peça<br/>diante da luz direcional"| F{"escurece<br/>ao encarar<br/>a luz?"}
F -->|"sim"| N["normais<br/>apontam para dentro"]
F -->|"não"| L["normal certa<br/>se a peça é de metal,<br/>falta à cena o que ele<br/>possa refletir"]
D -->|"não"| T{"há imagem<br/>colada?"}
T -->|"não"| Z["a coordenada<br/>ainda não<br/>mostra nada"]
T -->|"sim"| T2{"imagem<br/>esticada?"}
T2 -->|"sim"| U["coordenadas<br/>de textura mal<br/>distribuídas"]
Técnicas de modelagem de ambientes virtuais — Atlas
O módulo inteiro em oito formas visuais. Cada uma mostra o mesmo conteúdo por um lado diferente: o resumo desenhado, os procedimentos passo a passo, os cartões para treinar de memória, o módulo contado como uma história desenhada, o mapa dos tópicos, o painel que junta tudo, a rede de conceitos e a folha para consultar na hora.
Resumo ilustrado
Fluxogramas
Nove procedimentos do módulo, na ordem do livro. Siga cada um com o lápis, sobre uma peça sua.
Achar a lista que errou
Só a posição errada muda a silhueta de qualquer ângulo; as outras três listas a conservam, ao menos de algum ângulo. Por isso a pergunta começa pela silhueta.
Levantar uma peça a partir do perfil
%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["escreva o perfil<br/>uma sequência de pontos no plano"] --> B["a extrusão levanta o perfil<br/>numa espessura"]
B --> C["uma tampa<br/>um vértice no centro e um por ponto<br/>os pontos na ordem do perfil"]
B --> D["a outra tampa<br/>os mesmos pontos<br/>na ordem inversa"]
B --> E["a casca<br/>um retângulo em pé por trecho<br/>4 vértices e 2 triângulos"]
C --> F{"toda face gira<br/>no sentido anti-horário<br/>vista de fora?"}
D --> F
E --> F
F -->|"não"| G["procure a ordem errada<br/>em três lugares:<br/>as duas tampas e a casca"]
G --> F
F -->|"sim"| H["conte na engrenagem grande<br/>57 + 57 + 224 = 338 vértices<br/>56 + 56 + 112 = 224 triângulos"]
Procurar triângulos que dá para cortar
%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["um parâmetro do perfil<br/>custa triângulos em todo quadro"] --> B{"trocá-lo<br/>troca a peça?"}
B -->|"sim"| FO["parâmetro de forma<br/>número de dentes, raios"]
FO --> FX["não está à venda<br/>14 e 9 dentes fixam<br/>a razão de transmissão"]
B -->|"não"| RE["parâmetro de resolução<br/>lados do eixo, pontos por dente"]
RE --> T["ponha lado a lado a versão<br/>com menos e a com mais triângulos,<br/>no aparelho da cena<br/>e à distância de trabalho"]
T --> Q{"alguém distingue<br/>as duas?"}
Q -->|"não"| M["fica a contagem menor"]
Q -->|"sim, a faceta incomoda"| X["a maior se justifica<br/>com a razão escrita"]
Declarar a superfície de uma peça
%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["a peça precisa de superfície"] --> B["declare o que ela é<br/>metalicidade e rugosidade"]
B --> C["escreva as duas colunas<br/>o que ela entrega<br/>e o que ela cobra"]
C --> D{"outra peça já usa<br/>esta superfície?"}
D -->|"sim"| E["aponte para a mesma instância<br/>um envio de parâmetros, não dois"]
D -->|"não"| F["crie a instância uma vez"]
E --> G{"a peça de metal<br/>saiu escura?"}
F --> G
G -->|"sim"| H["confira antes a normal:<br/>a invertida também escurece;<br/>com ela certa, dê à cena<br/>o que o metal possa refletir"]
G -->|"não"| I["a luz da cena decide o resto"]
Trocar a malha de um nó
%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["o nó já existe na árvore<br/>no pai certo"] --> B{"é um nó de malha?"}
B -->|"não"| X["a execução para<br/>com o nome da peça"]
B -->|"sim"| C["libere a malha anterior"]
C --> D["instale a malha nova<br/>e a superfície declarada"]
D --> E["nenhum nó criado, removido<br/>ou trocado de pai"]
C -.->|"sem liberar"| Y["as sobras se acumulam<br/>até a memória de vídeo acabar"]
Decidir de onde vem a forma
%%{init: {"flowchart": {"useMaxWidth": false}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
Q["o que esta forma diz<br/>que uma primitiva não diria?"]
Q -->|"nada"| PR["primitiva pedida à biblioteca<br/>caixa de 12 triângulos e 24 vértices"]
Q -->|"engrena, faceta, aresta viva"| AU["forma escrita pelo programa<br/>perfil e extrusão"]
Q -->|"nem caixa nem perfil:<br/>rosto, objeto esculpido"| EXT["ferramenta de autoria"]
EXT --> C1["confere a contagem<br/>contra a linha de base"]
EXT --> C2["confere o material<br/>sob as luzes desta cena"]
EXT --> C3["confere a escala<br/>por uma medida conhecida"]
Criar o volume de contato de uma peça
%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["a peça vai ser pega"] --> B["meça a menor caixa que contém<br/>os vértices da malha,<br/>e não o nó"]
B --> C{"a folga desta peça<br/>está declarada?"}
C -->|"não"| X["a execução para<br/>com o nome da peça"]
C -->|"sim, com a razão"| D["some a folga uma vez<br/>na criação, em cada direção"]
D --> E["o volume fica no espaço local<br/>e gira junto com a peça"]
D --> F["crie o contorno de depuração<br/>com os mesmos números<br/>e deixe-o escondido"]
B -.->|"medir o nó"| Y["entraria na conta o contorno<br/>e a caixa engordaria a cada vez"]
Testar se um ponto está dentro do volume
%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["um ponto em coordenadas de mundo"] --> B["(1) leve o ponto ao<br/>espaço local da peça"]
B --> C["(2) desconte o centro da caixa"]
C --> D["(3) compare cada coordenada, sem o sinal,<br/>com a meia-extensão naquela direção"]
D --> E{"as três<br/>cabem?"}
E -->|"sim"| IN["dentro<br/>o volume captura o ponto"]
E -->|"não"| OUT["fora"]
D -.-> EX["ponto a 12 cm do centro<br/>da engrenagem grande<br/>folga de 2,0 cm: parede a 9,75 cm, fora<br/>folga de 6,0 cm: parede a 13,75 cm, dentro"]
Conferir as caixas antes de haver pega
%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["ligue os contornos de depuração"] --> B["ponha as peças na posição<br/>em que vão ser usadas"]
B --> C["olhe cada par de peças vizinhas"]
C --> D{"as caixas se tocam<br/>ou se cruzam?"}
D -->|"não"| OK["as duas podem ser pegas<br/>sem disputa"]
D -->|"sim"| R["leia no relatório<br/>as medidas e a folga de cada uma"]
R --> M["mude um número<br/>a folga ou a posição de uma delas"]
M --> C
Cartões de memória
Leia a frente, diga a resposta em voz alta ou escreva no papel, e só então vire o cartão.
Por vértice guardam-se três coisas: a posição, que decide onde o ponto está no espaço; a normal, que decide como a luz responde ali; e o par de coordenadas de textura, que decide qual pedaço de uma imagem cai sobre aquele ponto. A lista de faces enumera triângulos por índice de vértice; um lado plano da peça, como a tampa de uma engrenagem, é feito de vários deles.
A forma que se vê é o resultado das quatro listas juntas, e o sintoma de erro é desigual entre elas. Errar as posições muda a silhueta, e isso se enxerga de qualquer ângulo. Errar a normal conserva a silhueta e muda o brilho dentro dela. Errar a ordem dos índices de uma face conserva a silhueta de uns ângulos e abre um buraco de outros. Errar a coordenada de textura não muda nada enquanto nenhuma imagem for aplicada.
A normal de um vértice é a direção que o programa declara como "para fora" naquele ponto, e é ela que a iluminação consulta para decidir o brilho da superfície.
Um vértice usado por várias faces carrega uma normal só, que serve a todas elas. Compartilhar o ponto entre faces que olham para direções diferentes suaviza o canto entre elas; duplicar o ponto, com uma cópia por face, conserva a aresta viva ao preço de mais vértices na malha.
A construção por perfil e extrusão tem duas partes de papéis desiguais. O perfil é uma figura plana, dada como sequência de pontos, e é nele que mora toda a decisão de forma. A extrusão levanta o perfil numa espessura, fecha as duas tampas e monta a casca lateral, e é a mesma rotina para qualquer perfil.
Trocar o perfil troca a peça. Os parâmetros do perfil são de dois tipos, e não se confundem. Os de forma — quantos elementos, com que raios — decidem que peça é aquela. Os de resolução — quantos pontos descrevem cada elemento, quantos lados aproximam uma curva — são o botão de densidade da malha. Os dois custam triângulos, e o custo é pago em todo quadro; só o segundo se negocia com o orçamento sem mudar a peça.
Daí decorre uma dependência que a declaração sozinha esconde: a superfície metálica devolve ao olho o que existe em volta para refletir, e uma cena com pouca luz ao redor a deixa escura e sem leitura, mesmo com a declaração intacta.
Uma superfície declarada é uma instância, e a mesma instância pode ser apontada por quantas peças a usem. Duas instâncias idênticas em valor permanecem distintas para a biblioteca: ela reaproveita o programa de sombreamento compilado, porque a configuração é a mesma, mas reenvia à placa de vídeo os parâmetros de uma e de outra a cada passagem entre as peças que as usam.
Ele se deriva da geometria da peça e vive no espaço local dela, o sistema de coordenadas da própria peça. Assim ele gira, escala e muda de pai junto com a peça, sem recálculo e sem que ninguém precise mantê-lo sincronizado.
O critério que decide a forma do volume é o comportamento pretendido na manipulação, e a semelhança com a silhueta é uma consequência ocasional desse critério. Testar contra a malha completa custa uma comparação por triângulo a cada consulta e entrega uma superfície cheia de reentrâncias, por onde a mira escapa em lugares que quem manipula não tem como prever.
Ela erra para os dois lados, com sintomas opostos. Folga grande captura o que passou perto, e a peça responde a quem não a tocou. Folga pequena recusa o que já encostou, e cada recusa custa a quem manipula um gesto a mais.
A folga é decidida por peça, e o número anda junto da razão dele. Peça fina pede folga pequena: a folga que serve para apanhar uma peça grande cerca a peça fina de um volume feito quase só de ar, e a peça fina rouba do alvo pretendido qualquer mira que cruze a vizinhança.
História em quadros
O módulo contado do começo ao fim, um passo em cada desenho, na ordem em que o livro avança.
Mapa mental
Os tópicos do módulo, do centro para fora, na ordem do livro.
Painel do conhecimento
Conceitos
- Malha: listas paralelas por vértice, com a posição, a normal e o par de coordenadas de textura, mais a lista de faces, os triângulos que ligam os vértices.
- Orientação e normal: a orientação decide se a face é desenhada; a normal decide como a luz responde.
- Perfil e extrusão: o perfil guarda toda a decisão de forma; a extrusão é a mesma rotina para qualquer perfil.
- Superfície declarada: a que se declara por metalicidade e rugosidade; a luz da cena produz a aparência.
- Volume de contato: a forma simples contra a qual se testa o toque, no espaço local da peça.
- Folga: a distância somada ao volume em cada direção, decidida por peça e com a razão ao lado.
Exemplos
- A normal invertida na casca: silhueta perfeita, superfície escura.
- O eixo de doze lados: parece cilindro à distância, mostra a faceta de perto.
- Cada dente, quatro pontos: sobe à crista, atravessa a crista, desce à raiz, atravessa o vale.
- Dois latões iguais em valor e distintos em identidade: dois envios de parâmetros por quadro em vez de um.
- A vaga de estacionamento: ninguém estaciona pensando no retrovisor, e sim no retângulo que o carro ocupa; na cena, esse retângulo é o volume de contato.
- O ponto a 12 cm do centro da engrenagem grande: a folga adotada não o captura; o triplo dela, sim.
Diagrama
%%{init: {"flowchart": {"useMaxWidth": false}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart LR
subgraph POR["por vértice"]
P["posição<br/>onde o ponto está"]
N["normal<br/>para que lado a superfície olha ali"]
U["coordenada de textura<br/>que ponto da imagem cai ali"]
end
F["faces<br/>que vértices formam cada triângulo"]
POR --> M["a peça desenhada"]
F --> M
P -.->|"errada"| S1["a silhueta muda<br/>o erro se vê de qualquer ângulo"]
N -.->|"errada"| S2["silhueta intacta<br/>o brilho muda"]
U -.->|"errada"| S3["silhueta intacta<br/>nada muda até haver imagem colada"]
F -.->|"ordem invertida"| S4["silhueta intacta de uns ângulos<br/>buraco visível de outros"]
Evidências
- 1968: Sutherland monta um visor tão pesado que fica pendurado no teto do laboratório por um braço mecânico, e o visor mostra arestas de arame.
- Contados pelo próprio programa: a engrenagem grande sai com 338 vértices e 224 triângulos, e as cinco peças somam 440 triângulos; a cena inteira, 476.
- Medidas na cena: a caixa da engrenagem grande tem 19,5 × 5,6 × 19,6 cm, com folga de 2,0 cm; a do eixo, 4,0 × 23,6 × 4,0 cm, com 0,8 cm.
- Com a engrenagem pequena na posição x = 45 cm, as caixas das duas engrenagens se cruzavam em repouso; afastada 2 cm, para x = 47 cm, nenhum par de caixas se cruza com as peças paradas.
- Com as duas luzes da cena acesas, a direcional e a hemisférica, a lateral do eixo de aço é a mais escura das cinco peças, quase preta contra o tampo.
Referências
- Sutherland, A head-mounted three dimensional display, Proceedings of the AFIPS Fall Joint Computer Conference, p. 757–764, 1968.
- Sherman e Craig, Understanding virtual reality: interface, application, and design, 2. ed., 2018, que trata do episódio de 1968.
- Schmalstieg e Höllerer, Augmented reality: principles and practice, 2016, que também o trata.
Aplicações
- Na cena do projeto, o mecanismo ganha forma própria, com dentes, faceta e superfície, sem que a árvore seja remontada.
- No módulo da manipulação, pegar, mover e encaixar testam contra os volumes de contato escritos aqui.
- No módulo seguinte, Ativos, formatos de troca e orçamento de cena, os 440 triângulos e as quatro superfícies são a linha de base para comparar peças trazidas de fora.
- Na tela, no visor e no celular que mostra a sala real, a superfície declarada responde à luz que a cena declarar em cada regime.
Mapa conceitual
Escreva num papel: malha, posição, faces, normal, coordenada de textura, silhueta, perfil, extrusão, parâmetros de forma, parâmetros de resolução, densidade, envelope do quadro, troca de estado, superfície declarada, luz da cena, volume de contato, espaço local, folga, contorno de depuração, relatório. Ligue os conceitos com setas, e escreva em cada seta um verbo que diga qual é a relação. Depois compare com o mapa.
Folha de consulta
As quatro listas
- posição errada: muda a silhueta, e isso se vê de qualquer ângulo
- normal errada: conserva a silhueta e muda o brilho dentro dela
- faces na ordem errada: conservam a silhueta de uns ângulos e abrem um buraco de outros
- coordenada de textura errada: nada muda enquanto nenhuma imagem for aplicada
Orientação e normal
- a face que gira no sentido anti-horário vista de fora é desenhada; a outra é omitida, sem erro nem aviso
- a normal é a direção “para fora” que a iluminação consulta
- teste: girar a peça diante da luz direcional; a lateral que escurece ao encarar a luz tem a normal invertida
- vértice compartilhado: uma normal para várias faces, e o canto se suaviza
- vértice duplicado: aresta viva, ao preço de mais vértices; no cubo, 24 em vez de 8
Contas da extrusão
| Engrenagem grande | Vértices | Triângulos |
|---|---|---|
| tampa de cima | 57 | 56 |
| tampa de baixo | 57 | 56 |
| casca | 224 | 112 |
| inteira | 338 | 224 |
- eixo, doze lados: 74 vértices e 48 triângulos
- cada dente custa 16 triângulos; cada lado do eixo, 4
Forma e resolução
- forma: número de dentes e raios; decide que peça é; 14 e 9 dentes fixam a razão de transmissão
- resolução: lados do eixo e pontos por dente (os pontos, hoje fixos em 4); é o botão de densidade
- densidade: quantos triângulos a malha tem, contados na lista de faces
- as duas engrenagens custam 368 dos 440 triângulos, e esse custo não está à venda
Censo e as duas moedas
- 440 triângulos nas cinco peças: 224 + 144 + 48 + 12 + 12; 476 na cena inteira
- censo é o que a cena tem; quanto a máquina aguenta não foi medido
- o envelope do quadro, de 11 ms no visor e de 16,7 ms na tela do computador, se gasta em triângulos e em trocas de estado
- quatro superfícies em oito malhas: quatro trocas de estado por quadro, e não oito
- o mesmo latão nas duas engrenagens: um envio de parâmetros por quadro; dois latões iguais, dois envios
Volume e folga
- testar um ponto: levar ao espaço local, descontar o centro, comparar cada coordenada, sem o sinal, com a meia-extensão daquela direção
- a caixa sai da malha, e não do nó; a folga é somada uma vez, na criação
- folgas: 2,0 cm na engrenagem grande, a maior; 1,8 na pequena; 1,2 no corpo; 1,2 na tampa do mecanismo; 0,8 no eixo, a menor
- engrenagem grande: caixa de 19,5 × 5,6 × 19,6 cm
- ponto a 12 cm do centro: com 2,0 cm de folga, a parede fica a 9,75 cm, e ele fica fora; com 6,0 cm, a 13,75 cm, e ele fica dentro
- o contorno de depuração responde onde; o relatório responde quanto
Erros previsíveis
- “uma malha é um conjunto de triângulos”: são quatro listas, e só a das posições muda a silhueta de qualquer ângulo
- “a normal invertida dá erro”: a silhueta continua perfeita, e a peça só escurece
- “compartilhar vértices é sempre melhor”: arredonda o canto da peça mecânica
- “tirar dentes é um jeito de economizar triângulos”: a conta poupa 16 por dente, mas o número de dentes é forma, e trocá-lo troca o mecanismo
- “o metal é mais realista”: ele depende do que existe em volta para refletir
- “dois materiais com os mesmos valores custam o mesmo que um”: custam dois envios de parâmetros por quadro
- “o volume de contato é a malha simplificada”: o critério é o comportamento, e a caixa é maior que a peça em toda direção
- “testar contra a malha exata é mais preciso”: além de caro, é errado; a mira escapa pelo vale
- “folga maior é mais segura”: ela captura o que passou perto
- “o volume precisa ser recalculado a cada quadro”: no espaço local, ele acompanha a peça sem recálculo
- “440 triângulos é o teto da cena”: é censo das cinco peças; o orçamento não foi medido