Além dos projetos de jogos "iniciantes"

22

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.

Mike C
fonte
1
O khanacademy.org é ótimo para aprender matemática para iniciantes e avançados. Além disso, há conquistas! Nada como a teoria dos jogos para animar qualquer academia chata.
Deceleratedcaviar

Respostas:

16

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:

float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.

Depois disso, você simplesmente aplicaria a velocidade à posição de cada quadro:

// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

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:

const float gravity = 9.8f; // The gravity of the earth.

// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

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áveis fxe fypara 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).

Jonathan Dickinson
fonte
Gosto da sua ideia de inserir lag artificial para testes. Além disso, a gravidade da Terra é de 9,8, e não de 9,1 #
Steve Steve
Tenha cuidado com "não modele o que você acha que acontece, modele o que acontece", a menos que você esteja escrevendo uma simulação real. Escale conforme necessário para o seu projeto. Às vezes "o que você acha que acontece" é uma boa resposta para o seu design.
Home
@chaosTechnician neste nível "o que você acha que acontece" é object.position++. Vou esclarecer a resposta.
Jonathan Dickinson
-1 para 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.
BlueRaja # Danny Pflughoeft 9/11/11
3
@ BlueRaja-DannyPflughoeft é exatamente o que eu expliquei para ele: não conhecer a equação em primeiro lugar significa que você nunca pode entender - e a única maneira de entendê-las é usá-las em uma situação real.
Jonathan Dickinson
3

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 é diferente object.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:

  1. Eu considerei fazer um curso de álgebra linear, mas minha carga de trabalho já é bastante pesada, então não pude justificar o trabalho extra.
  2. Minha compreensão da álgebra linear cresceu muito mais significativamente, pois participei de uma série de aulas de programação de mecanismos de jogos. Para mim, o uso de vetores, matrizes etc. tem sido (de modo geral) mais prevalente no lado do motor do que no lado do jogo. Claro, isso não quer dizer que não usei matrizes no código do jogo - apenas não as uso com a mesma frequência que utilizo na codificação do mecanismo. ymmv
  3. Também há muitos livros que podem ajudá-lo a entender a matemática que você precisa saber. Eu gosto deste livro que tem um capítulo intitulado "Matemática 3D para jogos".

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.

caosTécnico
fonte
0

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.

Engenheiro
fonte
0

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.

ChrisC
fonte
0

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!

BlueRaja - Danny Pflughoeft
fonte