segunda-feira, 5 de janeiro de 2009

O Teorema de Capullo

Quando eu era criança, tinham duas coisas que eu fazia bem: programar e desenhar. Em um certo ponto da vida eu decidi conscientemente deixar de lado o desenho pra focar na programação, mas não antes de tentar um emprego como desenhista :)

Isso foi quando eu tinha onze anos. Eu morava ao lado do estúdio do Ely Barbosa, que na década de 80 tinha vários personagens bizarros, incluindo um coelho que viajava numa escova de dentes voadora gigante. Na cara de pau eu fui lá e me ofereci pra desenhar os gibis deles. Incrivelmente, eles não falaram "se manda guri", mas fizeram de fato um teste pra ver se eu desenhava o suficiente. (Que eu acabei bombando. Tinha só onze anos poxa.)

Mas mesmo tendo optado pela programação, eu nunca deixei de lado esse lado artístico. Não por acaso, meus primeiros empregos foram todos com computação gráfica. E, embora há muito eu não desenhe, adoro comprar livros e revistas com técnicas de desenho, para o caso de algum dia dar vontade de desenhar de novo.

Uma das revistas que tenho aqui é a primeira edição da Wizard brasileira, onde publicaram na íntegra todo o curso de desenho do Greg Capullo (desenhista do Spawn), uma série muito boa chamada Curso de Impacto (no original Krash Course, tem digitalizado na web se você souber onde procurar). No capítulo sobre perspectiva, eu aprendi um truque muito bom com ele, que na falta de nome melhor eu chamo de Teorema de Capullo:

Se você tiver vários personagens de mesma altura em uma cena, mesmo que eles não estejam na mesma profundidade, sempre haverá uma parte do corpo deles que estará alinhada.


Sabendo usar a regra acima, fica super fácil desenhar cenas complexas com perspectiva correta. Pra ver experimentalmente como isso é verdade, eu fiz um programinha em pyOpenGL que desenha vários Ricbits em posições aleatórias, usando as regras acima:


Script em python que desenha a cena acima

Note como o teorema de Capullo é verdadeiro: apesar de estarem em distâncias diferentes, todos os Ricbits estão alinhados na altura da cintura. Naturalmente, a primeira coisa em que pensei quando vi o teorema foi: dá pra demonstrar? A resposta é: sim, dá, e é surpreendentemente simples!

Vamos assumir que o observador está a uma altura h do solo, e que o plano de projeção está na coordenada z=1 (sem perda de generalidade). Vamos projetar um ponto P qualquer nesse plano de projeção, cujas coordenadas são Px, Py, Pz, e a intersecção com o plano vai ser em Sx, Sy. O que nós queremos provar é que existe um Sy tal que, para qualquer Pz dado, sempre é possível escolher um Py, independente de Pz, que projeta nesse Sy. Virando a figura de lado ela fica assim:

(Thanks to Bani/Inkscape pelo diagrama)

Por semelhança de triângulos, nós tiramos que (Py-h)/Pz = Sy/1, logo Sy=(Py-h)/Pz. Agora é imediato, basta escolher Py=h que Sy sempre será zero, independente de Pz, QED.

A parte bacana de entender matematicamente o que acontece é que você pode extrapolar suas conclusões. Como a escolha de Py depende do h, isso significa que o ponto exato onde as figuras se encontram depende da altura do observador. Subindo o observador no script ficamos com uma figura como a abaixo, note como agora os Ricbits estão alinhados na altura do pescoço:


Um dia eu ainda volto a desenhar, mas enquanto isso programação e matemática são divertidas demais :)

PS: Minha resolução de ano novo é atualizar o blog pelo menos duas vezes por mês, então, se eu atrasar, me cobre!

7 comentários:

  1. Wow!!! 2 vezes por mês? Podes ter certeza que eu serei um dos que vai cobrar, tudo bem que eu as vezes também faço umas pausas monstruosas no meu blog, mas sempre tem movimento pro lá nem que for pra atiçar fogo no resto do povo hihi.

    ResponderExcluir
  2. Caramba, que interessante!

    Duas vezes por mês é bom demais!
    Cada post seu eu fico mais empolgado com tudo! Vale muito a pena ler!
    Obrigado!

    ResponderExcluir
  3. Muito boa esta teoria! não tinha reparado no detalhe de que personagens de alturas iguais se alinham em perspectiva. :-D

    Ah, e pode deixar que vou pegar no seu pé para blogar, ou no mínimo para te inspirar a escrever algo. ;-)

    Kissu.

    ResponderExcluir
  4. Agora vou começar a reparar em todas as figuras que vir! :D
    Grata por ampliar meu conhecimento desenhístico.

    Cumpra a frequência (argh), é sempre bom passar aqui e aprender alguma aleatoriedade!

    Beijos!

    ResponderExcluir
  5. A wizard ´que tem esse teorema esta comigo aqui em casa! Mas depois que se aprende perspectiva de verdade (com plano de chão, plano de tela, ponto do observador, ponto de fuga e escala) essa regra torna-se inútil! Mas ajudou muito minha vida quando eu nao sabia perspectiva de verdade!
    (raul tabajara)

    ResponderExcluir
  6. bah
    existia o programa do ESCOVÃO
    :D

    ResponderExcluir
  7. Ola Ricardo.

    Recebi de uma amiga o seu texto sobre as mitocondrias, e adorei.

    Mitocondrias me interessam e seu texto é bem interessante pros meus interesses.

    Se te interessar falar mais sobre mitocondrias e/ou textos , meu mail é cintiadigiorgi@gmail.com

    Até já !

    Cintia

    ResponderExcluir