Escolar Documentos
Profissional Documentos
Cultura Documentos
Organizadores
Marsal Branco (Universidade Feevale)
Silvano Malfatti (Univ. do Tocantins)
Marcus Vinicius Lamar (UnB)
Revisão Textual
Dos autores.
CDU 794:004
© Editora Feevale – Os textos assinados, tanto no que diz respeito à linguagem como ao conteúdo, são de inteira responsabilidade dos autores
e não expressam, necessariamente, a opinião da Universidade Feevale. É permitido citar parte dos textos sem autorização prévia, desde que
seja identificada a fonte. A violação dos direitos do autor (Lei n.° 9.610/98) é crime estabelecido pelo artigo 184 do Código Penal.
Universidade Feevale
Campus I: Av. Dr. Maurício Cardoso, 510 – CEP 93510-250 – Hamburgo Velho – Novo Hamburgo – RS
Campus II: ERS 239, 2755 – CEP 93352-000 – Vila Nova – Novo Hamburgo – RS
Fone: (51) 3586.8800 – Homepage: www.feevale.br
Jogos Eletrônicos na Prática Livro de Tutoriais do SBGames 2012 4
O Brasil da Tecnologia:
Uma Visão da Intel
Qual é a imagem que o mundo tem do Brasil? O mundo conhece a tecnologia que
se desenvolve aqui? Para tentar responder a estas perguntas resolvi pesquisar na Internet,
e como qualquer outra pessoa interessada em ver o Brasil pelo mundo “online” eu
simplesmente digitei “Brasil” e <enter>, o que eu recebi foi uma coleção infinita de belas
imagens de nossas paisagens, pontos turísticos, do povo bonito e claro, do futebol... mas de
tecnologia não se vê quase nada... O que leva a crer, para os leigos, que o Brasil consome
sim muita tecnologia, mas pouco se produz aqui. O que é um engano.
O Brasil produz sim, muita tecnologia local, nas mais diversas áreas – da televisão
digital à aviação, passando pelas urnas eletrônicas, tecnologias embarcadas, automação
comercial e bancária, extração de petróleo, entretenimento e muitas outras áreas em que o
país se destaca e é referência mundial. O que todas estas áreas têm em comum? O uso de
Software que também em muitos casos se desenvolve aqui.
O Brasil já é uma potência em desenvolvimento de software, contando hoje com
aproximadamente 350 mil profissionais da área de desenvolvimento. E as previsões indicam
que em 2015 o país já terá mais de 500 mil profissionais e será o sexto maior país em número
de desenvolvedores de software no mundo (fonte: Evans Data Corp).
Impressionante? Sim. Por acaso? Não. Isto se deve à união da indústria, sociedade
e governo que abraçaram juntos o desafio de desenvolver aqui mesmo as soluções para
nossos problemas. Alguns podem até dizer que o período da reserva de mercado da década
de ’80 foi o grande responsável por deflagrar o “Brasil tecnológico”, talvez tenha sido em
parte um catalisador importante, mas na verdade a reserva acabou há mais de 20 anos e o
Brasil continua trilhando seu próprio caminho e liderando em diversas áreas.
E o futuro? O futuro é o da criatividade e inovação, como mostra este livro. Da mesma
maneira que o brasileiro cria conteúdo de entretenimento consumido no mundo todo e dá
dribles desconcertantes no futebol, também é capaz de criar software e serviços inovadores.
Nós da Intel apostamos nisso, estamos no Brasil há mais de 25 anos, e neste período
participamos ativamente do desenvolvimento das indústrias de hardware e software
nacionais, tanto apoiando-a comercialmente como estabelecendo acordos de colaboração
6120496e74656c206163726564697461206e6f2042726173696c2c2071
75652076656e68616d206f73207072f378696d6f7320323520616e6f732121
Nuno Simões
Intel – Diretor de Iniciativas de Software
Brasil
Introdução ao Unity...............................................................................53
Jay Clei Garcia dos Santos
Abstract
Since the dawn of the digital games there is a desire to replicate situations that make us
somehow part of a context and closer to reality. The importance of artificial intelligence
is at the convergence of this longing in simulating increasingly challenging realities. The
techniques of artificial intelligence for games in general are part of a trend that argues that
the role of IA is to simulate the behavior near human and not like other environments eg
optimization objectives, seek to achieve levels of decision making and speed of reasoning
very above an ordinary human being. Artificial intelligence in games is beginning to maximize
the fun emulating a smart player just right, neither too smart nor too dumb demonstrating
weaknesses purposeful. The purpose of this article is to demonstrate some techniques used
in some classic and current games showing their uses and problems.
1 Introdução
Desde os primórdios dos jogos digitais existe a vontade de replicar situações que
nos façam de certa forma fazer parte de um contexto.Quanto mais próximo da realidade
1 Department of Computer and Digital Systems Engineering, Escola Politécnica da Universidade de São
Paulo, Brazil.
2 Department of Computer and Digital Systems Engineering, Escola Politécnica da Universidade de São
Paulo, Brazil.
2 Histórico
No princípio, a inteligência artificial nos jogos tinha o papel de alimentar máquinas
caça níquel com o objetivo de manter o jogador por horas e horas entretido e gastando
dinheiro. Jogos como Pong e Pac-Man utilizavam listas pré determinadas de ações e
algumas poucas tomadas de decisão aleatórias na tentativa de tornar os jogos um pouco
mais interessantes. Com o tempo, jogos começaram a utilizar técnicas um pouco mais
avançadas, mas ainda assim incipientes. Entretanto na década de 80 e 90 houve uma grande
reviravolta com jogos preocupando-se com o papel da inteligência artificial em títulos como
Age of Empires II e Warcraft II. Em 1998 a Valve revoluciona com HalfLife e um incrível
avanço nos jogos em primeira pessoa. Em 2000 jogos como The Sims, totalmente focados
na experiência do jogador com a inteligência artificial em jogos que aprendiam com os
jogadores, também contribuiram para a evolução do mercado. A grande realidade é que a
inteligência artificial começou a tomar corpo nos jogos quando as empresas começaram a
levá-la a sério como realmente uma área de desenvolvimento que deve entrar no processo
e não encarada como um adicional no jogo que em geral poderia ser desenvolvido no
último quarto de tempo do projeto, o que acabava por gerar comportamentos previsíveis
e jogos nem tão desafiadores quanto poderiam ser. A visão atual da inteligência artificial é
a de que ela seja totalmente direcionada a contribuir com o gamedesign de tal forma que
facilite as modificações de acordo com a concepção do jogo, podendo traduzir sentimentos
e sensações de forma a tornar a imersão dos jogos muito maior, e não mais encarar as
técnicas de inteligência artificial como uma ferramenta para simplemente melhorar a
experiência do usuário.
3 Motivação
A evolução das técnicas utilizadas em jogos eletrônicos é evidente nos últimos anos,
tornando a experiência muito mais imersiva e trazendo jogos cada vez melhores.É de suma
importância conhecer o estado da arte atual para aplicar tais recursos.
4 Técnicas básicas
A classificação quanto às técnicas clássicas e técnicas atuais aqui empregada foi feita
pensando na utilização das mesmas e não por questões temporais como as mais antigas ou
mais recentes.
4.1 Agentes
Agentes são entidades capazes de perceber o ambiente através de sensores e modificá-
lo através de atuadores. O nível de percepção e o raio de atuação dos mesmos determina
diretamente a qualidade da nossa abstração do agente. A maneira como o conhecimento
de um novo acontecimento no mundo é transmitido entre outros agentes pode determinar
uma reação justa ou não por parte dos agentes que não participaram de fato do evento. Um
exemplo clássico desse problema é demonstrada em um jogo de tiro, quando o personagem
principal é avistado por um inimigo e imediatamente todos os outros sabem sobre a sua
localização sem um prévio aviso.
4.1.1 Percepção
Como explicitado no tópico anterior, a modelagem da percepção que o agente faz
do cenário dita em muito a qualidade da inteligência artificial. Uma abordagem é colocar
sensores representando os cinco sentidos. Os mais comuns em ordem de usabilidade são
visão e audição, mas podemos ter representações de olfato ou tomadas de sensação de
temperatura dando uma maior relevância para as informações de cena, auxiliando na
decisão dos agentes. Outra abordagem colocando em evidência a percepção de cena como
um todo e não a percepção micro de um só agente são os blackboards, que tem por objetivo
compartilhar informações de acontecimentos em uma base comum de tal forma que todos
os agentes tenham conhecimento. Essa abordagem é a mais utilizada, porém é preciso tomar
cuidado para não tornar injusta a reação dos agentes.
Máquinas de estado são úteis em todos os tipos de jogos por facilitarem a organização
de informação em momentos e servir como controle de tomada de decisão.
4.3 Navegação
Os algoritmos de busca de caminho são a implantação de inteligência artificial mais
utilizadas em jogos eletrônicos, tendo soluções das mais rudimentares às mais avançadas e
em essência podem ser divididos em:
• busca cega: é a busca em que o agente não tem conhecimento do cenário tendo
apenas como indicador do caminho a seguir os sensores e uma função objetivo que dita o
quão bom é tomar o próximo passo
• busca informada: o agente de alguma forma tem informação do ambiente em que
se encontra, podendo formular uma solução, conectando o ponto de origem ao ponto
de destino de forma mais acertiva, em geral são soluções mais elegantes, nos dando a
impressão de um movimento mais fluido. Devemos entretanto nos preocupar em dosar o
conhecimento dos personagens para não acabarmos com a naturalidade de uma busca por
caminho que um ser humano comum precisa fazer para ir de um ponto A a um ponto B.
Os algoritmos de navegação, por serem um grande objeto de estudo da robótica,
são uma área muito desenvolvida e geralmente subdividida em um nível mais alto de
abstração em busca de caminho (pathfinding) e fuga de obstáculos (obstacle avoidance).
Nos jogos atuais essa diferença foi desaparecendo gradativamente, visto que raramente
encontramos situações em que no meio de nosso caminho não existam outros agentes ou
mesmo obstáculos móveis.
4.3.1 A star
É uma busca do tipo informada, ou seja, o agente tem conhecimento do cenário em
que se encontra. Tem como algoritmo geral a Busca pela Melhor Escolha (best-first-search).
De posse de uma árvore de possibilidades do próximo passo a tomar, ou próximo nó a
escolher. A grande diferença do A star para as outras implementações de best-first-search é
que além de levar em conta o melhor próximo nó também leva em consideração a distância
já percorrida na equação, não somente o custo da expansão do nó atual.
4.3.2 WayPoints
Uma abordagem um pouco mais refinada para a busca de caminho é o uso de
WayPoints [~blog 2008], muito famosos em jogos como Counter Strike.
ainda são muito utilizados em jogos eletrônicos e muitas vezes se mostram suficientes para
resolver o problema da navegação, mas em situações um pouco mais complexas e querendo
representar a movimentação de forma mais fluida ela se torna inviável.
usam massivamente o aprendizado por reforço durante o jogo, retirando feedbacks dos
jogadores na tentativa de compreender os seus desejos.
Jogos sociais como The Sims também utilizam aprendizado por reforço em tempo
real para compreender o modo como o jogador gostaria que o seu avatar se comporte.
5 Técnicas atuais
Inicialmente o agente deve ser modelado como uma tabela de características e flags que
serão modificados e consultados durante cada ciclo de passada pela árvore, formando a base
de conhecimento do agente. Tal tabela deve ser feita com o mínimo possível de informações
para facilitar a depuração. A cada ciclo, rodamos a base de conhecimento de cada agente na
árvore, fazendo testes condicionais com o objetivo de atingir uma folha da árvore e executar
uma ação. As ações usualmente são pedaços de código que serão executados caso a folha
seja atingida na passagem da árvore executando uma busca em largura. Uma característica da
behavior tree é a fácil adição de novos comportamentos mesmo em tempo real, simplesmente
anexando uma folha a algum nó. Cada nó é composto basicamente por uma condição,
uma lista de filhos e uma ação, podendo a lista e a ação serem nulas. Podemos adicionar
táticas de grupos por exemplo simplesmente adicionando ao nó uma quantidade máxima
de participantes além da sua condição. Atualmente utilizado em jogos como Halo 2, Halo 3,
Crysis, Left 4 Dead e vários outros títulos.
5.2 Navegação
Os jogos atuais tem abordagens com resultados mais fluidos do que os apresentados
na seção anterior, conferindo ao movimento mais naturalidade e possibilitando uma melhor
manipulação do mundo, facilitando a criação e modificação.
campos elétricos, cada comportamento não passa de um vetor a mais, somado ao movimento
do agente. A utilização isolada entretanto pode causar problemas muito sérios, como por
exemplo o personagem ficar preso em quinas ou devido ao mal calibramento dos campos,
um objeto não conseguir chegar ao seu objetivo. Uma forma de corrigir tal problema é
com uma abordagem híbrida com A star, criando previamente um caminho entre origem
e destino, e com um comportamento StayOnPath garantir que o caminho traçado teria os
pontos bons do A star, a garantia de convergência, e do Steering Behavior, movimentação
fluida e com adição de comportamentos.
Como temos uma densidade de informação bem maior, podemos ter uma interpolação
entre pontos muito mais suave, e reações para desviar de obstáculos moveis que não tinham
sido previstos no advento da criação da cena, por exemplo. Ao invés de representar o mapa
como um grafo de pontos conectados, utilizamos como um grafo de polígonos convexos.
Navigation Mesh são muito utilizados ultimamente por exemplo em jogos como: Halo 2, Halo
3, First Encounter Assault Recon (F.E.A.R.), Counter-Strike: Source, Metroid Prime, Metroid
Prime 2: Echoes, Metroid Prime 3: Corruption, Jak and Daxter: The Precursor Legacy, Jak II,
Jak 3, Uncharted: Drake’s Fortune, Scarface: The World is Yours e muitos outros.
A criação dos planos é feita por uma busca em um grafo de ações em geral utilizando
A star, considerando os nós como os estados e as arestas como ações. As vantagens sobre
a solução clássica de tomada de decisão das maquinas de estado é que a princípio não
é necessário determinar previamente todas as conexões que levam até as metas sendo
que a única coisa que temos que especificar são pré-condições e efeitos para cada ação.
Devido à flexibilidade e a facilidade de depuração e criação dos planos esta técnica, apesar
de considerada nova, está tomando força frente aos novos jogos utilizada em jogos como
F.E.A.R.(X360/PS3/PC), Condemned:Criminal Origins (X360/PC), S.T.A.L.K.E.R.: Shadow
of Chernobyl (PC), Mushroom Men: The Spore Wars(Wii), Ghostbusters(Wii), Silent Hill:
Homecoming ( X360/PS3), Fallout 3 ( X360/PS3/PC), Empire: Total War (PC), F.E.A.R. 2: Project
Origin (X360/PS3/PC), Demigod (PC), Just Cause 2 (PC/X360,PS3), Transformers: War for
Cybertron (PC/X360/PS3), Trapped Dead (PC), Deus Ex: Human Revolution (PC/X360/PS3).
6 Tendências
A evolução da inteligência artificial tem de estar sempre junto com a evolução da
qualidade gráfica dos jogos, do contrário todo o esforço em computação gráfica será em
vão, obtendo jogos frustrantes. A simulação de eventos ou comportamentos tem de ser cada
vez mais verossímil. Por isso existem desenvolvimentos de ferramentas de teste e calibração
dos algoritmos de forma mais intuitiva para que o designer possa modificar os dados sem
a ajuda de um programador. Com a migração de parte do processamento da inteligência
artificial para as placas de vídeo, o poder computacional empregado crescerá bastante,
sendo possível por exemplo o desenvolvimento de simulação de multidão mais realista e
cut scenes interativas eliminando os cinematics pré renderizados. Uma forte tendência é
aumentar o poder das IAs online, podendo evoluir o aprendizado de redes neurais a partir
de informações dos jogadores.
7 IA na GPU
Devido ao crescente papel da inteligência artificial nos jogos eletrônicos o percentual
ocupado de cada ciclo de atualização começou a tornar-se significativo, influenciando
no tempo de renderização, simulação física ou gameplay. Como não podemos reduzir a
qualidade das simulações físicas ou diminuir a qualidade visual do jogo, a única solução
era utilizar o tempo ocioso da placa de video enquanto não estivesse renderizando para
fazer cálculos para IA. É fato que ainda são poucas as implementações que se utilizam de tal
benefício, mas a tendência é a de cada vez mais migrar para a GPU, visto que a mesma possui
poder de processamento muito superior ao da CPU para cálculos vetoriais ou repetitivos.
References
[~blog 2008] ai blog, 2008. Why waypoints aren’t for pathfinding, 7.
[and Mcglinchey] Charles, D., and Mcglinchey, S. The past, present and future of
artificial neural networks in digital games.
[2006] Orkin, J. 2006. Three states and a plan: The a.i. of f.e.a.r. GDC.
Resumo
O sucesso que os jogos eletrônicos, ou games, vêm fazendo em todas as faixas etárias é
inegável e grande parte deste sucesso só pode ser explicado analisando certos aspectos
do game relacionados com sua habilidade de manter o jogador o maior tempo possível
interessado. Para entender o que cativa um jogador é importante descobrir suas motivações
e de que formas os games trabalham seus desejos e geram novas motivações. Estudos
demonstram que é possível a utilização de técnicas de engajamento idealizadas para incutir
no jogador emoções e sentimentos, conforme o seu perfil, para garantir seu interesse no game,
aumentando o tempo dedicado ao mesmo. Este tutorial apresenta alguns cases de softwares
de setores considerados tradicionais que utilizaram tais técnicas e assim se beneficiaram de
um processo de gameficação, o qual pode ser definido como o uso das mecânicas de game
em aplicativos e software. A ideia é encorajar os usuários a adotar comportamentos desejáveis
por meio de técnicas que tiram vantagem das características psicológicas humanas. Mas vale
a pena ressaltar que a gameficação pode auxiliar em muito o setor tradicional de software,
mas não se deve esperar que a ela seja a solução mágica para qualquer coisa. Ou seja, estas
técnicas podem agir como ferramentas complementares, mas não oferece vantagem se o
serviço/atividade onde estão sendo implementados, não ofereçam a sensação de realização.
Palavras-chaves: Games. Motivação. Perfil do jogador. Técnicas de engajamento.
Introdução
O sucesso que os jogos eletrônicos, ou games, vêm fazendo em todas as faixas etárias
é inegável. Segundo a consultoria online (Newzoo, 2011), há nos Estados Unidos 145
milhões de jogadores (43% da população), os quais passaram 215 milhões de horas jogando
videogame por dia.
Grande parte deste sucesso só pode ser explicado analisando certos aspectos do game
relacionados com sua habilidade de manter o jogador o maior tempo possível interessado.
Deste modo, a primeira seção deste tutorial se dedicará a apresentar conceitos
teóricos que auxiliarão na contextualização da base dos estudos. Em especial alguns aspectos
psicológicos, como a motivação.
A segunda seção do tutorial apresenta a motivação no contexto apresentado pela
indústria de games, por meio de seus desenvolvedores. Pois como diz Ghozland (2010), a
importância do game está relacionada com a capacidade do mesmo em gerar e manter o
interesse dos jogadores, sendo a motivação o fator que define o tempo que este jogador se
manterá jogando, alguns minutos ou várias horas.
A terceira seção dedica-se demonstrar um resumo das diversas técnicas de
engajamento e alguns exemplos de games que as utilizaram, bem como uma proposta dos
melhores usos de cada técnica, tendo em vista o perfil do jogador.
Para finalizar é feito um levantamento na quarta seção sobre como as técnicas
identificadas anteriormente estão sendo implementadas por softwares tradicionais, por
meio da gameficação.
Conceituação Teórica
Antes do estudo dos cases esta seção se dedica a apresentar alguns conceitos básicos
no que se refere aos aspectos psicológicos deste tema.
Os primeiros conceitos são aqueles relacionados a dimensão subjetiva, a qual pode
ser reconhecida também em produções para games por meio de representações sociais,
identidade social, ideologia, valores, rituais, hábitos, costumes, leis e regras. A subjetividade
cria produtos coletivos, nos quais se percebe a participação de sujeitos. (Gonçalves & Bock
2009)
O psiquismo é uma chave para entender esta subjetividade, sendo suas principais
categorias: atividade, consciência, identidade e afetividade. Tais categorias permitem pensar
a realidade psíquica em seu movimento de transformação e nas relações que se estabelecem
para a produção do que é chamado subjetividade. (Gonçalves & Bock 2009)
Motivação do Jogador
Para entender o que cativa um jogador é importante descobrir suas motivações e de
que formas os games trabalham seus desejos e geram novas necessidades. O santo graal da
“A importância da experiência de um jogo depende de quanto interesse ele pode gerar. Criar
e manter o interesse dos jogadores é a maneira de gerir a sua motivação. Sua motivação é
o fator que irá determinar se um jogador vai continuar a jogar depois de alguns minutos,
bem como quanto tempo ele vai jogar e se ele vai terminar o jogo.”
Os realizadores são motivados por fazer o que o game lhes pede (missões, quests,
etc.) e em agir sobre o mundo virtual. O ambiente do game é um mundo pleno e ele pode
mergulhar da maneira que achar mais atraente. O compartilhamento deste mundo com
outros jogadores normalmente apenas adiciona um pouco de autenticidade à imersão e,
talvez, um elemento competitivo. Realizadores se orgulham de seu status formal na hierarquia
do game e do pouco tempo que eles levaram para alcançá-lo.
Já os exploradores estão interessados em serem surpreendidos pelo game, ou seja,
em interagir com o mundo criado e descobrir seus segredos. É o sentimento de admiração
que os motivam a seguir em frente. Outros jogadores adicionam profundidade ao game,
mas eles não são componentes essenciais para sua permanência, exceto, talvez, como
meios de acesso a novas áreas. Exploradores se orgulham de seu conhecimento dos pontos
mais delicados do game e gostam de se considerarem “gurus” para os jogadores menos
experientes.
Técnicas de Engajamento
Com base no exposto, é possível a utilização de determinadas técnicas para incutir no
jogador emoções e sentimentos, conforme o seu perfil, para garantir seu interesse no game,
aumentando o tempo dedicado ao mesmo.
Estas técnicas de engajamento são recursos de game design utilizados para motivar
e manter um jogador interessado no game. Existem várias técnicas que vêm sendo usadas
nos mundos dos games a bastante tempo, mas foi a partir do sucesso dos games para redes
sociais que mais pesquisas foram feitas.
Essa popularização fez com que fossem criadas pequenas “receitas de bolo” que
podem ser utilizadas nos mais diversos games ou aplicativos. A seguir são apresentadas
algumas destas técnicas.
Achievements ou Badges são pequenos prêmios virtuais na forma de bottons ou
insígnias, esses prêmios são oferecidos aos jogadores depois de realizarem alguma tarefa ou
obterem alguma conquista. Segundo Zichermann e Cunningham (2011), badges são uma
excelente maneira de incentivar a promoção social de produtos e serviços relacionados ao
game. Badges também marcam a conclusão das metas e o progresso constante dentro do
sistema do game.
Desafios e Missões são técnicas muito utilizadas para manter o jogador ocupado ou
evitar a sensação de fim do game. Além disso, essas técnicas fazem com que o jogador siga um
caminho no mundo virtual condizente ao planejado pelo game designer. Algumas pessoas
entram no game sem a menor ideia de seus objetivos ou fundamentos, assim, mesmo se
um desafio não está no centro da experiência do game, utilizar desafios é uma opção para
adicionar profundidade e significado para o jogador. (Zichermann & Cunningham 2011)
Figura 4 - No Game CityVille quests são uma forma do game designer orientar
o jogador na forma deste interagir com o mundo criado
Figura 7 - Opções de presentear amigos se tornou rapidamente item obrigatório de qualquer jogo
em redes sociais, como é o caso do game FrontierVille
Como base no exposto, a tabela a seguir apresenta uma proposta dos autores do
melhor uso de técnicas de engajamento, tendo em vista o perfil do jogador e os aspectos
subjetivos envolvidos.
Características
Técnicas de Engajamento Perfil do Jogador
Reforçadas
Motivação intrínseca,
Desafios e auto-confiança,
Realizadores, Exploradores
Missões desafio, feedback, metas,
escapismo, compulsão.
Autonomia, auto-confiança,
Rankings e Leader Boards desafio, metas, interação Predadores, Socializadores
social.
Motivação intrínseca,
Progress Bar auto-confiança, desafios, Todos
feedback, metas, compulsão.
Cases
A presente seção apresenta alguns cases de softwares de setores considerados
tradicionais que utilizaram técnicas de engajamento e assim se beneficiaram de um
processo de gameficação.
Gameficação é o uso das mecânicas de game em aplicativos e softwares. A ideia é
encorajar os usuários a adotar comportamentos desejáveis por meio de técnicas que tiram
vantagem das características psicológicas humanas. Essas técnicas encorajam o usuário
a realizar tarefas consideradas normalmente entediantes como completar uma pesquisa,
comprar algo, ou manter um cadastro atualizado.
O Foursquare, por exemplo, é um serviço baseado em localização com mais de
20 milhões de usuários em sua plataforma. O serviço foi construído em torno de técnicas
de engajamento. Os usuários podem reclamar de prefeituras, destravar os badges, receber
ofertas especiais e recompensas, tais como descontos, e disputar contra amigos por meio
de um ranking.
Utilizando as técnicas de engajamento o Foursquare cria e mantém uma base de
dados da localização de locais e construções de interesse das pessoas. Pessoas que acabam
buscando no Foursquare informações mais detalhadas sobre esses lugares. Com essa
estratégia o Fousquare construiu essa base de dados com um custo infinitamente menor
ao de outras empresas que construíram através de suas próprias forças.
Apesar da falta de estudos científicos, outra área que parece se beneficiar do potencial
das técnicas aqui apresentadas são as soluções para ERP e CRM. Entendendo este potencial,
a Salesforce.com permitiu que terceiros desenvolvessem soluções que se integrasse ao seu
CRM com utilização de leaderboards e badges, como demonstrado na figura 9.
Referências
Anderson et al., 2004. Continental Airlines Flies High with Real-time Business Intelligence
Continental Airlines Flies High with Real-time Business Intelligence Introduction. MIS
Quarterly Executive 3, (4), pp.163 – 176.
Bartle, R., 1996. Heart , Clubs , Diamond , Spades: players who suit muds. The Journal
of Virtual Environments, 1(1). Available at: http://www.mud.co.uk/richard/hcds.htm
[Accessed February 9, 2012].
Clark, D., 2007. Games , motivation & learning, Sunderland, UK. Available at: www.
caspianlearning.co.uk.
Cooper, B.L. et al., 2000. Data Warehousing Supports Corporate Strategy at First American
Corporation. MIS Quarterly, 24(4), pp.547–567.
Cooper, S. et al., 2010. Fold it. Available at: http://fold.it/portal/about [Accessed June 12,
2012].
Coren, M.J., 2011. Foldit Gamers Solve Riddle of HIV Enzyme within 3 Weeks. Scientific
American, p.1.
Ghozland, D., 2010. Designing for Motivation. Gamasutra, pp.1–9. Available at: http://
www.gamasutra.com/view/feature/1419/designing_for_motivation.ph p.
Gonçalves, M. da G.M. & Bock, A.M.B., 2009. A dimensão subjetiva dos fenômenos sociais.
In M. da G. M. Gonçalves & A. M. B. Bock, eds. A dimensão subjetiva da Realidade -
Uma leitura sócio-histórica. São Paulo: Cortez Editora, p. 160.
Hajji, A. et al., 2012. Dynamic pricing models for ERP systems under network externality.
International Journal of Production Economics, 135(2), pp.708–715. Available at:
http://linkinghub.elsevier.com/retrieve /pii/S0925527311004348 [Accessed August 5, 2012].
Polat, K. & Durduran, S.S., 2011. Subtractive clustering attribute weighting (SCAW) to
discriminate the traffic accidents on Konya– Afyonkarahisar highway in Turkey with the
help of GIS: A case study. Advances in Engineering Software, 42(7), pp.491–500.
Available at: http://linkinghub.elsevier.com/retrieve /pii/S0965997811000573 [Accessed
August 5, 2012].
Ramakrishnan, T., Jones, M.C. & Sidorova, A., 2012. Factors influencing business
intelligence (BI) data collection strategies: An empirical investigation. Decision Support
Systems, 52(2), pp.486–496. Available at: http://linkinghub.elsevier.com/retrieve /pii/
S0167923611001722 [Accessed July 25, 2012].
Wybo, M., Robert, J. & Léger, P.-M., 2009. Using search theory to determine an
applications selection strategy. Information & Management, 46(5), pp.285–293.
Available at: http://linkinghub.elsevier.com/retrieve /pii/S0378720609000597 [Accessed
August 5, 2012].
Introdução ao Desenvolvimento
de Games com GWT e HTML5
Ely Fernando do Prado1
Figura 1: Logotipos do
Google Web Toolkit
e do HTML 5
Resumo
O advento da tecnologia do HTML 5 tem aberto um novo mercado de jogos para
internet, onde os usuários podem interagir com o game através de diferentes equipamentos,
como computadores, tablets e celulares sem a necessidade de instalação prévia da aplicação
ou mesmo algum plug-in. Por outro lado o framework Google Web Toolkit tem se mostrado
uma boa alternativa para desenvolvimento de aplicações ricas para internet, utilizando a
linguagem Java para gerar códigos HTML, CSS e JavaScript. Assim este trabalho tem por
objetivo apresentar o framework GWT como solução para o desenvolvimento de jogos para
1 Departamento de Computação, Universidade Federal de São Carlos (UFSCar), São Carlos, SP; Libertas
Faculdades Integradas, São Sebastião do Paraíso, MG; Universidade de Franca (Unifran), Franca, SP. Authors’
contact: ely.prado@dc.ufscar.br
1. Introdução
Atualmente estamos presenciando um grande crescimento na demanda por jogos
para internet. Outro acontecimento que está em bastante evidencia hoje é o surgimento e
amadurecimento do HTML 5, que tem possibilitado a criação de jogos que rodam direto no
navegador de maneira leve e prática.
A principal motivação para este tutorial é o grande crescimento no mercado de jogos
para internet. O surgimento do HTML 5 permitiu que passássemos a desenvolver aplicações
complexas para internet, sem ter que depender de algum plug-in específico. Além disso,
aplicações desta natureza podem ser executadas em qualquer dispositivo que possua
internet, como computadores, tablets e celulares de qualquer sistema operacional atual.
Um bom exemplo que tem alcançado bastante sucesso entre o público são os jogos
adicionados no logotipo do Google, chamados doodles. Os doodles games são adicionados
ao site de pesquisa do Google em comemoração a alguma data ou evento especial, e são
jogáveis no próprio site.
Graças a grande experiência alcançada pelos engenheiros da Google no setor de
aplicações ricas para internet, foi criado por eles o framework Google Web Toolkit (GWT),
que tem facilitado muito criação de aplicações complexas na web, incluindo os jogos.
O objetivo deste tutorial é apresentar o framework GWT como uma alternativa
para o desenvolvimento de jogos para internet. Para isso será apresentado como se dá o
desenvolvimento de um jogo nesta tecnologia, sendo um jogo com poucas funcionalidades,
porém o suficiente para dar os primeiros passos neste framework.
2. HTML 5
O padrão HTML5 complementa as capacidades das normas existentes no HTML com
vários novos recursos. Embora o HTML5 seja um padrão web de propósito geral, muitos
dos novos recursos são destinados diretamente para tornar a Web um lugar melhor para
aplicações web com estilo desktop.
Dentre os novos recursos estão a capacidade das aplicações executarem em modo
off-line e de armazenar dados localmente no computador ou dispositivo. Um recurso
importante, especialmente quando se trata de desenvolvimento de jogos é o elemento
Canvas, que oferece uma tela de desenho 2D, permitindo o desenho de formas gráficas,
imagens e texto em tempo de execução. Outros recursos disponibilizados pelo HTML5 são
para permitir que arquivos de mídia (áudio e vídeo) sejam executados no navegador sem
necessidade de plug-in externo, também há elementos para carregamento de dados de
forma assíncrona e apoio para eventos de arrastar e soltar. Além dos recursos citados, a
especificação HTML5 define inúmeros outros acréscimos, mas muitas destas especificações,
bem como a especificação do HTML5 em si, estão ainda em definição, de modo que na
versão final os seus detalhes podem variar. (Taivalsaari e Mikkonen, 2011)
Para o desenvolvimento de jogos o HTML por si só não é suficiente. O HTML é uma
linguagem de marcação, que permite incluir elementos em uma página, como campos de
formulário, texto, imagens, canvas, etc. Mas todos esses elementos são estáticos. Para superar
as limitações do HTML podemos utilizar o Javascript, pois a ação toda precisa ser escrita em
uma linguagem de programação. Javascript é uma linguagem de programação poderosa,
com sintaxe baseada em C++, porém com suporte apenas parcial à orientação a objetos.
Javascript é uma linguagem interpretada, sendo assim sua velocidade de execução e sua
compatibilidade depende da máquina interpretadora que o navegador possui. (Nörnberg,
2011)
setCoordinateSpaceHeight(int height)
Argumento:
• height: altura em pixels
Descrição:
• Define a altura do espaço interno do Canvas.
setHeight(String height)
Argumento:
• height: altura do objeto, em unidades de CSS (por exemplo: “10px”, “1em”)
Descrição:
• Define a altura do objeto Canvas na página.
setFocus(boolean focused)
Argumento:
• focused: indica se o objeto receberá o foco ou se perde o foco.
Descrição:
• Indica o objeto como focado ou não focado. Apenas um objeto da página pode ter
o foco por vez, e este é o que receberá todos os eventos de teclado.
setFillStyle(String fillStyleColor)
Argumento:
• fillStyleColor: cor como uma String no formato CssColor.
Descrição:
• Define a cor de preenchimento dos elementos que forem desenhados em seguida.
Descrição:
• Desenha uma imagem previamente carregada.
4. Desenvolvimento de Projeto
Para facilitar a compreensão das ferramentas aqui citadas, será descrito neste capitulo
um guia passo a passo de como se dá o desenvolvimento de um jogo em HTML 5 utilizando
o framework GWT.
<module rename-to="modulo">
Para editar o arquivo XML é necessário clicar na aba “source” na parte inferior do
Eclipse e editar a linha mencionada, que é a terceira linha do código.
Edite também o arquivo index.html localizado na pasta war, para que sua chamada
ao módulo gwt, na sexta linha, fique da seguinte forma:
<script type="text/javascript"
language="javascript"
src="modulo/modulo.nocache.js"></script>
Após essas tarefas podemos executar o aplicativo, porém não será mostrado nada no
navegador ainda, pois teremos que codificar a classe Main.
Ao abrir a aplicação pela primeira vez é solicitada a instalação de um plugin no
navegador. Este plugin é utilizado para depuração do código em tempo de desenvolvimento,
e não será solicitado quando o usuário acessar a aplicação final compilada.
Todo esse processo de configuração do projeto poderia ser simplificado apenas
deixando a opção “Generate project sample code” marcada, porém isso faria com que fosse
gerada uma série de códigos desnecessários para nossa aplicação.
Como o objetivo deste projeto é desenvolver um jogo em HTML 5, sua codificação
deve ser iniciada com o acréscimo de um elemento Canvas e definição de seus parâmetros.
Primeiro deve ser feita uma verificação se o navegador do usuário dá suporte ao elemento
Canvas do HTML 5. Depois devem ser removidas a margem e a barra de rolagem da página.
Por fim são definidos o tamanho e a resolução do elemento Canvas e logo em seguida
adiciona-o na página do usuário, conforme mostrado no quadro 1.
Quadro 2, onde o método “update” ainda não possui nenhuma funcionalidade efetiva e o
método “draw” apenas pinta uma cor de fundo no objeto canvas. O restante do código será
demonstrado nos próximos capítulos.
4.3 Animação
Já que GWT permite a codificação da aplicação na linguagem Java, nada mais justo
que tirar proveito dos recursos da orientação em objetos para desenvolver seu game. Uma boa
metodologia é criar uma classe java para cada tipo funcionalidade, pensando nas técnicas de
reuso que a linguagem disponibiliza.
Desta forma, para criar um objeto retangular que será desenhado no jogo, pode-se
definir atributos encapsulados para determinar sua posição nos eixos horizontal e vertical,
além de declarar um método capaz de fazer a detecção da colisão entre outro retângulo. O
resultado desta Classe Java pode ser visto no Quadro 3.
Desta forma já podemos construir toda a lógica do jogo. Como a ideia é apenas
apresentar a tecnologia, iremos demonstrar o desenvolvimento de um jogo simples, apenas
com as classes Main e Retangulo. Assim a estrutura do jogo deve ficar igual à mostrada na
figura 2.
O escopo do projeto ficará então como sendo um jogo onde o usuário irá controlar
uma plataforma, a qual irá rebater uma bola em movimento. A partir deste exemplo o
desenvolvedor poderá facilmente estender suas funcionalidades para tornar o jogo parecido
com um Pong ou Breakout mostrados na figura 3. Podem ser utilizados gráficos com ótima
qualidade já que as imagens que serão inseridas são no formato PNG, bem diferente do que
se tinha na época em que esses dois jogos citados foram criados.
@Override
public void onModuleLoad() {...
Quadro 4 – Animação
initKeyHandlers();
canvas.setFocus(true);
}
public void initKeyHandlers() {
canvas.addKeyDownHandler(
new KeyDownHandler() {
@Override
public void onKeyDown(KeyDownEvent event)
{
int key = event.getNativeKeyCode();
if (key == 37) {
keyLeft = true;
} else if (key == 39) {
keyRight = true;
}
}
});
canvas.addKeyUpHandler(
new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
int key = event.getNativeKeyCode();
if (key == 37) {
keyLeft = false;
} else if (key == 39) {
keyRight = false;
}
}
});
}
x = x*WIDTH/Window.getClientWid-
th();
base.setX((x-base.getWidth()/2));
}
});
canvas.addTouchMoveHandler(
new TouchMoveHandler() {
@Override
public void onTouchMove(TouchMoveE-
vent event) {
int x = event.getTouches().get(0).
getClientX();
x = x*WIDTH/Window.getClientWid-
th();
base.setX((x-base.getWidth()/2));
}
});
}
public void update() {...
public void draw() {...
}
Quadro 6 – Interação por Mouse e Toque
4.6 Imagens
A última etapa deste tutorial se refere ao uso de imagens no jogo, ao invés de
simplesmente desenhar formas geométricas. É aconselhável que seja usado o formato de
imagens PNG, devido ao seu ótimo algoritmo de compressão.
Desenhe no editor de imagens de sua preferência uma figura para a bola, na largura
de 25px e altura de 25px. Depois desenhe uma figura para a plataforma base com largura de
100px e altura de 25px. Salve ambas figuras na pasta ‘war’ do seu projeto.
Para utilizar as imagens, deverá ser declarado na classe Main, objetos do tipo
ImageElement, os quais terão funcionalidade de carregar as imagens para que sejam
desenhadas no objeto Canvas. O código para tal tarefa pode ser visto no Quadro 7.
context.setFillStyle(cor);
context.fillRect(0, 0, WIDTH, HEI-
GHT);
//desenha bola e base
context.drawImage(imgBase, base.
getX(), base.getY()); context.drawImage(im-
gBola, bola.getX(), bola.getY());
}
}
Quadro 7 – Renderização e imagens
Após a inserção das imagens o jogo fica semelhante ao que está mostrado na Figura
4. Caso queira fazer animações, basta trocar as imagens a cada frame, o que torna o visual
do jogo bem mais agradável. Para isso pode ser utilizada a técnica de sprites. Outra sugestão
interessante é o uso de uma imagem de fundo, que pode ser desenhada da mesma forma
que as imagens da base e da bola.
5. Perspectivas
O objetivo deste tutorial foi apresentar o framework GWT como alternativa para o
desenvolvimento de jogos para internet. Percebemos que este jogo pode ser implementado
com facilidade e que o framework GWT proporciona um bom ambiente de desenvolvimento
e uma boa organização do código.
A partir dos conceitos demonstrados aqui, este jogo pode ser estendido, aumentando
sua complexidade e melhorando sua jogabilidade. Com os recursos proporcionados pela
programação orientação a objetos, pode-se criar uma aplicação com muitas linhas de código,
sem perder a organização do projeto. Estes recursos também proporcionam a utilização de
técnicas de reuso do código, como encapsulamento, herança e outros.
Apesar do HTML 5 ser uma tecnologia recente já é possível desenvolver jogos
com qualidade e a tendência é melhorar ainda mais, tanto na compatibilidade com os
navegadores, quanto na velocidade de renderização proporcionado pelos mesmos.
Ainda poderemos ter alterações no que se refere ao HTML 5 e até mesmo nas técnicas
para desenvolvimento de jogos para internet, já que o consórcio internacional W3C ainda
não homologou oficialmente esta linguagem. Mas o framework GWT tem se adaptado bem
às ultimas mudanças e é de interesse da Google continuar a manter o framework o mais
atualizado possível, continuando a nos proporcionar compatibilidade garantida com os mais
diversos navegadores da internet.
Referências
Smeets, B., Boness U. e Bankras R., 2009. Programando Google Web Toolkit, Rio de
Janeiro: Alta Books, 1a edição.
Dwyer. J., 2008. Pro Web 2.0 Application Development with GWT. New York: Apress.
Taivalsaari, A. e Mikkonen, T., 2011. The Web as an Application Platform: The Saga
Continues. 37th EUROMICRO Conference on Software Engineering and Advanced
Applications.
Introdução ao Unity
Jay Clei Garcia dos Santos1
Resumo
Este tutorial tem como objetivo demonstrar a facilidade de criação de um nível de
jogo em primeira pessoa (First Person Shooter) desde o zero.
Introdução
A Unity é uma ferramenta de desenvolvimento de jogos 2D / 3D multiplataforma que
tem como principais características a facilidade de uso, rápida prototipagem e integração
com ferramentas externas como Maya, 3D Studio, Photoshop, Blender, entre outras.
O objetivo da empresa é democratizar o desenvolvimento de jogos. Sua facilidade
de uso e preço acessível fizeram com que a Unity atingisse mais de 50% de penetração no
mercado de desenvolvimento mobile mundial.
Hoje a Unity conta com 1,5 milhões de usuários registrados no mundo, desde
desenvolvedores amadores fazendo um jogo em seu tempo livre, até grandes empresas
como Electronic Arts, BigPoint e Nintendo.
Conceitos básicos
OBS.: Todos os materiais e conteúdos utilizados neste tutorial podem ser baixados no link
http://tinyurl.com/sbgames-unity.
1 Unity Technologies.
1. Criando o Projeto
Caso você ainda não tenha o Unity instalado em sua máquina, você pode baixá-lo em
http://unity3d.com/unity/download/.
Ao iniciar o Unity clique em File -> New Project defina onde seu projeto vai ser salvo
e na janela “Import the following packages” selecione Character
Controller, Skyboxes e Water (Pro Only) (Fig. 1) e clique em “Create Project”.
OBS.: O package Water (Pro Only) está disponível apenas na versão Pro do Unity. Ao
baixar do site você tem 30 dias de trial da versão Pro. Caso seu trial tenha expirado, utilize
a Water (Basic).
Clique na aba “Game”, arraste ela um pouco para baixo e para a direita para
separarmos ela da janela “Scene” (Fig. 3)
Agora vamos criar o controle de primeira pessoa. Vamos iniciar criando um plano,
que vai servir de chão. Clique em “Game Object -> Create Other > Plane”. Após acrescentar
o plano, clique na tela scene e aumente o zoom (usando o mouse scroll) para deixar o plano
mais próximo para editar. Expanda as pastas “Standard Assets” e “Character Controllers”,
clique e arraste o “First Person Controller” para a janela “Scene” e coloque-o sobre o plano
(Fig. 4).
Clique o botão “Play” na parte central no topo da tela e clique na janela “Game”.
Você agora pode controlar o personagem usando W, S, A e D e espaço para pular. Você
pode notar também que a gravidade já está atuando na cena: Caminhe com o personagem
até além do plano criado e você vai notar que o personagem vai cair. Na janela “Inspector”
se você expandir a opção “Movement” dentro de “Character Motor (Script)” você têm todos
os parâmetros de movimento do personagem, que podem ser configurados diretamente no
editor, sem a necessidade de alterar código-fonte (Fig. 5).
Vamos agora criar duas plataformas. Clique em “Game Object -> Create Other ->
Cube”. O Cubo vai ser criado aproximadamente na mesma posição que o personagem. Na
tela “Scene” clique na seta vermelha e arraste o cubo para o lado. Quando a tela “Scene”
está com esta funcionalidade ativada você pode mover objetos através da cena. Clique
também na seta verde e arraste um pouco o cubo para cima.
No canto superior esquerdo da tela existem quatro botões com as funcionalidades da
tela “Scene”, da esquerda para a direita:
• Primeiro Botão (mão): Arrasta a cena inteira para facilitar a visualização.
• Segundo Botão (tooltip: move the selected objects): Move o objeto dentro da
cena.
• Terceiro Botão (tooltip: rotate the selected objects): Rotaciona o objeto na cena.
• Quarto Botão (tooltip: scale the selected objects): Altera o tamanho do objeto
na cena.
Porém os objetos continuam apenas brancos, o próximo passo é adicionar uma textura
aos nossos pisos. Clique com o botão direito na janela “Project”, selecione “Create -> Folder”
e crie uma pasta “Textures”. A criação de pastas não é necessária mas é recomendada para
a organização do projeto.
Arraste o arquivo “Sand.psd” para dentro da pasta “Textures”, uma vez feito isso arraste o
“Sand.psd” de dentro da pasta “Textures” para cima do plano (Fig. 9).
No Unity você também pode trabalhar com texturas procedurais. Primeiro crie um
novo cubo (como já feito anteriormente) e altere as dimensões e posição para que ele fique
como um muro saindo do chão de areia. Arraste o arquivo “bricks_008.sbsar” para dentro
da pasta “Textures” na janela “Project”, expanda o object “bricks_008” criado e arraste o
“bricks_008” para cima do muro na janela “Scene” (Fig. 10).
Fig. 10: Muro com a textura procedural aplicada. Você pode ver qual
o “bricks_008” que deve ser arrastado indicado na janela “Project”.
Fig. 11: Muro após alterar alguns parâmetros da textura. Compare com o muro da Fig. 10.
Seria possível também criar um Mesh Collider na plataforma. A diferença é que o Mesh
Collider se ajusta exatamente ao modelo 3D da plataforma. A vantagem de usar um Mesh
Collider é que você não terá colisões inexistentes, principalmente nas bordas dos objetos. A
desvantagem é que o custo de processamento de um Mesh Collider é muito mais alto do que
de um Box Collider. Normalmente é recomendado utilizar Box Collider (ou um conjunto de
Box Colliders distribuídos pelo objeto) ao invés de Mesh Collider, o resultado é satisfatório e
é muito mais barato em termos de processamento.
Vamos agora criar um muro e entender como duplicar e conectar elementos. Arraste
os arquivos “EV_Wall.FBX” e “EV_Wall_DIF.tga” para a janela “Project” e clique no objeto
EV_Wall criado dentro da pasta 3D Models.
Você vai reparar que o nosso modelo está sem textura. Para aplicar uma textura a um
objeto de scroll na janela “Inspector” até o final. Uma pequena janela quadrada com o texto
“None (Texture)” vai aparecer. Arraste o objeto “EV_Wall_DIF.tga” de dentro da pasta 3D
Models para esta janela e a textura vai ser aplicada (Fig. 14).
Para trabalhar com o EV_Wall vamos limpar nossa cena um pouco. Na janela
“Hierarchy” apague todos os objetos (selecione o objeto, clique com o botão direito e
selecione “Delete”) com exceção de:
• First Person Controller
• Plane
• Directional Light
Clique em EV_Wall na janela Project e arraste para a janela Scene para adicionarmos
uma parede a cena. Agora queremos fazer com que essa parede comece exatamente em
cima do nosso chão, para fazer isso vamos usar o comando de “Vertex Lock”.
Para fazer isso, clique na parede na janela Scene e clique no botão “Move the selected
objects” no canto superior esquerdo da janela (ou use o atalho “W”). Feito isso ponha o cursor
em cima do muro e aperte a tecla “V”, você vai notar que o cubo para movimentação do
muro vai se mover para cima do cursor, e se você mover o cursor o cubo vai acompanhar.
Posicione o cursor em um dos cantos inferiores do muro, depois clique no muro e arraste.
Você vai notar que a movimentação do muro agora se dá em pulos. Isso porque com o “V”
pressionado, o vértice selecionado do muro está se conectando diretamente ao vértice do
chão mais próximo. Dessa maneira você garante que o muro está começando assim que o
chão termina (Fig. 15).
Fig. 15: Muro “preso” ao chão após o uso do comando Vertex Lock.
Podemos usar o Vertex Lock para facilmente expandir o muro. Selecione o muro na
janela “Scene” e pressione CTRL+D (ou command+D) para duplicar o objeto, feito isso
arraste o muro duplicado para o lado usando a seta verde para arrastá-lo e afaste-o do muro
original. Depois disso pressione o “V”, selecione um vértice do canto inferior e prenda-o a
um vértice do canto inferior do muro original. Repita o procedimento algumas vezes até
você se sentir confortável com esse procedimento (Fig. 16).
Se você pressionar Shift e clicar em cada um dos muros criados na janela “Scene”,
você pode selecionar todos os muros e trabalhar com todos ao mesmo tempo.
5. Prefabs e Packages
Prefabs (de prefabricated, pré-fabricado), são objetos que você pode replicar e utilizar
diversas vezes durante seu projeto. O uso de prefabs facilita muito a criação de itens iguais
ou mesmo com comportamento similares. Vamos criar um prefab contendo o muro com
vários segmentos que criamos.
Colapse todas as pastas da janela “Project” e clique em “GameObject -> Create Empty”.
Você vai notar um novo objeto na janela “Hierarchy” chamado GameObject.
Todo objeto de um projeto Unity é um “GameObject”. É importante saber isso para a
programação de scripts pois praticamente todas as classes são herdeiras da classe GameObject.
Selecione todos os EV_Wall da janela “Hierarchy” utilizando Shift e clicando nos EV_
Wall e arraste todos para cima do GameObject recém- criado. Você vai notar que todos os
EV_Wall agora estão abaixo do GameObject, isso significa que agora todos eles são filhos
do GameObject (vamos falar mais a respeito no futuro). Agora arraste o GameObject para a
janela “Project”. Foi criado um objeto novo com um cubo como ícone. Esse cubo significa
que esse objeto é um prefab (Fig. 17).
6. Importando um Package
Já temos tudo que precisamos para criar nossa fase do FPS, mas para acelerar o
processo vamos importar um arquivo .unitypackage com nossa fase já pronta.
Apague todos os elementos da cena e deixe apenas:
• First Person Controller
• Plane
Agora clique em “Assets -> Import Package -> Custom Package...” e selecione o arquivo
game_level_prefab.unitypackage e clique “Import” no pop-up. Na janela “Project” dentro de
“Game_level_and_Props -> Prefab” há um prefab chamado “Level”, arraste-o para a janela
“Scene”. Ajuste a posição do First Person Controller e do Plane dentro da janela Scene para
que o First Person Controller fique em cima de uma das plataformas e o Plane cubra toda a
parte debaixo da fase (Fig. 18).
Já temos tudo que precisamos para criar nossa fase do FPS, mas para acelerar o
processo vamos importar um arquivo .unitypackage com nossa fase já pronta.
A cena está bastante escura, vamos ajustar a iluminação, mudando a iluminação
ambiente e acrescentando um Directional Light.
Para mudar a iluminação ambiente clique em “Edit -> Render Settings” e clique em
“Ambient Light”, e ajuste-a para aproximadamente o exibido na Fig. 19, você vai perceber
que a cena já ficará um pouco mais clara.
Agora clique em “Game Object -> Create Other -> Directional Light”, na janela
“Inspector” na sessão “Light”, mude a opção “Shadow Type” para “Soft Shadows”, e você vai
perceber que a cena ficará mais iluminada e aparecerão sombras. Após acrescentar a luz,
na janela “Inspector” altere a propriedade “Rotation” para:
- X: 50
- Y: 260
- Z: 0
Dessa maneira teremos algumas áreas de sombra que utilizaremos para a parte de
Lightprobing (Fig. 20).
Após colocar a água, vamos acrescentar uma arma ao nosso jogador. Arraste para
dentro da pasta “3D Models” na janela “Projects” os arquivos:
- bazooka.fbx
- bazooka_colormal.tga
- bazooka_normalmap.tga
Se um pop-up aparecer, pode clicar em “Fix now”. Como os arquivos já estão com
os nomes corretos, se você clicar no prefab bazooka dentro da pasta “3D Models”, na janela
inspector já será exibido o modelo 3D com a textura aplicada corretamente.
Agora clique no prefab bazooka dentro de “3D Models” e arraste-o para cima do
objeto Main Camera dentro de First Person Controller na janela “Hierarchy”. Dessa maneira
o objeto bazooka ficará dentro do Main Camera, isso significa que bazooka agora é filho de
Main Camera, e sempre que Main Camera se mover, bazooka se moverá também (fig. 22).
Precisamos ajustar a posição da bazooka para que ela fique no canto inferior direito da
tela. Você pode ajustar manualmente através da janela “Scene”, ou então selecione bazooka
na janela “Hierarchy”, e configure o parâmetro “Position” da janela “Hierarchy” para:
- X: 0.7
- Y: -0.1
- Z: 0.7
Clique em Play, você pode perceber que a animação da arma é executada apenas
uma vez e a arma pára. Isso acontece pois as duas animações associadas a esse modelo (a
animação quando a arma está “Idle” e quando a arma é disparada) estão salvas como uma
animação só. Agora vamos dividir estas animações e aplicar a animação de “Idle”. Na janela
“Project” embaixo da pasta “3D Models” clique no prefab Bazooka. Na janela “Inspector”,
procure a seção “Animations”, logo abaixo de “Split Animations” há uma lista por enquanto
vazia (Fig. 24).
Fig. 24: Seção “Animations” do prefab. A tabela está na parte debaixo da imagem.
Clique no “+” para acrescentar uma animação a lista, os parâmetros da animação são:
- Name: O nome da animação, pode manter “idle”;
Destroy(gameObject, 5.0f);
O que essa linha faz é destruir o gameObject ao qual o script está associado em cinco
segundos. Salve o script, volte ao Unity e na janela “Project”, clique no BulletController e
arraste-o ao objeto Cube na janela “Hierarchy”, se depois disso você clicar no Cube em
“Hierarchy”, você vai notar no “Inspector” que surgiu uma nova sessão chamada “Bullet
Controller (Script)” (Fig. 25).
Mas da maneira como o tempo para destruição do cubo está configurado, a única
maneira de alterá-lo é entrando no código fonte e alterando o valor, vamos facilitar esse
processo, volte ao editor do código, e crie uma variável na classe:
Destroy(gameObject, timeToLive);
Arraste o Cube da janela “Hierarchy” para a janela “Project”. Dessa maneira vamos
criar um prefab do Cube que usaremos no futuro para criar as balas que são disparadas pela
nossa arma. Agora você já pode apagar o Cube da Scene.
Agora vamos criar o processo de disparo da arma, o processo é basicamente o
seguinte:
Primeiramente vamos definir a posição onde serão geradas as balas que são disparadas.
Clique em “GameObject -> Create Empty”. Esse GameObject será “vazio”, apenas com um
script associado, portanto para facilitar sua visualização vamos acrescentar um label a esse
GameObject. Selecione o GameObject criado na janela “Hierarchy” e clique no cubo verde,
vermelho e azul no canto superior esquerdo da janela “Inspector” e selecione um dos ícones
apresentados. Agora um label com o nome do GameObject estará presente na janela Scene
sempre (Fig. 27).
Vamos analisar o que está sendo feito no script BulletShooter.cs, a função Start() não
faz nada, ou seja, quando o cubo é criado nada acontece, na função Update():
void Update ()
{
if(Input.GetButtonDown(“Fire1”))
{
Rigidbody bullet = Instantiate(myBulletPrefab,
transform.position, transform.rotation) as Rigidbody;
bullet.velocity =
transform.TransformDirection(new Vector3
(0,0,shootForce)); audio.PlayOneShot(shootClip); gun.
animation.Play (“shoot”); gun.animation.Play-
Queued (“idle”);
}
}
Toda vez que a tela é redesenhada, eu verifico se o botão foi pressionado (if(Input.
GetButtonDown(“Fire1”))):
Como demonstramos quando criamos a bala, como essas variáveis são públicas elas
podem ser alteradas dentro do editor:
- Variável myBulletPrefab: Arraste o prefab Cube da janela “Project” para o
campo My Bullet Prefab da seção “Bullet Shooter (Script)”;
- Variável shootForce: Mantenha o valor 20;
- Variável shootClip: Arraste o arquivo bang.wav para a janela “Project” e depois
arraste o objeto bang da janela “Project” para o campo Shoot Clip da seção “Bullet Shooter
(Script)”;
- Variável Gun: Arraste o objeto bazooka da janela “Hierarchy”
para o campo Gun Clip da seção “Bullet Shooter (Script)”.
Sua configuração deve estar igual a Fig. 29.
Clique Play e teste o disparo clicando o botão esquerdo do mouse. Tudo funciona
exceto o som. Isso porque é necessário também acrescentar um componente chamado
AudioSource ao objeto BulletSpawn, para que o som possa ser executado. Clique no objeto
BulletSpawn na janela “Hierarchy”, depois clique em “Component -> Audio -> Audio Source”.
Clique Play e agora o áudio deve estar funcionando corretamente.
9. Criando um inimigo
Agora vamos criar um robô que será o nosso alvo. Clique em “Assets -> Import Package
-> Custom Package” e selecione o arquivo robot.unitypackage, clique em “Import” no pop-up.
Selecione o prefab Robot_Animated e arraste- o para a janela “Hierarchy”, depois posicione o
robô em frente a câmera (Fig. 30).
Aperte Play. Você vai notar que o Robô já tem uma animação de Idle (ele fica
balançando). Tente disparar no robô, você vai notar que a bala passa através dele. Esse é o
mesmo problema da plataforma que tivemos no início do tutorial, o robô não tem um box
collider.
Na janela “Hierarchy”, clique no objeto Robot_Animated, depois clique em “Component
-> Physics -> Box Collider. Depois você deve ajustar o tamanho e posição do Box Collider de
acordo com a Fig. 31.
Clique Play, agora as balas “param” no Robô. O próximo passo e fazer o tratamento
da colisão da bala com o robô.
Arraste o arquivo BulletHit.cs para a janela “Project”, depois arraste o objeto BulletHit
para o objeto Robot_Animated na janela “Hierarchy”.
Vamos analisar a classe BulletHit:
O primeiro detalhe é a falta das funções Start() e Update(), na verdade estas funções
não são necessárias, você pode ter uma classe sem ambas sem problemas.
A função OnCollisionEnter() é chamada no momento em que um objeto entra
numa área de colisão pertencente ao objeto ao qual este script está associado. Neste caso, é
o Box Collider do robô que acabamos de criar, e o objeto que entrou na área de colisão é o
parâmetro other da função. O que está acontecendo dentro desta função:
Após arrastar o script para o objeto Robot_Animated, clique em Play e tente atirar no
robô, agora tanto o robô quanto a bala desaparecem, conforme explicado acima.
Fig. 32: Configurações de static para um objeto. Como ele é “Navigation Static”
ele pode ser utilizado num Navigation Mesh.
Para começar é necessário selecionar todos os pisos que farão parte do nosso
Navigation Mesh, faça isso clicando em cada uma das partes do chão da nossa fase na
janela “Scene” (para selecionar mais de um objeto utilize CTRL+click no Windows ou
command+click no MacOS) (Fig. 33).
Fig. 33: Todas as partes de chão selecionadas que farão parte do Navigation Mesh (o chão
dentro do túnel também foi selecionado).
Uma vez selecionados os segmentos de chão que farão parte do Navigation Mesh,
clique em “Window -> Navigation” e clique no botão “Bake” no canto inferior direito (Fig.
34).
Após o termino do Bake, adicione um Nav Mesh Agent ao objeto Robot_Animated: Clique
em Robot_Animated na janela “Hierarchy” e depois clique em “Components -> Navigation ->
Nav Mesh Agent”. Depois arraste os arquivos agentLocomotion.js e robotController.js para a
janela “Project” e depois arraste os objetos agentLocomotion e robotController para o objeto
Robot_Animated na janela “Hierarchy”, depois disso clique em Clique em Robot_Animated na
janela “Hierarchy” e na seção “Robot Controller (Script)” altere a variável Nav Distance para
3 e arraste o objeto First Person Controller da janela “Hierarchy” para a variável Nav Target
(Fig. 35).
pastas “Explosion -> Effects” e arraste o prefab fireExplosionBase para a variável “Explosion”
(Fig. 36).
Fig. 36: Script Bullet Hit do objeto Animated_Robot com a variável Explosion configurada.
Aperte play. Agora quando você atirar no robô o mesmo desaparece e uma explosão
aparece no chão.
Porém, se você selecionar qualquer um dos objetos dentro de Level na aba “Hierarchy”,
você vai notar que estes elementos estão configurados como static, e serão afetados pelo
lightmapping (Fig. 38).
Para configurar o lightmapping clique em Window -> Lightmapping, uma nova janela
será aberta, clique no botão “Bake” na parte superior da janela e certifique-se que o “Mode”
está configurado para “Single Lightmapping” e configure o valor de “Resolution” para 5. Feito
isso, clique no botão “Bake Scene” no canto inferior direito e aguarde o término da criação
do lightmapping (Fig. 39).
Fig. 39: Aba lightmapping após a conclusão. Note o mapa de texturas de sombras no “Preview”.
OBS: Occlusion Culling está disponível somente na versão “Pro” do Unity. Caso você tenha
a versão básica e seu trial de 30 dias da Pro expirou, você não conseguirá executar esse
capítulo do tutorial.
Por default, o Unity utiliza Frustum Culling desenha todos os polígonos que estão
dentro da área de visão da câmera, independente se eles estão “escondidos” atrás de outros
objetos (Fig. 40).
Fig. 40: Exemplo de Frustum Culling. Esta é nossa fase vista de cima, o cone branco mostra o cone
de visão da câmera. Todos os polígonos neste cone são desenhados, inclusive os que estão atrás
da parede destacada em vermelho e que não podem ser vistos pelo jogador.
Para otimização, é possível utilizar Occlusion Culling nos jogos feitos em Unity. O
Occlusion Culling vai desenhar somente os objetos que são efetivamente vistos pelo jogador,
mesmo que estejam no cone de visão da câmera.
Para ativar o Occlusion Culling, clique em Window -> Occlusion Culling. O grid
branco do Occlusion Culling vai aparecer na janela “Scene”, ajuste o tamanho do grid com a
ferramenta de Scale e certifique-se que toda a cena está dentro do grid (Fig. 41).
Fig. 41: Janela “Scene” com o grid de Occlusion Culling aplicado em toda a cena
Feito isso, clique no botão “Bake” no canto inferior direito da aba “Occlusion”. Uma
vez terminado o Bake, aperte Play, e note na aba “Scene” que agora só os polígonos que
estão sendo desenhados são exibidos
OBS: Lightprobing está disponível somente na versão “Pro” do Unity. Caso você tenha a
versão básica e seu trial de 30 dias da Pro expirou, você não conseguirá executar esse
capítulo do tutorial.
Fig 44: As figuras de cima mostram o jogo com Lightmapping desativado, note que a diferença
de iluminação na arma na imagem da esquerda (região iluminada) e na imagem da direita
(região com sombra). As figuras de baixo mostram o jogo com Lightmapping ativado, note que a
iluminação na arma não muda entre as duas imagens.
Para acrescentar Lightprobes a sua cena clique em “GameObject -> Create Empty”, e
um objeto chamado GameObject vai surgir na aba “Hierarchy”, clique com o botão direito
no GameObject criado e o renomeie para Lightprobe. Com esse objeto selecionado clique
em “Component -> Rendering -> Light Probe Group” e agora vamos criar os Light Probes.
Como melhor prática o ideal é criar um volume com os Light Probes para que a coleta
seja eficiente. Para adicionar Light Probes selecione o objeto Lightprobe na aba “Hierarchy” e
clique no botão “Add Probe” na aba “Inspector”. Você vai notar que uma esfera azul vai surgir na
janela “Scene”, altere a posição dela e inclua mais probes no formato de um volume (Fig. 45).
Fig. 45: Sistema de Light Probes criado na cena. Note que parte dos probes
está na parte iluminada e parte está na parte sombreada da plataforma.
Uma vez criado o conjunto de Light Probes, procure o objeto Bazooka1 dentro da
aba “Hierarchy”, e dentro do Mesh Renderer na janela “Inspector”, ative a opção “Use Light
Probes” (Fig. 46). Feito isso clique em “Window -> Lightmapping e clique no botão “Bake
Scene”, pois uma vez criados os light probes é necessário refazer o bake do Lightmapping.
Uma vez feito o bake clique em play e passe pelos probles criados, você vai notar que a
iluminação na arma é modificada (Fig. 46).
Fig. 46: Cena com Lightmapping e Light Probes ativados, note a diferença de iluminação
na arma entre a região iluminada (esquerda) e região sombreada (direita).
Resumo
O presente artigo apresenta uma metodologia que se propõe a organizar os mapas de
iluminação7 dos objetos tridimensionais que são produzidos para o motor de jogos8 UDK.
Identifica a problemática na comunidade de produtores, realiza um apanhado das soluções
encontradas e propõe uma metodologia que pode ser aplicada de modo rápido e eficiente.
Tal metodologia se embasa em pesquisas acadêmicas e nos ensinamentos da história do
desenho e da pintura Ocidentais. Mostra que com uma rigorosa metodologia científica que
oriente o labor tridimensional é possível a produção de recursos tridimensionais no padrão
da indústria internacional de jogos (triple A).
Palavras-Chave: Metodologia 3D. Modelagem 3D. Lightmap. Topofilosofia. UDK. Maya.
1. Introdução
Todos os dias os artistas tridimensionais enfrentam problemas técnicos e conceituais
na dura tarefa de produzir recursos de qualidade para os motores de jogos. Mas, quando
uma dificuldade combina ambos, tanto os requisitos técnicos como os conceituais é que eles
são alertados para a importância de uma atitude e uma disciplina de trabalho organizada
metodologicamente.
No presente artigo enfocamos um destes momentos comuns que tem exasperado
inúmeros usuários do motor de jogos UDK no mundo inteiro e tem sido fonte para debates
em fóruns, artigos e extensa documentação: a importação de recursos de arte que tenham
uma apresentação e performance de qualidade profissional, quando submetidos ao sistema
de Lightmass do motor. Para alcançar este objetivo, os artistas têm de lidar com os requisitos
envolvidos na produção de um mapa de iluminação para os objetos tridimensionais, fato
que envolve tanto aspectos conceituais dos mais diversos, desde conhecimentos referentes
a teorias da luz, da parametrização dos objetos, da organização de mapas de UV, etc.
7 Os termos técnicos utilizados pela comunidade de produção são traduzidos na versão portuguesa do
presente artigo visando a sua máxima inteligibilidade conceitual. Lightmap é traduzido por mapas de iluminação;
assets por recursos
8 Os termos engine e game engine, foram respectivamente traduzidos por motor e motor de jogo
9 A metodologia sintetizada no presente artigo é o resultado de parte de uma pesquisa acadêmica (no TIDD)
que tem como enfoque central o estudo das capacidades técnicas dos softwares tridimensionais e dos motores
de games para a produção de ambientes (e seus objetos) e recursos expressivos para o estabelecimento de
uma linguagem dos jogos (sintaxe e semântica) ao modo das pesquisas já realizadas para as linguagens do
teatro, cinema e hipermídia.
de luz para o Lightmass10. É o caso do pedido de ajuda do usuário SeBeQ (Iron Guard, dos
EUA), do qual recolhemos uma amostra imagética (figura 2) do problema apresentado por
ele:
Foi a partir dos inúmeros problemas identificados, tanto nos fóruns dos
desenvolvedores como no estudo que realizávamos do motor de jogos, que nossa equipe
resolveu transformar o chamado problema de produção em uma problemática de pesquisa, ao
modo da metodologia topofilosófica11: quais os fundamentos e passos metodológicos a serem
realizados para a produção de mapas de iluminação adequados para o motor de jogo UDK?
10 Exemplos da problemática podem ser encontrados nos inúmeros pedidos de ajuda postados nos fóruns de
usuários. Citamos dois deles aqui: http://forums.epicgames.com/archive/index.php/t-743360.html; http://www.
game-artist.net/forums/support-tech-discussion/13168-udk-light-mapping-help-pretty-urgent.html
11 Detalhes sobre a metodologia topofilosófica podem ser encontrados em Petry (2003).
12 O UDK possui seu site em: udk.com.
por uma política audaciosa, o UDK desde o início foi balizado por atualizações mensais. Com
essa política ele estimulou a comunidade de desenvolvedores e estudiosos na produção de
jogos, comerciais e indie dentro do padrão de qualidade da indústria internacional (triple A).
Ainda que a ferramenta não fosse desconhecida pela comunidade internacional de
desenvolvedores, uma vez que se aproximava muito do editor de níveis da franquia de jogos
também pertencentes à Epic, o Unreal Tournament 3, o lançamento do Unreal Development
Kit foi acompanhado da promessa de que os produtores seriam capazes de gerar um
executável de seu projeto e não mais apenas Mods da franquia13.
Nesse sentido, o lançamento do UDK se constituiu em um marco no desenvolvimento
de jogos, principalmente do ponto de vista dos desenvolvedores indie e da academia.
Porém, cada motor de jogos possui peculiaridades técnicas e conceituais que devem
ser observadas, as quais estruturam pré-requisitos para um adequado desenvolvimento. É o
caso do motor de jogos UDK, que mesmo com a sua liberação gratuita para a comunidade,
mantém seu padrão de funcionalidade dentro de escopo profissional internacional. Neste
sentido, uma das mais importantes e poderosas funcionalidades do motor, a iluminação
baseada no Lightmass14, tem como pré-requisito a organização prévia de mapas de iluminação
(lightmaps).
Tal aspecto, fez com que uma comunidade de desenvolvedores, acostumada a trabalhar
privilegiando o estilo de modelagem intuitiva em detrimento dos preceitos técnicos da teoria
parametrizada dos objetos, enfrentasse um grande desafio. Foi a partir da constatação dessa
necessidade e oportunidade metodológica que estruturamos a problemática indicada no
tópico 2 acima.
4. Trabalhos relacionados
Muitos profissionais dedicados ao desenvolvimento com o motor de jogos UDK e
envolvidos com o ensino da utilização das ferramentas de modelagem associada ao motor
de jogo produziram materiais bibliográficos que discutem amplamente o conceito e a
produção dos mapas de iluminação.
Richard Moore, autor do Unreal Development Kit: Beginner´s Guide, reserva toda uma
seção de seu livro para a discussão geral do conceito relacionado aos objetos BSP15 e aos
13 Um dos aspectos já referidos é que um grande diferencial a ser observado, foi a coerente continuidade
que a equipe da EPIC manteve nas atualizações mensais do motor de jogos, sem restrições de uso e aplicação
técnicas, as quais permitiram inúmeros lançamentos de jogos e metaversos em um alto padrão de qualidade.
14 O Lightmass com a estrutura de lightmap foi introduzida em Junho de 2009 no UDK com o Build: QA_
APPROVED_BUILD_JUN_2009.
15 Objetos BSP: é o termo utilizado para designar um tipo especial de objeto interno ao motor de jogo. A sigla
BSP significa: Binary Space Partitioning, divisão (partição) binária do espaço. Eles são objetos criados que têm a
finalidade de compor parte de uma cenário, unicamente a partir dos brushes disponibilizados pelo motor UDK.
chamados Static Meshes16 [Moore 2012]. Thomas Mooney, autor de Unreal Development Kit
Game Design Cookbook, discute a resolução a ser utilizada nos lightmaps de objetos e a
necessidade de se manter os múltiplos de 2 [Mooney 2012].
Jason Busby, Zak Parrish e Jeff Wilson, os autores do Mastering Unreal Technology I e
II, discutem detalhadamente a questão da iluminação e dos mapas de iluminação dentro do
Unreal Engine 3 [Busby et al. 2009].
O site educacional criado por Jason e Angela Busy, o 3dbuzz.com, dentre as centenas
de vídeos didáticos sobre o UDK, possui 14 vídeo-aulas dedicadas especificamente ao tema
dos mapas de iluminação e do sistema de Lightmass, constituindo-se em uma referência
para quem deseja dominar a problemática [Busby 2012].
Temos também o Belga, Sjoerd “Hourences” De Jong, notório artista e didata no
mundo do Unreal, que nos apresenta uma sólida introdução ao Lightmass e ao lightmap
nos seus artigos, Introduction to using the Lightmass system e Lightmapping Meshes In The
Editor: How to set up lightmapping on a mesh [Hourences 2010]. Ainda que ambos sejam
direcionados ao UT3 (Unreal tournament 3) a sua estrutura conceitual e de parametrização
é inteiramente aplicável ao UDK.
Por outro lado, Stephen Jameson escreveu um artigo no qual, dentre outras coisas,
demonstra a necessidade da produção de mapas de iluminação diferenciados para os
objetos e a sua disposição em um alinhamento parametrizado na grade do mapeamento
UV [Jameson 2009].
Outro grande designer, Alex Galuzin, em seu site didático, World of Level Design,
apresenta inúmeros artigos que tratam de forma concisa e eficaz a problemática em questão.
São eles: UDK: Lightmap Basics and 18 Important Principles for Creating and Using Lightmaps;
UDK: Lightmap UV Layout Techniques and How to Create a Second UV Channel in Maya;
UDK: How to Fix Lightmap Light/Shadow Bleeding and Seams; UDK: Lightmap Resolution for
Static Meshes and BSP; UDK: Lightmap Common Problems and Solutions. [Galuzin 2012] O
trabalho de Galuzin pode ser considerado uma das maiores, mais generosas e importantes
contribuições realizadas até o momento para o entendimento e entrelaçamento entre o
UDK e as ferramentas de modelagem tridimensional, especialmente o Maya.
Finalmente, no próprio sistema de documentação da EPIC Games, a partir da
introdução do sistema de Lightmass, em 2009, Daniel Wright publica um artigo intitulado,
Lightmass Static Global Illumination [Wright 2009]. Nesse artigo ele nos indica a correlação
16 Static Meshes: é o nome dado para os objetos poligonais 3D que compõem um cenário, cena de um
jogo ou espaço navegável. São chamados de “static”, porque esses objetos são estáticos, ou seja, não estão
animados, muito menos sofrem qualquer reposicionamento no campo paramétrico do mapa durante o jogo.
Eles servem ao propósito de compor, dar identidade e decorar o cenário. Assim, eles são construídos nos
softwares de modelagem e são exportados para o motor de jogo. Sem os static meshes, não há ambiente do
jogo, nem espaço navegável; restaria apenas uma cena vazia. Dessa forma, tudo aquilo que ocupa a cena
3D, objetos, móveis, vegetações, entre outros, e que não é animado, é uma static mesh. É neles que incide a
problemática dos mapas de iluminação.
17 “O Lightmass cria lightmaps com interações complexas de luz como áreas de sombreamento e inter-reflexões
difusas. Ele é ortogonal ao restante da renderização do pipeline (iluminação dinâmica e sombreamento. Ele
apenas substitui os lightmaps e mapas de sombras estáticas por outros de qualidade superior” [Wright 2009].
18 Isso sem falar aqui por falta de espaço do trabalho do filósofo francês Blaise Pascal que, em 1639, com seu
Ensaio sobre cônicas, organiza a ideia das projeções sobre um plano que servirá, duzentos anos depois, como
base para o desenho projetivos de objetos e máquinas [Attali 2003].
19 “Luz, buscar a luz, por ventura a luz nos desvia da luz? Então se você buscar a luz onde há trevas, A sua
luz se esmaece na escuridão pela perda de sua visão”.
20 Referências que aqui podem ser muito elucidativas quanto à função da luz na percepção humana do
mundo são as produzidas pelo fenomenólogo Merleau-Ponty [1945 e 1964].
21 Rachel Cross é a light artist ou light designer de Dead Space 2 que fala sobre o desenvolvimento desta ideia.
do mapa de iluminação no software de modelagem Maya 2012 (em nosso site de pesquisa
apresentamos também o tratamento realizado no Cinema 4D para o problema), a versão
utilizada do build, para mostrar os resultados, será a de Julho 2012 UDK Beta - MD5
661430d4df82c524b07a1f4f6c955f90 (figura 9).
O objeto escolhido, dentro dos vários objetos trabalhados em nossa pesquisa será o
de um cubo que sofreu uma transformação homogênea de extrusão em suas seis faces, com
a consequente aplicação de uma textura conceitual. Nós o intitulamos tematicamente com
o nome de Cubo Metafísico.
O cubo metafísico (figura 10) foi concebido em 1998 a partir de um curso que um dos
membros da equipe realizou com a artista digital Eni Oken, uma das designers tridimensionais
da Série Zork Nemesis: The Forbidden Lands [1996] e Zork, Grand Inquisidor [1997] e desde
então fez parte de projetos de games e metaversos, como por exemplo, a Ópera Quântica
AlletSator 4.5 [2008].
O resultado obtido por este procedimento pode ser observado na figura 16, a qual
apresenta a renderização do cubo dentro do UDK.
Com isso nós estamos no caminho de produzir um mapa de iluminação de qualidade
para o nosso objeto a ser importando pelo UDK. Dois requisitos ou passos ainda precisam
ser cumpridos.
Em primeiro lugar é importante lembrar que a organização das faces poligonais
do objeto no plano UV corresponde ao que já apresentado na seção 5.1 acima, a uma
parametrização do objeto (um aplanamento do mesmo em termos topológicos).
Então, para que esta parametrização alcance o maior resultado possível na geração
de um mapa de iluminação de qualidade, será necessário que os limites topológicos das
áreas abrangidas pelas linhas exteriores dos grupos contínuos estejam alinhados com a
própria grade do plano UV e, inclusive, respeitando distâncias entre elas que devem ser
múltiplos de 2 (2, 4, 8 pixeis, por exemplo).
Dado este importante passo estamos prontos para exportar o Cubo Metafísico do Maya
para o UDK. Recomendamos que o objeto passe pelo processo de triangulação de suas faces
e seja conferido se as mesmas seguem todas a mesma orientação.
A possibilidade de produzir uma triangulação sem uma adequada e mesma
orientação topológica para o objeto pode incidir em problemas com o mapa de iluminação.
Em exemplos com polífonos com este tipo de triangulação não orientada uniformemente,
a luz pode tender a colidir com uma face e produzir manchas, cortes ou os chamados
sangramentos (bleedings) no material do objeto distorcendo a sua visualização.
O objeto pode ser exportado nos formatos FBX ou ASE. Ainda que o formato ASE
tenha sido descontinuado como plug-in, ele continua funcional. Entretanto, como o objeto
foi modelado e trabalhado em seus mapas UVs no Maya ele foi exportado no formato FBX.
As notas do UDK, July 2012 Unreal Development Kit Beta, trazem informações
importantes para orientar os usuários quanto aos requisitos da exportação de recursos no
formato FBX: http://www.unrealengine.com/news/epic_games_releases_july_2012_unreal_
development_kit_beta/.
A figura 16 mostra o Cubo Metafísico em uma cena no UDK e o mapa UV utilizado
para a produção do mapa de iluminação. Ela se constitui na apresentação do corolário
imagético de um processo metodológico que mostra a efetiva possibilidade de se produzir
recursos de arte com qualidade no padrão da indústria internacional de jogos para os artistas
tridimensionais e reforça a necessidade de conceito e técnica trabalharem solidariamente
em nossas atividades.
7. Conclusão
Com o presente artigo buscamos mostrar que seguindo uma metodologia científica,
orientada por conceitos e técnicas, é possível trabalharmos na produção de recursos de arte
de qualidade para o motor de jogos UDK. O apresentado no espaço do artigo se constitui
em um resumo parcial de um relatório de pesquisa no qual trabalhamos detalhadamente
os aspectos apresentados e outros. Para os que tiverem interesse no tema pesquisado,
indicamos o nosso site de pesquisa, topofilosofia.net, na sua seção Pesquisa, dentro da qual
publicamos nosso relatório e suas fontes na íntegra.
Agradecimentos
A Pesquisa tem financiamento parcial da CAPEs, na modalidade de Bolsa de Mestrado
para um dos membros da equipe. Os autores agradecem a leitura da Prof.ª. Dr ª. Arlete dos
Santos Petry que acompanhou e estimulou ao grupo durante todo processo. Agradecemos
ao estímulo dado pelo grupo de pesquisa do CNPq, do Projeto de Pesquisa “Diálogos entre
Arte e Design: Processo de avaliação e revisão de jogo eletrônico educativo em arte” que nos
motivou para a inscrição na Trilha de Tutoriais. Dedicamos o presente artigo, in memoriam,
ao Prof. Ernest Sarlet, filósofo e pedagogo.
Referências
Attali, Jacques. 2003. Blaise Pascal ou o gênio francês. Bauru. EDUSC.
Bahia, Ana Beatriz. 2008. Jogando arte na WEB: educação e museus virtuais. Tese
de Doutorado apresentada ao Programa de Pós-graduação em Educação da UFSC.
Orientador Wladimir Antônio da Costa Garcia. Florianópolis.
______. 2006. Iluminação. Artigo digital no Site do Educador do jogo artístico Mansão
de Quelícera. Avaliable from: http://www.casthalia.com.br/a_mansao/preste_atencao/
iluminacao.htm [Consult. em aug 2012].
Galuzin, Alex. 2012. World of Level Design Tutorials: (1) UDK: Lightmap Basics
and 18 Important Principles for Creating and Using Lightmaps; (2) UDK: Lightmap UV
Layout Techniques and How to Create a Second UV Channel in Maya (3) UDK: How
to Fix Lightmap Light/Shadow Bleeding and Seams; (4) UDK: Lightmap Resolution for
Static Meshes and BSP; (4) UDK: Lightmap Common Problems and Solutions. Artigos
[online] do Blog do Autor: World of Level Design (EUA). Avaliable from: http://www.
worldofleveldesign.com/articles.php. [Consult. em Maio 2012].
Goethe, Johann Wolfgang. 1810. Zur Farbenlehre. Disponível [on-line] em: http://www.
zeno.org/Literatur/M/Goethe,+Johann+Wolfgang/Naturwissenschaftliche+Schriften/
Zur+Farbenlehre, and see also: http://www.seilnacht.tuttlingen.com/Lexikon/goethe1.htm.
[Consult. em Set 2012].
Bonin, Vincent 2004. Interview with Steve Heimbecker, postado no site da Canadian
Electroacoustic Community (CEC). Disponível [on-line] em: http://cec.sonus.ca/
econtact/9_2/heimbecker.html. [Consult. em Set 2012].
FEIJO, Bruno, CLUA Esteban in SILVA Flávio S. Correia. 2010. Introdução à Ciência da
Computação com Jogos. Elsevier. Rio de Janeiro.
Jameson, Stephen. 2009. Lightmap UVs Tutorial. Artigo do Blog do Autor [online].
Avaliable from: http://stephenjameson.com/tutorials/lightmap-uvs-tutorial/ [Consult. em Set
2012].
Millan, Ian. 2011. Dead Space 2 Lighting Developer Diary. Video depoimento-
documentário. Machinima.com. Publicado no YouTube. Disponível [on-line] em: http://youtu.
be/GdM3UnW7J3s. [Consult. em Set 2012].
Pinheiro de Souza, Carlos Augusto. 2012. Imersão e presença nos jogos FPS: uma
aproximação qualitativa. Dissertação de Mestrado apresentada ao Programa de Pós-
graduação em Tecnologias da Inteligência e Design Digital da PUCSP. Orientador: Luís
Carlos Petry. São Paulo.
Shakespeare, William. 1598. Love´s labour´s lost. London: Cuthbert Burby. Disponível
[on-line] em: http://shakespeare.mit.edu/lll/full.html [Consult. em Set 2012].
Wikipédida. The free encyclopedia. 2012. Static mesh. Disponível [on-line] em: http://
en.wikipedia.org/wiki/Static_mesh [Consultado em Set 2012].
Zork Nêmesis: The Forbidden Lands. 1996. Zombie LLC. Activision. Jogo para as
Plataformas Apple Macintosh , PC : MS-DOS /Windows 95.
Zork, Grand Inquisidor. 1997. Activision. Jogo para as Plataformas Mac OS, Microsoft
Windows.
Abstract
Point based Graphics embraces a set of processes, techniques and algorithms for the
acquisition, representation, processing and storage of point clouds, aiming at applications
in graphics processing. As multi and manycore processors have increased their storage and
processing powers, this area has become very attractive for applications that require high
performance graphics, eg, digital games. Within this context, this chapter introduces the
basics of Point Based Graphics, highlighting the main applications in modeling, rendering
and animation in GPU.
Resumo
Point based Graphics refere-se a um conjunto de processos, técnicas e algoritmos para
aquisição, representação, processamento e armazenamento de nuvens de pontos, visando
às aplicações em processamento gráfico. Com o aumento da capacidade de processamento
e armazenamento de processadores multi e many-cores, esta área tornou-se bastante
atrativa para aplicações gráficas que requerem alto desempenho como, por exemplo, jogos
digitais. Dentro deste contexto, este capítulo apresenta as bases de Point Based Graphics,
evidenciando as principais aplicações em modelagem, renderização e animação em GPU.
Introdução
A tecnologia de Point Based Graphics, com o aumento do poder de processamento das
unidades de processamento gráfico (GPU), tem oferecido ao segmento de desenvolvimento
de jogos digitais novas possibilidades para aumento de desempenho das aplicações. Neste
contexto, ao invés de se trabalhar com estruturas de dados complexas, que envolvem, por
exemplo, vértices, arestas e faces, utiliza-se somente uma nuvem de pontos para representar
o objeto a ser processado.
A partir desta nuvem de pontos, com o poder de processamento gráfico e genérico
das GPUs, procedimentos como modelagem, transformações, renderização e animação
são efetuados diretamente nesta nuvem. Mesmo procedimentos considerados não-gráficos
como, por exemplo, simulações de Física ou inferências em Inteligência Artificial podem ser
efetuadas nas nuvens com o auxílio de linguagens como CUDA ou OpenCL.
Assim, dentro deste contexto, este texto tem como objetivo introduzir os conceitos
fundamentais de nuvens de pontos para suporte a Point Based Graphics e processamento
dentro de GPUs, visando às aplicações de desenvolvimento de jogos digitais.
O texto está organizado da seguinte forma:
• a Seção 1.2 traz o conceito de nuvens de pontos e algumas formas para sua
representação
• a Seção 1.3 discute o processo de aquisição de nuvens de pontos através de
scanning 3D
• a Seção 1.4 apresenta funcionalidades de processamento gráfico de nuvens de
pontos através de shaders
• a Seção 1.5 apresenta detalhadamente as funcionalidades de processamento
genérico de nuvens de pontos em GPU, com as arquiteturas CUDA e OpenCL. Como o
processamento de nuvens muitas vezes não requer saída gráfica, deu-se uma atenção
especial a este tópico.
• finalmente, a Seção 1.6 apresenta o fechamento do capítulo e, em seguida, são
apresentadas algumas sugestões de referências bibliográficas.
O autor deseja que este texto possa disponibilizar um suporte simples e direto para
todos aqueles que queiram iniciar trabalhos na área de Point Based Graphics, especialmente
aplicados os aplicados em jogos.
A partir de uma nuvem de pontos, pode-se construir uma visualização básica, através
de acumulação de patches, ou se aproximar ou interpolar uma superfície pelos pontos. A
Figura 2 mostra três níveis usuais de visualização de uma malha de pontos: a própria nuvem,
uma acumulação de patches e uma superfície interpolada (já com renderização):
Uma das grandes vantagens de falta de relações entre os pontos reside no fato da
velocidade de alteração das estruturas de representação das nuvens de pontos, uma vez
que, normalmente, não há necessidade de atualização de arestas, faces ou mesmo objetos.
Formalmente, um ponto P em uma nuvem de ponto é uma t-upla formada, geralmente,
pela sua posição (x,y,z) e alguma informação de cor (r,g,b):
A projeção laser permite indicar qual segmento de reta está sendo escaneado. O
sistema duplo de câmeras permite utilizar técnicas de reconstrução 3D, baseadas em Visão
Estereoscópica. A coordenada do ponto que está sendo escaneado pode ser obtida através
de uma intersecção de retas definidas pelas duas câmeras e os planos de projeção das
imagens, conforme mostra a Figura 5:
Este esquema exige uma calibração de todo o sistema de aquisição como, por
exemplo, distância entre as câmeras ou estimação das distâncias focais das duas câmeras.
Uma vez calibrado o sistema, a granularidade dos pontos escaneados pode ser controlada
tanto no processo de aquição, quanto no processo de pós-processamento. A Figura 6 mostra
duas nuvens de pontos, com as respectivas superfícies rescontruídas:
O processo de obtenção da nuvem de pontos pelo Kinect pode ser feita através do
Kinect SDK. A seguir, tem-se um exemplo de código que realiza esta tarefa:
Além dos pontos, o Kinect ainda permite obter animações baseadas em um esqueleto
humano de referência.
Uma vez obtida a nuvem de pontos, as próximas seções abordarão como processá-
las dentro de uma GPU com propósitos gráficos (via shaders) ou com propósitos gerais (via
CUDA ou OpenCL).
Os pixel shaders recebem como entrada um vértice (ponto) e retornam uma cor
associada ao vértice. No contexto de nuvens de pontos de jogos, este tipo de shader é muito
utilizado para os mecanismos de renderização. O trecho de código a seguir mostra parte do
cálculo do Modelo de Phong para nuvens de pontos:
Linguagem CUDA C
A arquitetura CUDA (Compute Unified Device Architecture) (NVIDIA, 2011) unifica
a interface de programação para as GPUs da NVIDIA, assim como define um modelo de
programação paralela que pode ser usado de forma unificada em dezenas de dispositivos
diferentes. A linguagem CUDA C possibilita que se inclua comandos direcionados às GPUs
da NVIDIA em programas escritos em linguagem C/C++.
Apesar de ser uma interface unificada que possibilita a programação em diferentes
placas gráficas, CUDA possui características intrínsecas ao hardware das placas NVIDIA.
Assim, antes de apresentar o modelo de programação CUDA, uma breve descrição da
arquitetura Fermi será apresentada a fim de justificar o modelo de programação CUDA e
familiarizar o leitor com este tipo de dispositivo que tem sido referenciado como acelerador.
Arquitetura FERMI
As GPUs são compostas de centenas de núcleos (cores) simples que executam o
mesmo código através de centenas a milhares de threads concorrentes. Esta abordagem se
opõe ao modelo tradicional de processadores multicore, onde algumas unidades de núcleos
completos e independentes são capazes de processar threads ou processos. Estes núcleos
completos, as CPUs, possuem poderosas unidades de controle e de execução capazes
de executar instruções paralelas e fora de ordem, além de contarem com uma poderosa
hierarquia de cache. Já as GPUs contam com unidades de controle e de execução mais
simples, onde uma unidade de despacho envia apenas uma instrução para um conjunto
de núcleos que a executarão em ordem. O modelo de execução das GPUs é conhecido
como SIMT (Single Instruction Multiple Threads), derivado do clássico termo SIMD (Single
Instruction Multiple Data). A Figura 9 apresenta as diferenças nas arquiteturas de CPU e GPU.
A arquitetura Fermi da NVIDIA segue este princípio de dedicar uma maior quantidade
de transístores às unidades de execução, ao invés de dedica-los às unidades de controle e
cache. A Figura 10 apresenta uma visão geral da arquitetura Fermi:
A Figura 12 apresenta a arquitetura dos SM. Cada um é composto por quatro blocos
de execução controlados por duas unidades escalonamento de warps (grupos de 32 threads).
Além disso, cada SM conta com uma memória cache L1/memória compartilhada de
64KB, já mencionada, e com 32KB de registradores, compartilhados entre todas as threads
que executarão no SM.
Programação CUDA
O modelo de programação de CUDA C é composto de uma parte sequencial executada
na CPU (host) e de uma parte paralela executada na GPU (device). O programador desenvolve
uma função especial chamada kernel que será replicada em até milhares de threads durante
a execução na GPU. As threads realizam as mesmas operações simultaneamente, porém
atuam ao mesmo tempo sobre dados diferentes.
Em primeiro lugar, é importante observar a organização das threads em CUDA (figura
5). Elas são organizadas em blocos e, dentro destes blocos, podem estar dispostas em 1, 2
ou até 3 dimensões. Os blocos são organizados em grades de uma ou duas dimensões. Da
mesma forma, cada thread também terá disponível a informação de a qual bloco dentro da
grade ela pertence. Por exemplo, numa grade 1D, pode-se dizer que a primeira thread entre
todas pertencerá ao bloco 0 e terá seu índice dentro do bloco como 0 (bloco 0, thread 0).
Além disso, CUDA suporta uma série de tipos de memória que podem ser usadas
pelos programadores para que possam acelerar a velocidade de execução de um kernel.
A Figura 14 mostra de forma esses tipos de memória num dispositivo CUDA. A memória
global (global memory) pode ser escrita ou lida a partir do código que executa na CPU,
chamado usualmente de host. Estas operações são realizadas utilizando-se funções da API
(Aplication Programming Interface) de CUDA.
Internamente, a memória global pode ser acessada por qualquer thread em execução
no dispositivo. Entretanto, a tecnologia usada no desenvolvimento de tal memória não
possui taxa de velocidade de acesso que acompanhe a velocidade dos cálculos que pode ser
obtida pela GPU, tornando-se um gargalo de desempenho. Por conta disso, a organização de
memória conta com outros tipos de memória que podem ser usadas pelo programador para
otimizar o desempenho de acesso à memória. São elas a memória local (shared memory),
compartilhada apenas por threads num mesmo bloco, e os registradores (registers), que não
são compartilhados entre as threads e são alocados previamente pelo compilador. Existe
ainda uma memória somente de leitura, também compartilhada entre todas as threads de
um grid, a memória constante (constant memory), que possui um tempo de acesso melhor
que o da memória global.
Linguagem OpenCL
OpenCL (Munchi, 2011) possui uma filosofia ligeiramente diferente de CUDA. A ideia
é que a linguagem e seu sistema de tempo de execução sirvam como uma camada de
abstração ao hardware heterogêneo que é extremamente comum nos dias de hoje. Assim,
um programa OpenCL tem o objetivo de aproveitar todos os dispositivos presentes na
máquina, tais como processadores multicore, GPUs, DSPs (Digital Signal Processors), entre
outros. Uma aplicação que executa em um hardware heterogêneo deve seguir os seguintes
passos:
1. Descobrir os componentes que compõem o sistema heterogêneo.
2. Detectar as características do hardware heterogêneo tal que a aplicação possa se
adaptar a elas.
3. Criar os blocos de instruções (kernels) que irão executar na plataforma heterogênea.
4. Iniciar e manipular objetos de memória.
5. Executar os kernels na ordem correta e nos dispositivos adequados presentes no
sistema.
6. Coletar os resultados finais.
Estes passos podem ser realizados através de uma série de APIs do OpenCL juntamente
com um ambiente de programação e execução dos kernels. Esta seção apresenta um resumo
do modelo de abstração do OpenCL juntamente com um exemplo simples de código.
Em primeiro lugar, é importante conhecer o modelo de plataforma heterogênea do
OpenCL. Ele é composto por um host e um ou mais dispositivos OpenCL (devices). Cada
dispositivo possui uma ou mais unidades de computação (compute units), que por sua vez
são compostos por um conjunto de elementos de processamento (processing elements). A
Figura 15 apresenta esta organização.
Comentários Finais
Conforme evidenciado no texto, um dos grandes motores propulsores da tecnologia
atual de Point Based Graphics são GPUs, que disponibilizam, além de suporte a operações
gráficas como modelagem, renderização e animação, suporte a operações como Física e
Inteligência Artificial.
Esta área em jogos digitais, apesar de recente, tem oferecido diversas oportunidades
de pesquisas tanto no desenvolvimento de novas técnicas e algoritmos para nuvens de
pontos, como também de aplicação direta em game engines.
Espera-se, com o caráter introdutório deste texto, que as bases de nuvens de pontos
tenham sido compreendidas, assim como as possibilidades de desenvolvimento tanto para
o contexto gráfico como para contextos mais genéricos.
Referências
FARBER, R. CUDA Application Design and Development. New York: Morgan
Kaufmann, 2011.
FARIAS, T.S.M.C., TEIXEIRA, J.M.N.X., LEITE, P.J.S., ALMEIDA, G.F., TEICHRIEB, V.,
KELNER, J. High Performance Computing: CUDA as a Supporting Technology for Next
Generation Augmented Reality Applications. In: RITA, 16(1), 2009, pp. 71-96.
GASTER, B., HOWES, L., KAELI, D.R., MISTRY, P. Heterogeneous Computing with
OpenCL. New York: Morgan Kaufmann, 2011.
GROSS, M., PFISTER, H. Point-Based Graphics. New York: Morgan Kaufmann, 2007.
MUNSHI, A., GASTER, B., MATTSON, T.G., FUNG, J., GISBURG, D. OpenCL
Programming Guide. New York: Addison-Wesley Professional, 2011.
PCL. (2012). Point Cloud Library. Fonte: Point Cloud: http://pointclouds.org, Acesso em
01/08/2012.
SINHA, S.N., FRAHM, J.M., POLLEFEYS, M., GENC, Y. GPU-based Video Feature
Tracking and Matching. Relatório Técnico TR 06-012, Departamento de Ciência da
Computação, Universidade da Carolina do Norte – Chapel Hill, 2006.
A diagramação deste livro eletrônico foi realizada pela Editora Feevale. O arquivo está em PDF e
formato A4 para que seja possível a impressão de partes do texto. Os botões interativos presentes no
arquivo digital não aparecerão na impressão caso ela seja feita. E-book de distribuição gratuita.