Anatomia para Artistas – I

Nesse post, esmiuçaremos o básico do básico (do básico) da anatomia. Falaremos da nomenclatura básica, para que possamos aprender a localizar um osso ou músculo. Tendo um nome, fica também mais fácil de associar uma forma à aquele volume, pois você tem uma ‘caixa’ de informação sobre aquele determinado osso (ou músculo), ao invés de ter várias coisas na cabeça sobre algo abstrato. Vamos lá ?

Muitos dos nomes anatômicos possuem nomes latinos ou gregos, já que essas descobertas foram nomeadas há muito tempo atrás. Isso tem como benefício de facto que médicos ou artistas de diferentes nacionalidades podem se referir a uma parte e serem entendidos.

Posição anatômica padrão

Posição anatômica padrão

Esse é a posição padrão dos livros de anatomia. Você pode (e deve) esculpir seu personagem em qualquer pose (de preferência uma mais relaxada), mas é importante entender que é assim que você verá o corpo humano em muitos livros e referências sobre o assunto.

Nessa posição, qualquer coisa que esteja na parte da frente do corpo é chamada de anterior e qualquer coisa na parte de trás é chamada de posterior. Acima da cintura é chamada de de superior enquanto abaixo é chamado de inferior.

Termos direcionais básicos

Termos direcionais básicos

Vamos para um exemplo prático. Na figura abaixo você vê a pélvis. Onde o dedo apnota é um ponto importante da figura humana; serve como referência, é o ponto de onde os músculos da parte da frente da perna irradiam. É chamada de espinha ilíaca, mais especificamente, espinha ilíaca anterior superior. De acordo com o que aprendemos, significa que é espinha ilíaca superior, em direção ao topo, anterior, em direção a frente do corpo. Simples, não é ?

Espinha Ilíaca Anterior Superior

Espinha Ilíaca Anterior Superior

Naturalmente, se falamos em espinha ilíaca anterior superior, podemos supor desde já que há uma espinha ilíaca posterior superior assim como anterior inferior e posterior inferior.

Como regra geral, se algo é nomeado superior, você pode inferir que há uma contraparte inferior. O mesmo para posterior e anterior.

Ao falar de músculos, frequentemente ouvirá termos como origem e inserção. A origem é simplesmente o ponto no qual o músculo se origina no esqueleto, é a parte que fica fixa durante a contração. Ou seja, uma maneira fácil de achar a origem de um músculo é achar o ponto onde ele se move menos ao contraí-lo. A outra “ponta” do músculo é a inserção, a parte que tem mais movimento. O formato de um músculo pode até se mudar durante o movimento mas seus pontos de origem e de inserção nunca mudam, eles estão fixos aos esqueleto.

Origem e inserção do pectoralis

Origem e inserção do pectoralis

Partes do músculo

Partes do músculo

No próximo artigo, tem mais.

 

Entendendo Python: Lambda

O que é lambda ?

Lambda não é nada mais que funções anônimas que aceitam argumentos (inclusive opcionais) e que só suportam uma expressão. Ao executar lambda, Python retorna uma função ao invés de atribuí-la à um nome como acontece com def, por isso são anônimas. O conceito e o nome são emprestados de Lisp, uma linguagem funcional.

Hum…. Quê ?

Basicamente, você vai usar lambda quando precisar de uma função que não seja seja complexa o suficiente para criá-la com def. Você pode pensar em lambdas como funções de uma linha só. Como muitas coisas na vida real, é melhor ver na prática para entender. Vamos começar transformando uma função que recebida uma lista de palavras, devolve uma lista com o tamanho de cada uma das palavras.

def size_each(words):
    return [len(w) for w in words]
 
words = ['look', 'so', 'car', 'ice', 'melted']
 
print size_each(words)
>>> [4, 2, 3, 3, 6]
 
size_each = lambda words: [len(w) for w in words]
 
print size_each(words)
>>> [4, 2, 3, 3, 6]

Viu só ? É simples como parece. lambda cria uma função e atribuí ela a variável size_each que passa a ter a função anônima, bastando executá-la; return é implícito. Lambda toma a forma de:

lambda argumento1, argumento2,… argumentoN :expressão usando argumentos

Lambda é uma expressão – Por causa disso, lambda pode aparecer em lugar que um def não pode – dentro de uma lista ou nos argumentos de chamada de uma função, por exemplo. Tal como uma expressão, retorna algo e esse algo é a função em si.

Mundo real

Exemplos didáticos sempre tendem a ser burocráticos e pouco inspirados em casos reais. Tentarei usar um exemplo mais prático aqui.

replace = True
func = replace and (lambda s: s.replace(' ', '_')) or (lambda s: s)
 
phrase = 'Look at the sky, blue mama'
 
print func(phrase)
>>> Look_at_the_sky_blue_mama

Ainda bem burocrático, mas ilustra um bom ponto. Se replace é True, retorna para func a primeira função lambda que aceita um argumento (s) e retorna o mesmo com a devida substituição feita… Se replace é false, retorna a segunda função que simplesmente retorna o argumenento (s) como ele é. Lembre-se, return é implícito em lambdas.

Você pode também ter um dicionário de ações usando lambda… Digamos:

actions = {
    'sum': lambda x, y: x + y,
    'sub': lambda x, y: x - y,
    'mul': lambda x, y: x * y,
}
 
func = actions['sum']
 
print func(10, 20)
>>> 30

Para finalizar, lambda é basicamente uma questão de estilo. Não são necessárias, mas podem ajudar seu código em termos de legibilidade e praticidade. Eu sempre uso lambdas ao invés de várias funções de uma linha só.

Espero que tenha ficado claro o suficiente e que possa usar lambda para melhorar seu código. Uma vez passado o susto inicial, lambdas podem ser suas melhores amigas ao lado de list comprehensions.

Tratando XML como um objeto Python

Algumas vezes, o XML como ele vem é praticamente o que você precisa, sem necessidade de parsear o XML para suas necessidades. Algum tempo atrás eu enfrentei esse “problema”, não queria fazer o parsing do XML pois o formato dele já atendia minhas necessidades. Existem algumas soluções, mas todas precisam do DTD do XML para poderem converter a árvore do XML em objetos. Felizmente, o lxml (sempre ele) veio a salvação. É realmente a melhor biblioteca XML do Python.

from lxml import objectify
 
xml = """
<test>
<inside>2</inside>
<another>
<deep>so deep</deep>
</another>
</test>"""
 
obj = objectify.fromstring(xml)
 
print obj.inside
print obj.another.deep

E você ainda pode percorrer as tags filhas e tudo mais, nada muda.

Dicas para seu render V-Ray

Essas dicas podem ser muito úteis para diminuir o tempo do seu render de 3 horas para 20 minutos. Muitas pessoas não compreendem que no caso de settings para render, mais não significa necessariamente melhor. Pelo contrário, após um determinado limite, a lentidão aumenta exponencialmente sem melhora visível na imagem e você ainda começa a introduzir ruído na imagem. Pra complicar um pouco mais, as opções de render geralmente influenciam umas as outras. Ainda farei um post (provavelmente em vídeo) explicando todas as opções, mas até lá, espero que essas dicas sejam úteis.

1 – Use a escala do mundo real

Você pode não saber, mas é essencial que você modele os objetos usando seu tamanho real. Com isso, você tem a certeza que as luzes da sua cena funcionarão como as luzes do mundo real. Todo programa tem em suas configurações, uma opção para configurar as medidas usadas. Se está fazendo algo pequeno e delicado, talvez seja interessante trabalhar  com centímetros, se está modelando uma casa, use metros… E por aí vai.

2 – Preocupe-se com sua geometria

Primeiro, preocupe-se com a contagem de polígonos do seu objeto/cena. Se o mesmo objeto pode ser representado com menos polígonos, melhor, seu render ficará mais leve.

 Geometria

Preste atenção em vértices duplicados, arestas que sobrepõem-se umas as outras, etc. E não é só na hora da iluminação que isso ficará extremamente aparente. Ao aplicar um turbosmooth ou deformar o objeto, também.

3 – Use Linear Workflow (LWF)

Utilizando LWF você terá renders mais realísticos e renderizados em menos tempo, pois a maneira como arquivos 8-bit são salvos torna a imagem aparentemente mais escura do que realmente são. Veja mais aqui.

4 – Use a V-Ray Physical Camera

A V-Ray Physical Camera tem muitas (muitas!) vantagens sobre a câmera comum dos pacotes 3D. Ela funciona como uma câmera fotográfica real, te permitindo ajustar exposição, velocidade do obturador e white balance como você faria como uma câmera normal. Na prática, ao invés de aumentar a intensidade da sua luz (ou diminuí-la) você pode simplesmente configurar a câmera para capturar a luz da maneira desejada. Algumas pessoas aplicam vignette  e depth of field, mas eu não recomendo, pois são operações que pesam no render e ficam lá permanentes. Melhor aplicar na pós-produção.

Estude fotografia!

5 – Renderize em passes

Geralmente, muitas pessoas ignoram esse passo por considerá-lo difícil, trabalho e/ou desnecessário. Mas no longo prazo, realmente vale a pena. Renderize diferentes passes e quando precisar alterar somente uma reflexão ou um specular highlight, renderize somente aquele passe novamente. Além do mais, isso te permitirá total controle na pós-produção da sua imagem. Passes te dão controle sobre canais de difusão, specular e reflexão, depth of field e muito mais. Escolha o que quer renderizar no pop-up Render Elements… O mínimo ? Specular, reflection, z-depth e Material ID.

6 – Não exagere nos níveis de transparência/reflexão

2 ou 3 no máximo. (Render Options -> Global Switches)

7 – Sempre salve o seu Irradiance Map

Simplesmente acelera o seu render. Se você não vai mais ficar modificando a iluminação, o ganho é significativo.

8 – Não use muitos light bounces

Óbvio, mas render settings é uma área onde as pessoas costumam pensar no ‘mais é melhor’ e meter lá em cima as configurações. O primeiro já é o suficiente para a maior parte dos casos.

9 – Use Light Cache

Sempre marque Use Light Cache for Glossy Rays… Isso diminui muito o tempo se você tem muitas reflexões glossy.

10 – Preste atenção no tamanho das suas texturas

 Se você fez download de uma textura de madeira de 3k e a usa num objeto pequeno no fundo da imagem, você pesa seu render desnecessariamente. Seja esperto e redimensione o tamanho das suas texturas de acordo com a distância da câmera e tamanho do objeto.

11 – Render Setup

Se está usando Indirect Illumination como método, vá de Irradiance Map + Light Cache. Para AA, Adaptive DMC funciona bem na maior parte dos casos. Se sua cena está do lado extremo dos detalhes e reflexões borradas, Fixed pode ser interessante.

Sempre marque Show Calc. Phase, isso te permitirá ver o mapa enquanto está sendo calculado e após algum tempo você já terá uma noção da iluminação da cena antes mesmo dela ser finalizada, te permitindo abortar se necessário e economizando tempo.

12 – Ajuste o limite de memória

Por padrão, o V-Ray é conservador. Mas lembre-se, você não. Mude o Dynamic Memory Limit para mais ou menos metade da sua memória RAM e seja feliz.