flowchart LR
P["peça na origem<br/>(0, 0, 0)"]
P --> A["caminho A<br/>gira 90 graus em torno de Y,<br/>depois translada 40 cm em X"]
P --> B["caminho B<br/>translada 40 cm em X,<br/>depois gira 90 graus em torno de Y"]
P --> C["caminho C<br/>translada 40 cm em X,<br/>depois escala uniforme de 0,5"]
A --> DA["destino A<br/>coordenadas a calcular"]
B --> DB["destino B<br/>coordenadas a calcular"]
C --> DC["destino C<br/>coordenadas a calcular"]
DA --> S["os três casos são desenhados<br/>sem erro, aviso ou mensagem"]
DB --> S
DC --> S
1 Grafo de cena e laço de renderização — Exercícios
Os três problemas desta página compartilham uma dificuldade que já apareceu no material: em nenhum deles a imagem denuncia o defeito. Você vai calcular dois destinos que a mesma peça alcança com as mesmas duas instruções aplicadas em ordens diferentes, diagnosticar três leituras de um medidor de quadro que se parecem e não dizem a mesma coisa, e escrever um parecer sobre um simulador de braço robótico que funciona bem o bastante para ninguém desconfiar dele. Cada cenário está descrito por inteiro aqui, com os números de que você precisa e as unidades ao lado. Nenhum deles pede que você abra um projeto seu, continue algo em andamento ou execute código para responder.
Eu erro a ordem das transformações até hoje, e é sempre no dia em que estou com pressa. A defesa que funciona é uma conta escrita, com dois pontos e a distância entre eles, que responde em um segundo o que a intuição geométrica discute por meia hora. Estes três exercícios são, em boa medida, essa conta.
Como trabalhar estes três. Faça na ordem. O primeiro se resolve com lápis, papel e o que a leitura já deu; o segundo pede quatro contas curtas e uma comparação entre aparelhos; o terceiro junta hierarquia, relógio e laço num cenário que você ainda não viu. Escreva todos os números com unidade, sempre, mesmo quando parecer excesso de zelo: metade das confusões deste assunto vem de comparar grau por quadro com grau por segundo sem perceber a troca. E quando você afirmar que algo está errado, diga o que apareceria na tela se estivesse certo — se a resposta for a mesma imagem nos dois casos, você encontrou o ponto exato em que este assunto mora.
1.1 Exercício 1: Dois números, três destinos
Nível Básico — aplicação direta de conceitos
Uma peça está na origem de uma cena tridimensional, no ponto de coordenadas (0, 0, 0), com os eixos orientados da forma habitual: x para a direita, y para cima, z para quem olha. Duas instruções vão ser aplicadas a ela: transladar 40 cm ao longo do eixo x e girar 90 graus em torno do eixo y. Uma rotação de 90 graus em torno de y leva um ponto (x, y, z) para (z, y, -x) — anote essa regra, porque ela é tudo o que você precisa de trigonometria aqui. Além dos dois caminhos que essas instruções produzem, considere um terceiro: transladar os mesmos 40 cm e depois aplicar uma escala uniforme de 0,5, que multiplica por metade cada coordenada do ponto.
O que peço de você: calcule os três destinos e explique a diferença entre eles, em três partes. Em (a), escreva as coordenadas do ponto final de cada um dos três caminhos do diagrama e calcule a distância, em centímetros, entre o destino A e o destino B. Em (b), diga qual das duas expressões T \cdot R e R \cdot T corresponde ao caminho A e qual corresponde ao caminho B, justificando pela regra de leitura de um produto de matrizes — e escreva, em uma frase, por que alguém que lê a linha da esquerda para a direita entende o contrário do que ela faz. Em (c), olhe o destino C e diga o que a escala aplicada por último fez além de encolher a peça; aproveite para responder quais duas das três operações — escala uniforme, rotação e translação — podem trocar de lugar entre si sem alterar o resultado, e por quê.
Um aviso que economiza tempo: nenhum dos três caminhos produz mensagem de erro, alerta no console ou peça deformada. Os três desenham uma cena impecável, com um objeto em algum lugar. Se em algum momento você pensar em rodar os três para ver qual está certo, note que os três rodam.
Você terá terminado quando tiver três pares de coordenadas, um número em centímetros com a conta ao lado, a associação de (b) justificada pela regra de leitura, e a resposta de (c) dizendo qual par comuta e qual propriedade da escala uniforme garante isso.
1.2 Exercício 2: Três leituras do mesmo medidor
Nível Intermediário — comparação e cálculo
Um ambiente tridimensional é construído para rodar em dois aparelhos: um visor que apresenta 90 imagens por segundo e um computador de mesa que apresenta 60 imagens por segundo, com vídeo integrado e sem placa dedicada. Dentro da cena há um medidor que acompanha duas grandezas por quadro. O custo é o tempo que o programa gasta no trabalho que ele mesmo escreveu — avançar a cena, compor transformações, emitir chamadas de desenho. O intervalo é o tempo real decorrido entre uma imagem apresentada e a seguinte, dentro do qual cabe o custo e mais tudo aquilo com que o programa divide o aparelho. O medidor guarda as 120 amostras mais recentes num arranjo circular, em que a chegada de uma amostra nova descarta a mais antiga.
flowchart TB
V["visor<br/>90 imagens por segundo"] -->|"metade do TEMPO:<br/>o intervalo mais curto"| T["teto declarado<br/>para o quadro"]
D["computador de mesa<br/>60 imagens por segundo,<br/>vídeo integrado"] -->|"metade do TRABALHO:<br/>quanto cabe no intervalo"| T
T --> J["janela circular<br/>120 amostras recentes"]
J --> L1["leitura 1<br/>custo 3,0 ms · intervalo 30,0 ms"]
J --> L2["leitura 2<br/>custo 14,0 ms · intervalo 16,7 ms"]
J --> L3["leitura 3<br/>custo 8,0 ms · intervalo 11,1 ms<br/>6 amostras acima do teto"]
As três leituras do diagrama vêm de sessões diferentes. Na leitura 1, o custo médio é de 3,0 ms e o intervalo médio de 30,0 ms. Na leitura 2, o custo médio é de 14,0 ms e o intervalo médio de 16,7 ms. Na leitura 3, o custo médio é de 8,0 ms, o intervalo médio de 11,1 ms, e seis das 120 amostras ficaram acima do teto.
O que peço de você: diagnostique as três leituras, em quatro partes. Em (a), calcule o envelope do quadro de cada aparelho — o tempo disponível entre duas imagens consecutivas — a partir da cadência de apresentação de cada um, em milissegundos com uma casa decimal. Em (b), diagnostique a leitura 1 e diga em qual das duas grandezas está o gargalo, quanto tempo o programa poderia economizar no melhor caso e por que otimizar o código ali seria trabalhar na parte que já estava barata. Em (c), diga em qual dos dois aparelhos a segunda leitura cabe e em qual ela estoura, e explique de onde vem cada metade do teto: qual aparelho fixa o tempo disponível, qual fixa o trabalho que cabe nesse tempo, e por que adotar a média aritmética dos dois envelopes produziria um número que não corresponde a aparelho nenhum. Em (d), calcule a proporção de quadros acima do teto na leitura 3 e explique por que uma média acumulada desde o início da execução esconderia esses seis quadros, enquanto a janela curta os mostra.
Uma restrição de honestidade que faz parte do exercício: em nenhum momento eu lhe peço para dizer quantos triângulos cabem no orçamento desse computador de mesa, nem qual cadência o ambiente deveria buscar. Esses valores não foram medidos em lugar nenhum deste percurso, e responder o que não se mediu é o defeito que esta advertência existe para evitar.
Você terá terminado quando tiver dois envelopes calculados em (a), um diagnóstico com o ganho máximo em milissegundos em (b), a origem nomeada de cada metade do teto em (c), e uma porcentagem em (d) acompanhada da razão pela qual o tamanho da janela decide o que o medidor enxerga.
1.3 Exercício 3: O braço que funciona bem o bastante
Nível Desafiador — integração de conceitos e transferência
Um simulador de manutenção industrial, que você nunca viu e que está inteiro descrito aqui, mostra um braço robótico de pequeno porte e uma mesa de trabalho. A hierarquia da cena é a do diagrama: a base fixa carrega o braço, que carrega o antebraço, que carrega o pulso, que carrega a garra; a mesa é irmã da base e, sobre ela, apoiada, está uma chave de boca. O pulso gira em torno do próprio eixo a 90 graus por segundo enquanto a rotina de aperto executa. Há um botão PRENDER, que faz a chave passar a acompanhar a garra, e um botão SOLTAR, ainda não escrito.
flowchart TD
R["raiz da cena"] --> B["base fixa"]
R --> M["mesa de trabalho"]
B --> BR["braço"]
BR --> AB["antebraço"]
AB --> PU["pulso<br/>gira em torno do próprio eixo"]
PU --> G["garra"]
M --> K["chave de boca<br/>hoje é filha da mesa"]
G -.->|"botão PRENDER<br/>hoje: copia posição a cada quadro"| K
K -.->|"botão SOLTAR<br/>hoje: não existe operação inversa"| M
Quem escreveu a primeira versão tomou quatro decisões, e nenhuma delas produz mensagem de erro. Primeira: o botão PRENDER deixa a hierarquia como está; a cada quadro, o código lê a posição da garra, soma a ela um deslocamento fixo e escreve o resultado na posição da chave, que continua sendo filha da mesa. Segunda: o pulso avança dois graus por quadro, somados no corpo do laço. Terceira: dentro de cada quadro, a cena é desenhada antes de ser avançada pelo tempo, com o argumento de que assim a imagem sai mais cedo. Quarta: o primeiro quadro, que não tem um instante anterior a partir do qual medir, recebe um intervalo assumido de 16,7 ms, e nenhum limite superior é imposto ao intervalo medido nos quadros seguintes.
O que peço de você: escreva um parecer sobre as quatro decisões, em quatro partes, na ordem abaixo. Em (a), nomeie a operação que o botão PRENDER deveria executar, escreva a expressão que calcula a transformação local capaz de preservar a posição da chave no mundo, diga o que é cada matriz dela, e explique por que a soma de posições produz um resultado idêntico enquanto o pulso está parado e passa a ficar para trás no instante em que ele gira; aproveite para dizer por que o botão SOLTAR é difícil de escrever sobre a versão atual. Em (b), calcule a que velocidade angular, em graus por segundo, o pulso gira num aparelho que entrega 30 quadros por segundo e num que entrega 90, mantidos os dois graus por quadro; depois escreva a constante que faz os dois aparelhos concordarem nos 90 graus por segundo pedidos, e diga qual unidade essa constante passa a ter. Em (c), descreva o efeito da terceira decisão sobre o conteúdo de cada imagem apresentada e explique por que a animação continua acontecendo na velocidade certa apesar dele; em seguida, descreva o efeito da inversão simétrica, em que o tempo é medido depois de a cena avançar. Em (d), suponha que alguém troque de janela por 12 segundos e volte: calcule quantos graus o pulso avançaria no primeiro quadro de retorno com a quarta decisão como está, e quantos avançaria se o intervalo medido fosse limitado a um teto de 0,25 s; diga também o que os 16,7 ms assumidos no primeiro quadro provocam na primeira imagem que alguém vê.
Feche o parecer com um parágrafo sobre quem está com o visor no rosto quando o pulso dá aquele salto. A pessoa não observa um número errado: ela sente um objeto atravessar o campo de visão numa velocidade que corpo nenhum associa a movimento real, e o mal-estar que se segue dura mais do que o quadro que o causou. Diga por que essa consequência é independente do cuidado de quem opera o simulador, e por que ela pesa mais na escolha do teto do quadro do que qualquer argumento sobre aparência da cena.
Você terá terminado quando o parecer tiver uma expressão escrita e três matrizes identificadas em (a), quatro números com unidade em (b), dois efeitos distintos nomeados em (c), dois valores em graus e uma frase sobre a primeira imagem em (d), e um parágrafo final que descreva o que a pessoa sentiu sem atribuir falha a ela.
Método, para quando você travar. Nos três, a pergunta que destrava é a mesma: que número eu poderia imprimir para que a discussão acabasse? Distância entre dois pontos, milissegundos por quadro, graus por segundo — os três assuntos desta página têm uma grandeza mensurável escondida atrás de uma disputa de intuição, e a grandeza sempre ganha. Se um raciocínio seu depender de olhar a cena e julgar, desconfie: as três famílias de defeito tratadas aqui desenham imagens perfeitamente plausíveis. Escreva a unidade de cada constante ao lado dela, principalmente quando a unidade mudar no meio da resposta, que é onde o grau por quadro vira grau por segundo e o número muda de ordem de grandeza. E quando você recusar uma decisão, diga em que data ela cobra: uma escolha que funciona hoje e quebra na hora de soltar a peça merece um argumento sobre o vencimento, e não sobre elegância.