
E a tal da matemática?

Uma das principais perguntas que recebo quando falo que sou programador de jogos é: “é verdade que precisa saber bastante matemática?”.
Vamos por partes. O que você entende por matemática? Onde e como você pode utiliza-la?
Minha resposta vai ser um tanto influênciada pelo meu passado, pois sou faixa preta em matemática. (na verdade, apenas graduado). Não sou um exímio matemático nem fui um aluno ideal. Nunca trabalhei especificamente com matemática nem com matemática aplicada (meu curso, na verdade).
O que aprendi, então? Tirando toda teoria básica de cálculo, algoritmos, estrututras de dados e uma base estatística boa, vi muita coisa específica, que, pra falar a verdade, nem lembro mais ou nem acho útil. Não faço idéia se algum dia vou usar o teorema de Lagrange ou implementar o algoritmo de Newton. Sinceramente? Não importa.
Desde que começei a trabalhar com jogos, apliquei bastante do conhecimento de algoritmos da faculdade. Esses estudos vêm, na verdade, de ciências da computação que nasceu da matemática. Apliquei também uma ou outra coisa de cálculo, mais especificamente em física ou estatística. Novamente, a matemática está sendo aplicada a algum caso, e não usada “puramente”.
Então, respondendo, é necessário ter uma base teórica forte em matemática? Depende. Se você quiser trabalhar com uma parte mais de base, como computação gráfica, sim, é necessário. Tudo, nesta área, é baseada em cálculos matemáticos, principalmente de matrizes. Em otimização de sistemas ou jogos, muita matemática é usada também.
Mas e se você, principalmente estando no Brasil, for trabalhar com advergames? Ou então trabalhar com uma engine que está tudo pronto? Onde a matemática entra aí?
É agora que eu volto lá no começo do texto. O que você entende por matemática? Sempre vejo, principalmente crianças/adolescentes, e muita gente de humanas, vinculando matemática a números. A definição exata do que é matemática, não chegaram ainda. Eu, como um péssimo representante da classe dos matemáticos, não me atrevo a tentar definir o que é. Mas tenho uma boa noção do que não é. Matemática não é apenas números. É, basicamente, raciocínio lógico vinculado a conhecimento.
Porque tem tantos matemáticos ou físicos que viraram programadores? Porque, apesar do conhecimento ser diferente, a competência que seu cérebro cria é, basicamente, a mesma. O raciocío lógico da extrapolação de seu conhecimento é muito treinado no estudo da matemática, da física, e programando.
Mais um vez, é necessário? Sinceramente mesmo? Não. Mas, sem essa base de raciocínio, vai ser bem difícil se equivaler a um programador com um histórico forte em matemática.
cateogories: Programação

Bruno Sanches
September 29, 2010 at 09:52
Na minha opinião, se vai trabalhar com jogos, por melhor que seja a engine que a pessoa use, no mínimo matemática vetorial vai ter que saber. Não precisa saber resolver as mais complexas integrais, mas uma base matemática é necessária sim e nos casos dos jogos, pelo menos geometria analítica.
T+
Gilliard Lopes
September 29, 2010 at 10:39
Concordo com os pontos. Acho que álgebra e geometria são de longe as disciplinas da matemática mais úteis para programação de jogos, especialmente pra quem quer mexer com computação gráfica e simulação física. E acredito que o estudo do cálculo e da matemática aplicada sirva muito mais para abrir a cabeça do que como referência. Obviamente o raciocínio lógico acaba sendo a habilidade mais importante a ser desenvolvida para um programador, especialmente de games.
Conheço muitos programadores que parecem ter "medo" de matemática. Tenho uma história meio engraçada, meio triste sobre isso.
Um amigo de infância trabalhava numa empresa com 30 programadores, e um dia o cliente pediu pra eles implementarem um gerador de gráficos de pizza a partir de uns dados lá. Diz o meu amigo que todos os programadores da empresa correram dessa feature, e ele acabou falando de mim pro chefe dele, algo como "eu tenho um amigo programador de video games, ele deve saber matemática".
Resultado: a empresa me contratou como freela pra implementar a feature, que nada mais era do que alguns senos e cossenos, e eu cobrei provavelmente o valor de um mês de salário daqueles programadores… por uma tarde de trabalho. Depois de pronto o programinha, eles olhavam pro código com uma cara de espanto, como se fosse mágica. Era só matemática, trigonometria básica.
Danilo Ganzella
September 29, 2010 at 15:24
Como assim!! Eu ja usei a interpolação de lagrange para fazer o exporter do maya pra x3d com uma aproximação boa para o brilho!!
acredito que toda matemática é útil. Na verdade porque toda a matemática é só derivação da conta básica que é a adição.
Normalmente não precisa saber exatamente como se faz os cálculos, mas saber usar uma ferramenta fera que ajude voce (na verdade o excel ja faz quase tudo, principalmente a parte de calculo numerico e estatistica).
ah, conhecer geometria analítica (ah se nao fosse o descartes), sistemas de coordenadas, cálcuio de área, volume.. eu acredito que é fundamental pra trabalhar com 3D.
obs. Java tem um gerador de graficos de pizza pronto!! aahuahuhue 8D (ele escreve o jpg até!!).
Gilliard Lopes
September 29, 2010 at 15:49
Não sei se concordo que toda matemática é útil no aspecto prático. Afinal, entre a adição e as técnicas analíticas mais complexas, há uma enorme quantidade de níveis de abstração. Mas continuo achando que é um ótimo estudo pra abrir a cabeça.
Sobre o pie chart do Java, eles estavam tentando usar, mas na verdade o requisito era um pouco mais complexo, na verdade chamado ring chart, como este:
http://upload.wikimedia.org/wikipedia/commons/2/2…
Eu não investiguei a biblioteca do Java, mas acho que eles tentaram gerar gráficos desse tipo com ela e não conseguiram.
Rafael "Barry&q
September 29, 2010 at 16:01
@ Gilliard
"Depois de pronto o programinha, eles olhavam pro código com uma cara de espanto, como se fosse mágica. Era só matemática, trigonometria básica."
Pôxa, não! Isso é um conhecimento específico que você domina. Se muita gente fica espantada, é porque você faz algo que os outros não fazem, logo, deve ser difícil pra maioria. Desenhar um personagem em uma pose qualquer pra mim é dois palitos, mas pra grande parte da população mundial é coisa de outro mundo.
Valorize suas especialidades! Continue cobrando caro =D
Gilliard Lopes
September 29, 2010 at 16:43
@Barry Vendo por esse lado, você tem razão. Mas os caras a que eu me referia eram todos programadores. Sinceramente, eu esperava que trigonometria básica fosse, para qualquer programador, tão "dois palitos" quanto desenhar um personagem é para artistas como você.
Mas entendi o ponto sim hehehehee.
Yuri Ivatchkovitch
September 29, 2010 at 19:34
Para quem quer entrar em programação de games ou qualquer coisa que envolva gráficos é extremamente importante.
Reforço o que o Bruno e o Gilliard disseram: geometria analítica é o que há!
Lembro-me da época da Eleven Cells que nós programadores pareciamos um bando de autistas brincando com as mãos fazendo a representação do axis, para ver incidência de normais e cálculos sobre os vetores. Nesta mesma época também enlouqueci fazendo o exportador do Maya, só que eu fiz pra uma versão customizada de MDL, não pra x3d. Queria morrer tentando identificar uma forma adequada de fazer o triangle stripping. dargh. no fim das contas foi sem – o triangle stripping estava comendo 'algumas várias' faces aleatoriamente.
Se não tiver noções de matemática que ao menos tenha uma ótima lógica, senão não rola.
Programar games = niiice… saudade disso.
Danilo Ganzella
September 29, 2010 at 20:51
@ Gilliard
Bem, é claro que existe de fato a parte da matemática que é só "esotérica", como por exemplo, trabalhar em um plano n-dimensional (pra que mais que 3 dimensões?). Entretanto praticamente tudo que eu vi na faculdade tem uma aplicação prática quando se trata de jogos, porque tenho pra mim que jogos imitam a realidade e a deixam mais interessante. Hoje mesmo, saindo da prova de lógica nebulosa (lógica fuzzy) eu fiquei pensando se seria interessante montar o comportamento de inimigos baseadas em variaveis fuzzy. Em um rpg-ação por exemplo, poderia-se entrar com variáveis como "hp do inimigo", "numero de comrades do inimigo", "hp do personagem", "status do inimigo"… e ter uma saída como o "ímpeto do inimigo", e baseado nisso ele pode tomar uma ação (lutar, fugir, usar um last strike). Estou pensando em verificar hoje mesmo se existe API em c++ para o fuzzytech!
@ Yuri Ivatchkovitch
Haha, para não ter erro na hora de exportar as faces é só utilizar sempre o indexedfaceset! (apesar que eu nao sei se existe suporte para este tipo de dado em MDL. despeja-se os vértices sem repetição (para isso pode-se usar o std::set), e depois despeja-se os índices formando os triangulos! haha, o dificil é que o autodesk maya indexa os materiais por-grupo-de-face em cada poligono (que o maya chama de sets) e nao simplesmente por-poligono! as vezes os formatos aceitam apenas um material por poligono – pode-se resolver este problema criando varios poligonos (um por face) ou exportando um poligono para cada grupo-de-faces com o mesmo material em cada poligono (foi o que eu fiz). Complicado neh? eh complicado.. mas sempre que complica pro programador é porque deixa as coisas pro modelador facinhas facinhas (fica bem intuitivo)! :p Ah! como era triste percorrer o grafo de dependencia do autodesk maya… bons tempos hehe…
Gilliard Lopes
September 29, 2010 at 21:16
@Danilo Cara, que coincidência! Minha tese de mestrado na PUC-Rio foi idêntica à tua idéia: utilizei máquinas de estado fuzzy hierárquicas para controlar o comportamento dos inimigos. Devo ter o arquivo no PC que ficou no Brasil… Vi no sistema da PUC que a tese só está disponível internamente… Somente a parte pré-textual está aberta:
http://www2.dbd.puc-rio.br/pergamum/tesesabertas/…
Muito boa sorte na sua pesquisa e atualize a gente sobre os resultados!
Danilo Ganzella
September 30, 2010 at 08:01
@ Gilliard
Haha puxa vida.. me sinto atrasado agora!! (quem mandou eu demorar pra nascer?). Sempre alguém ja pensou em alguma ideia que eu acho que é inovadora (só nao sabia que ia estar tao "perto"). Haha que maneiro.. – ficaria interessado em verificar a sua tese (e eventualmente roubar uns códigos : D). Eu espero aplicar a lógica fuzzy em um rpg que estou desenvolvendo, assim que eu tiver alguma coisa pronta eu vejo um jeito de publicas.Meus professores me convidaram para fazer mestrado em inteligencia artificial, não é aplicado a jogos, mas acredito que talvez valha a pena (eu fico meio disconfiado que se aprenda pouca coisa interessante em mestrado, mas não sei se é só mito).
@ Yuri Ivatchkovitch
Cara, desculpa, em todos os lugares que eu disse polígono eu quis dizer mesh!!
Gilliard Lopes
September 30, 2010 at 11:00
@Danilo Nada disso de se sentir atrasado! Tem muito espaço pra inovação nessa área e mesmo uma técnica já explorada pode servir pra aprendermos muito com uma implementação original.
E por que não utilizar a chance de fazer um mestrado em IA, e aplicar em jogos? Foi o único jeito que eu encontrei de fazer o meu. Se dependesse do orientador ou da faculdade, nunca teria levado pro lado dos games, tive que bater o pé e mostrar que tem muito campo pra pesquisa e inovação em IA aplicada aos jogos. As aulas em si foram interessantes, mas a tese acabou não usando muito o que aprendi nelas; ainda assim, valeu a pena pra mim. Espero que valha pra você também, se decidir por esse caminho.
Quanto ao texto, vasculhei tudo, e não tenho mais acesso ao sistema para alunos da PUC. Devo ir ao Brasil no fim do ano e posso resgatar no meu PC velho, mas até lá acho que vai ser difícil, infelizmente. Se eu achar, te aviso por aqui.
Flavio Meibach
September 30, 2010 at 18:03
Vou até mais longe aqui dizendo que noções de geometria e trigonometria, bem como álgebra, probabilidade e estatística, são muito importantes para game designers também.
Usei muita trigonometria pra definir o posicionamento dos tiles na grid hexagonal do Freekscape e também para explicar aos programadores o funcionamento que eu imaginava para o tridente do Freek, por exemplo.
O Martin deve se lembrar disso. Provavelmente a minha solução para o tridente não foi implementada no fim das contas, mas certamente facilitou a comunicação com o pessoal realmente fera no assunto.
Yuri Ivatchkovitch
September 30, 2010 at 20:03
@Danilo
Então, o problema não é só evitar a a redundância dos vértices, mas sim como organizá-los para poupar a banda da GPU. Triangle stripping é um problema NP completo e divertidissimo para se resolver.
Mas mesmo que esta parte do Maya seja toda cheia de detalhes e entranhas esquisitas eu a achei SENSACIONAL. Mas isso tah um pouco off-topic demais.
Andre "Staltz&q
October 4, 2010 at 11:14
Maturidade em matemática não é necessária para fazer games, mas certamente quem tem maturidade nela vai fazer muito mais do que quem não tem.
Ou seja, quem tem pouca bagagem matemática vai ser um programador mais fraco, ainda que consiga fazer alguma coisa.
A matemática em games vai muito além de trigonometria, álgebra (linear), cálculo, estatística, etc. Claro, esses que eu citei são bem importantes, mas não pára por aí. Acho que Matemática é definida por fatos fundamentais e fatos consequentes. Axiomas e teoremas. E isso é prático no projeto de algoritmos e sistemas que compõem os jogos.
Exemplo. Estou fazendo um jogo puzzle, e nele eu preciso de alguma função para determinar se deu game over ou não. A matemática é bastante útil para provar ou desprovar que minha função de game over está correta. Seria bastante desagradável o jogador receber uma mensagem "game over" quando na verdade ele ainda tem movimentos possíveis para jogar. E no caso do meu jogo, o critério de game over não é tão simples. Matemática é uma forma sistemática de provar fatos.
Quem tem maturidade em Matemática consegue enxergar melhor toda a lógica por trás do jogo.
PS: minha formação é a mesma do Martin, mas continuei no mestrado.
Luiz Carlos
October 6, 2010 at 15:33
Ei galera, existe algum livro de matemática específico para o desenvolvimento de games?
Gilliard Lopes
October 6, 2010 at 17:12
Oi Luiz, tem esse aqui que eu absolutamente recomendo:
3D Math Primer for Graphics and Game Development
http://www.amazon.com/Primer-Graphics-Development…