;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Heróis e monstros na vida "real": entenda a tecnologia dos efeitos visuais

Thanos empunha a Manopla do Infinito com as Joias do Poder e do Espaço no trailer de "Vingadores: Guerra Infinita" - Reprodução
Thanos empunha a Manopla do Infinito com as Joias do Poder e do Espaço no trailer de "Vingadores: Guerra Infinita" Imagem: Reprodução

Márcio Padrão

Do UOL, em São Paulo

20/12/2018 04h00

Georges Méliès, pioneiro dos efeitos especiais no cinema, usava no início do século 20 truques que até uma criança é capaz de fazer hoje no celular, como o desaparecimento e reaparecimento de pessoas por meio do corte em um enquadramento fixo. De "Viagem à Lua" para cá, foram mais de 100 anos de evolução que permitem hoje, entre outras coisas, vermos o roxo supervilão alien Thanos destruindo os Vingadores com uma manopla de poder infinito.

As três principais formas de efeitos em um filme são: os físicos ou mecânicos, realizados durante as filmagens com meios práticos, como pirotecnia, chuva artificial e adereços especiais; os sonoros, por meio de uma biblioteca de sons e mixagem; e os visuais, que lidam com equipamento ótico e/ou computação gráfica na pós-produção do filme.

Os primeiros setenta anos do cinema comercial foram dominados pelos efeitos físicos e sonoros. A partir de filmes como "Westworld" (1973) e "Star Wars" (1977) o computador entrou em cena para criar efeitos visuais digitalmente. Nos anos 1990 e 2000, o efeito 3D digital se tornou predominante, tendo as animações da Pixar e os novos "Star Wars" (a partir de 1999) como expoentes disso.

Como este é um universo bastante vasto, focaremos o meio mais usado para obter efeitos visuais: o CGI, sigla em inglês para "imagens geradas por computador". Por meio dele, podemos criar cenários, objetos e seres vivos, e mesmo coisas que desafiam as leis da física. Não é por acaso que seu uso é tão popular no cinema atual.

As paisagens tridimensionais, por exemplo, podem ser criadas usando o comportamento matemático chamado fractal --uma repetição sistemática de padrões geométricos que criam visuais complexos. Pode começar por um simples triângulo, que é dividido em quatro triângulos com o método de malha triangular, que desloca o ponto médio de cada lado do triângulo. O computador repete o processo milhares de vezes, o que permite criar superfícies irregulares em três dimensões.

O GIF abaixo mostra bem isso. De um mero triângulo, conseguiu-se modelar uma montanha inteira.

Um método comum para criar objetos em 3D é a modelagem, como a do popular programa AutoCAD, usado por arquitetos e engenheiros. Consiste em combinar modelos 3D partir de vértices geométricos, faces e arestas em um sistema de coordenadas 3D, esculpindo tudo digitalmente como se fosse barro ou gesso.

Para texturas e movimentos mais complexos é adotado um recurso chamado função de textura bidirecional (BTF, em inglês), que descreve a textura da imagem conforme ela varia com a visualização e a direção da iluminação. Muitas superfícies do mundo real, como pele, cabelos e cascalho, exibem detalhes geométricos de superfície em escala fina.

Assim, as variações na aparência com a visualização e a direção da iluminação podem ser bastante complexas devido à profundidade e sombreamento do local, e as texturas devem considerar esses efeitos.

Para criar figuras animadas, geralmente o programa começa com um esqueleto ou uma figura básica --como um bonequinho de pauzinhos-- em três dimensões, e depois são aplicadas as cores, texturas e a renderização, que elimina as arestas e conclui o trabalho de digitalização.

O movimento dos seres digitais pode ser feito com o animador humano manipulando manualmente diversas variáveis de animação chamadas Avars. Ou com a captura de movimentos de um ator, com aquelas roupas especiais, diversas câmeras e pontos marcados no corpo, para o personagem digital reproduzir o movimento na íntegra. Esse último é o caso de Thanos, que teve por trás a voz e os movimentos do ator Josh Brolin.

Kelly Port, supervisor de efeitos visuais de "Vingadores: Guerra Infinita", veio ao Brasil no começo de dezembro para o evento VFX Rio, e explicou ao UOL Tecnologia algumas coisas sobre seu trabalho.

Havia 14 estúdios diferentes de efeitos visuais envolvidos na produção [de 'Guerra Infinita'], com mais de 2.400 artistas de efeitos visuais e equipes de gerenciamento sendo creditados no filme. Houve 2.703 tomadas únicas no filme, das quais 2.623 foram de efeitos visuais. Então, 97% do filme foi tocado de alguma forma pelos efeitos visuais.

Ele disse que foram criados 473 objetos e pessoas exclusivamente para o filme. Mas Thanos teve um detalhe inédito para sua criação: aprendizado de máquina.

Em última análise, ela foi capaz de capturar todos os detalhes e nuances de sua performance. Isso foi fundamental para o sucesso do personagem

Port

Outros convidados do VFX Rio foram Max Wood, supervisor de efeitos de dois filmes de Harry Potter -- "O Cálice de Fogo" e "O Prisioneiro de Azkaban"; e Uno Oliveira, que assina os efeitos da série "Ilha de Ferro", da Globo.

Wood afirma que uma "grande porcentagem" do total de pessoas trabalhando em um filme está nos efeitos. "Todos os anos, o número de tomadas de efeitos visuais aumenta e o tempo de pós-produção tende a diminuir. Além disso, a complexidade aumenta enormemente. Por causa desses fatores, temos que ter mais e mais artistas para atingir os prazos e tornar os filmes cada vez mais impressionantes", diz.

Uno Oliveira diz que a Globo já usa os mesmos softwares do cinema do exterior. Mas o principal problema desse mercado no Brasil, diz ele, é a falta de profissionais qualificados.

"Precisamos capacitar muita gente. Mas vejo que o cenário está melhorando a cada ano. Um movimento bem importante que vem acontecendo são os eventos de computação gráfica, como o VFX Rio, e uma das coisas mais interessantes é ter em uma sala todos os profissionais, de várias produtoras e emissoras, trocando ideias e vendo coisas novas".