Eu estava lendo esta resposta sobre o tipo de matemática que um desenvolvedor de jogos deveria conhecer e essa parte realmente se destacou para mim:
How do I move my game object? The novice might say:
"I know! I'll just do:" object.position.x++.
É assim que eu pensaria em fazê-lo, então acho que isso mostra o meu nível de habilidade. Pelo menos para os tipos de jogos 2D de rolagem lateral e estilo arcade que eu fiz no passado, é tudo o que eu precisava. Isso e um pouco de trigonometria.
Na verdade, não usei muita álgebra linear nem ouvi falar de quaternions antes de ler esse post. É porque essas matemáticas não aparecem até você trabalhar com 3D ou é porque meus jogos 2D são bastante simples que eu me livrei de implementações ingênuas.
Pergunta de acompanhamento: Se eu quiser me familiarizar com esse tipo de matemática, que tipo de projetos devo realizar? IE: escreva um mecanismo de jogo, trabalhe em um jogo 3D etc.
fonte
Respostas:
O verdadeiro truque disso é a ciência no ensino médio; o que você deveria ter feito. Caso você não tenha feito uma pesquisa rápida no Google, você começará . Para explicar como você evita a mentalidade de 'iniciante', veja o exemplo do módulo lunar .
Depois de ler
[change in position] = [velocity] * [time passed]
, fica claro que seria necessário acompanhar essas variáveis:Depois disso, você simplesmente aplicaria a velocidade à posição de cada quadro:
Agora, gostaríamos de alterar a velocidade de cada quadro para adicionarmos a gravidade. De acordo com a mesma fonte exata
[change in velocity] = [acceleration] * [time passed]
. Portanto, podemos aplicar exatamente o mesmo princípio:Agora você precisa de uma maneira para o jogador controlar sua nave espacial. Ao ler mais sobre física básica, você aprenderá que o movimento é o resultado da força - não consigo encontrar uma fonte, mas
[change in acceleration] = ([force] / [mass]) * time
(pelo que me lembro). Portanto, quando o jogador pressiona uma tecla, basta definir as variáveisfx
efy
para algo e aplicar a equação durante a atualização.Por fim, você precisa pensar sobre a física em torno dos objetos em seu jogo - e, em vez de tentar fazê-los se mover da maneira que você pensaria, procure a equação .
Nota futura: Lembre - se de que essa definitivamente não é a melhor maneira de fazer física (isso é chamado de Integração de Euler e pode levar a alguns cenários estranhos a taxas de quadros baixas) - você precisa procurar outras maneiras de fazer as coisas (esse artigo tem bastante boa redação sobre o básico básico). No entanto, fique com a Integração Euler por enquanto, pois significa que você está tentando aprender uma coisa menos.
Quais jogos o ensinariam a pensar na mentalidade correta?
Como você testaria se fez as coisas corretamente e com a mentalidade correta? Insira um
Sleep(10 milliseconds)
no loop do jogo e tudo ainda deve se mover e reagir da mesma maneira que a taxa de quadros completa.Por fim, mantenha-se afastado do 3D (e, portanto, Quaternions e Matrizes) até ter uma boa experiência em fazer jogos 2D funcionarem. Atrevo-me a dizer que alguns desenvolvedores de jogos não sabem realmente como Quaternions ou Matrices funcionam - mas apenas sabem como usá-los - os abordam muito mais tarde (ou nunca, jogos 2D são muito divertidos e podem ser bastante bem sucedido). Você realmente não precisa conhecer álgebra linear e assim por diante para fazer isso no nível básico (mas isso realmente ajuda, então vá a algumas aulas noturnas, se puder).
Bônus final: Uma coisa que meu professor de arte sempre me disse é "não desenhe o que acha que vê, desenhe o que vê". O mesmo se aplica aqui "não modele o que você acha que acontece (
object.position++
), modele o que acontece (` object.position + = velocity * time) "- pelo menos até limites razoáveis (você não está modelando um sistema perfeitamente preciso, mas faça algo que é uma boa imitação).fonte
object.position++
. Vou esclarecer a resposta.instead of trying to make them move in the way you would think, rather look up the equation
. É sobre entender as equações, não procurá-las. O mais importante é tornar o jogo divertido e, quem sabe, talvez você ache alguma aceleração variável torna a gravidade mais divertida. Mas será muito difícil pensar em como fazer isso se você não entender as equações.Acho que partes da resposta a que você vinculou são um pouco elitistas em sua apresentação. Exaltar as virtudes da matemática vetorial e dizer que um objeto precisa de uma posição, direção e aceleração é inconsistentemente específico, porque na verdade tudo se resume a algo como
object.position.x += (object.velocity.x + object.acceleration.x) * deltaTime
- do qual, fundamentalmente, isso não é diferenteobject.position.x++
. Quaternions são uma das muitas maneiras de representar rotações; Eu gosto deles, mas eles não são essenciais para entender as rotações em 3D. Apesar do que muitos usuários do Quaternion implicam, eles não são o Santo Graal da matemática rotacional.Os princípios da álgebra linear estão presentes em movimentos 2D simples, rotação etc., mas a matemática é mais simples, porque existem apenas duas dimensões. Aqui está um exemplo .
Existem várias maneiras de aprender / aprimorar seu conhecimento de álgebra linear:
Por fim, se o design de seus jogos não exige matemática complexa, não a use. :) Mas, é claro, não deixe que isso o impeça de criar um jogo que funcione.
fonte
Quaternions para 2D seria um exagero completo, para não mencionar computacionalmente muito caro. A rotação de bitmap (2D) é manipulada implicitamente por muitas plataformas / bibliotecas, porque é tão fundamental escrever qualquer aplicativo, e mesmo onde não é, a rotação de bitmaps 2D não passa de um simples gatilho. Em 3D, as coisas se tornam consideravelmente menos intuitivas para o ser humano comum, a menos que o ser humano tenha crescido escrevendo código 3D quando deveria estar andando de bicicleta.
A álgebra linear é aplicável ao 2D e ao 3D e deve ser algo com o qual você esteja familiarizado, mesmo que tenha feito apenas matemática no ensino médio. Se você já fez interseções de linhas ou plotagem periódica em uma linha (integração), usou álgebra linear.
O aprendizado da matemática 3D geralmente começa com a colocação de um objeto simples (como um cubo) no espaço 3D e a implementação de uma câmera móvel que pode ver esse objeto de diferentes perspectivas, e essa perspectiva pode começar ortogonal para manter as coisas ainda mais simples. Trata-se de projetar pontos em um plano 3D que representa sua tela (fórmula aqui , você poderia estender isso aos eixos x e z além de y). Realmente, esse é o começo de escrever qualquer mecanismo 3D, independentemente do seu nível de experiência. Flash e Processing.js são duas ótimas maneiras de prototipar algo assim facilmente.
fonte
Você está certo de que a álgebra linear e a matemática mais complexa geralmente envolvem gráficos 3D e espaço 3D. Mas ainda há mais matemática que pode ser feita nos jogos 2D. A matemática da física pode ser bastante complicada, e fica mais complexa se você considerar a física do corpo mole e a dinâmica da spline B (e ainda em 2D, lembre-se)
Tente criar ou dissecar uma biblioteca de física que cubra o manuseio e a resposta de colisões para formas 2D comuns. A álgebra linear é bastante útil para calcular vetores de trajetória para colisões. O produto escalar está bastante relacionado ao círculo unitário usado na trigonometria. No entanto, a complexidade da física do corpo rígido aumenta exponencialmente ao aplicá-la em 3D.
Os gráficos 3D oferecem uma melhor compreensão dos cálculos de matriz, quaternions, álgebra linear e alguns cálculos aplicados. A primeira coisa que você provavelmente entenderá é usar matrizes para mover e manipular objetos no espaço 3D.
fonte
Se você está escrevendo jogos 2D, provavelmente já está usando álgebra linear ... simplesmente não o conhece! Aprender formalmente pelo menos o básico sobre vetores é bastante fácil, mas ajuda bastante na simplificação do pensamento sobre movimentos complexos.
Por exemplo, temos muitas perguntas aqui sobre quais equações usar para simular o movimento curvo, como para um tiro de bala de canhão de um canhão ou um míssil. Mas se você entende os vetores, a única "equação" necessária é a de adicionar dois vetores. Não apenas isso, mas adicionar itens como atrito ou atrito se torna incrivelmente simples - basta calcular o vetor de arrasto e adicioná-lo à velocidade. Presto!
fonte