Vetores no desenvolvimento de jogos

19

Eu sou novo em programação e programação de jogos. Estou lendo algo sobre vetores e matemática, mas tenho uma pergunta - onde uso vetores na programação de jogos? Talvez alguém possa dar um exemplo simples de onde você está usando vetores (em 2D)?

Eu encontrei exemplos, mas na maioria deles eles estão no console onde eles produzem números e grandes exemplos que eu não entendo.

vqwer
fonte
Os vetores TL e DR básicos fazem parte do tópico Álgebra Linear e levam a Matricies. Com Matricies e Linear Algebra, você escreve qualquer coisa, desde um solucionador de minas até uma projeção em 3D do mundo para ver qual objeto está sob o cursor. A Álgebra Linear é o ramo mais útil e necessário da Matemática para qualquer desenvolvedor de jogos. Aprenda agora; você não vai se arrepender.
Robert Massaioli
Obrigado a todos por todas as respostas incríveis! Mas por que algo como não usar vetores neste tutorial ?: zetcode.com/tutorials/javagamestutorial Ou um desenvolvedor usa outro não?
vqwer
Difícil dizer, provavelmente o autor queria mantê-lo simples e básico para iniciantes.
Maik Semder
Na verdade, o autor usa-los, olhar para os pontos-array em class Star aqui
Maik Semder
Também aqui é Point2Dusado emclass ResizeRectangle
Maik Semder

Respostas:

31

O que são vetores?

Vetores são conjuntos de coordenadas de dimensão variável. Cada coordenada em um vetor representa uma posição absoluta nessa direção do espaço em que o vetor está.

  • Um vetor 1-D seria {1} . Pode ser, por exemplo, uma posição em X = 1. Ou um tempo t = 1.
  • Um vetor 2D seria {-4,3} . Pode ser, por exemplo, uma posição em -4 no eixo X e 3 no eixo Y. Também pode ser a temperatura (3 graus) em uma posição (-4 metros) no eixo X.
  • Um vetor 3D seria {1,2,3} . Essa pode ser uma posição no espaço 1 ao longo do eixo X, 2 no eixo Y e 3 no eixo Z. Ou pode ser 1 vermelho, 2 verde e 3 azul em uma cor. Ou, pode ser uma posição XY ( {1,2} ) em algum momento T ( {3} ).

Observe que, em todos os casos, atribuímos significado aos vetores para o nosso problema. Embora você encontre normalmente vetores sendo usados ​​para geometria em jogos, não há razão para que você não possa fazer outra coisa com eles.

Por que eu uso vetores?

Primeiro, você nunca precisa usar vetores. Contanto que você esteja acompanhando xey, ou quaisquer coordenadas de sua preferência, de alguma forma você estará bem.

No entanto, a vantagem de usar vetores é que eles representam perfeitamente coisas como direção e posição e também possuem várias operações matemáticas definidas para facilitar sua vida.

Para um exemplo simples, considere o produto escalar .

Suponha que você tenha um sistema de radar em um jogo de cima para baixo. Todo inimigo que aparecer no setor do radar (algum pedaço em forma de torta em 2D) deve ter um pequeno ponto vermelho na tela. Então, você precisa descobrir quais são os inimigos na sua seção de radar.

Você pode testar se os inimigos estão dentro de um triângulo. Você também pode testar se os inimigos estão contidos na interseção dos dois meios espaços dos planos / linhas que definem os dois lados do setor de radar.

Ou você pode simplesmente usar um produto escalar para fazer a verificação. Aqui está como:

  1. Crie um vetor indo do centro do radar para a "frente do radar". Normalize-o.
  2. Crie um vetor indo do centro do radar para o objeto em que queremos verificar a visibilidade do radar. Normalize-o.
  3. Pegue o produto escalar dos dois vetores normalizados.
  4. Pegue a arccosina desse produto e verifique se ele tem menos da metade do ângulo da largura do radar. Se estiver, desenhe um pontinho.

Isso é muito útil e agora também permite que você tenha facilmente radares que apontam em direções diferentes (apenas altere o vetor para frente) e tenham larguras diferentes (apenas altere o ângulo da largura do radar) - e você também pode reutilizar o mesmo código para esses casos !

Por que mais eu uso vetores?

Se você estiver em 2D, talvez a melhor maneira de obter efeitos e movimentos complexos (rotação, redimensionamento etc.) seja usar um gráfico de cena. Um planeta tem uma nave em órbita, a nave tem um drone em órbita. O cálculo para isso sem usar a matemática vetorial é realmente muito feio.

Com a matemática vetorial, representamos cada uma como tendo um ponto e uma matriz de transformação 3x3. O planeta usa sua transformação, a nave usa sua transformação e a transformação do planeta, e o drone usa sua transformação e a transformação da nave e a transformação do planeta.

Quando o planeta se move, você muda sua transformação, e a nave e o drone são posicionados automaticamente "de graça". Código muito mais limpo.

Ainda não está convencido. Os vetores também são a representação nativa de posição, geometria e movimento usada por quase todas as bibliotecas gráficas - e certamente pelo OpenGL e DirectX. Não é provável que você se afaste sem precisar usá-los.

Conclusão Os vetores são uma ferramenta poderosa para escrever código claro que resolve problemas geométricos de maneira limpa e elegante.

ChrisE
fonte
14

Um exemplo 2D são as coordenadas da tela, identifica um pixel na tela e possui um componente x e um y [x, y], isto é, posição superior esquerda da tela [0, 0]

Outro exemplo: imagine um texto rolando da borda direita da tela para a borda esquerda da tela. Agora você precisa definir a velocidade do texto de rolagem em pixels por segundo, ou seja, [-20, 0], o que significa que o texto rola 20 pixels para a esquerda por segundo e nunca altera a altura.

Outro exemplo mais avançado: imagine um jogo 2D que deve rodar em diferentes resoluções de tela 800x600, 1024x768 etc. Isso pode ser feito facilmente usando internamente uma largura de tela de 0,0 a 1,0 e uma altura de 0,0 a 1,0 para desacoplar a lógica do jogo da resolução de tela real. Agora, quando você desenha na tela, basta multiplicar o vetor interno pelo vetor de resolução:

screen_pos = internal_pos * screen_ressolution

note, todas as 3 variáveis ​​são vetores 2D aqui, elas têm um componente x e um y, ou seja, para este internal_pos [0,5, 0,25]:

[400, 150] = [0.5, 0.25] * [800, 600]

Portanto, a posição interna [0,5, 0,25] é transformada na posição atual da tela [400, 150]

Esse era o material básico. A verdadeira vantagem dos vetores é a aplicação na Álgebra Linear, na qual você pode usar matrizes para transformar seus vértices (girar, escalar, espelhar etc.), ou seja, para girar facilmente toda a sua posição interna em 90 graus, ou você deve trocar a tela-y posição 0 de cima para baixo na tela, porque, por exemplo, uma biblioteca de terceiros que você usa, usa esta convenção.

Maik Semder
fonte
Um vetor não é uma matriz de dimensão única, como uma lista de algum tipo? Quando estamos falando sobre resolução de tela, não estamos falando de matriz multidimensional (uma coordenada para cada eixo X e Y)? Apenas para garantir que 'vetor' não seja misturado com uma matriz aqui. =)
Will Marcouiller
@Will os dados de pixel completas para a tela pode ser tratada como uma matriz multidimensional, basicamente, um mapa de bits, mas os valores de largura e altura, ou seja, a resolução, não podem
Maik Semder
2
Observe que um vetor é frequentemente tratado de maneira bastante diferente em matemática e em programação. Matematicamente falando, um vetor não é uma matriz multidimensional, embora seus componentes em relação a alguma base juntos definam essa matriz. O próprio vetor é coordenado invariável. A operação nãoscreen_pos = internal_pos * screen_resolution é invariável por coordenadas da maneira que você a escreveu, poderia ser escrita de maneira mais apropriada , onde há um mapeamento linear (que pode ser escrito como uma matriz, neste caso diagonal). screen_pos = map_to_screen * internal_posmap_to_screen
usar o seguinte código
6

Aqui está uma ótima explicação de vetores no desenvolvimento de jogos no blog da Wolfire Games:

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

jhocking
fonte
Atualmente, esta é uma resposta apenas para link. Por favor, considere incluir um resumo dos principais pontos que você espera que um leitor possa coletar nesse link, para que a resposta possa permanecer por si mesma, mesmo que o link mude, quebre ou fique indisponível no futuro.
DMGregory
1

Um vetor é uma entidade que possui um valor e uma direção. Exemplos de vetores no mundo real e jogos baseados em física incluem velocidade e momento. As propriedades que possuem apenas valores, mas sem direção, são chamadas de escalares e incluem localização, massa, densidade e assim por diante.

Os vetores são necessários para jogos que emulam propriedades físicas semelhantes a vetores (como mencionado - velocidade, aceleração e assim por diante). A matemática usada para cálculos de vetores é chamada álgebra linear .

Eran Galperin
fonte
A velocidade é um escalar, é o comprimento do vetor velocidade
Maik Semder
Correto - corrigido
Eran Galperin 03/06
1
e a localização geralmente é considerada como vetor, a distância é escalar.
Jun1
A posição pode ser considerada um escalar (ou uma coleção de escalares) ou um vetor que está apontando do ponto inicial do eixo.
Eran Galperin
1

Em qualquer lugar em que você tenha um número para cada dimensão para representar algo, a coleção desses números pode ser considerada um vetor. Posição, velocidade e aceleração são os principais exemplos de vetores. Em alguns casos, também pode ser prático representar a direção da face como um vetor.

Para coisas básicas, não importa se você considera esses números vetores ou não, mas se deseja fazer algum tipo de física, deve procurar a matemática vetorial.

aaaaaaaaaaaa
fonte
Posição não é um vetor
Eran Galperin
Nem é a velocidade, a um escalar, a velocidade é um vector
Maik Semder
2
@Eran Galperin Eu sei que essa é uma visão bastante difundida entre os matemáticos. A distinção entre um ponto e seu vetor de posição correspondente é, no entanto, bastante acadêmica. Não há razão prática para se preocupar com a distinção.
Aaaaaaaaaaa
1
Há razões práticas, uma vez que você trabalhar com 4D coordenadas homogênea e matrizes, você tem de fazer essa distinção. Embora não seja relevante para o escopo desta questão.
Maik Semder
@eBusiness não é uma "visão", é um fato. E sou físico por educação, não matemático.
Eran Galperin
0

Muito simplesmente, qualquer coisa com uma posição ou uma direção, que esteja em todo lugar no jogo, eles usam vetores. Um vetor é como um ponto

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

No entanto, a diferença realmente se resume a isso. Um ponto é apenas um ponto, enquanto um vetor é uma seta.

se você tem

Point2.x = 5;

Point2.y = 10;

você está dizendo que eu quero dizer neste local x 5 e y 10.

no entanto, quando você declara um vetor ...

Vector2.x = 5;

Vector2.y = 10; 

Você realmente está dizendo que estou declarando uma flecha de 0,0 a x 5, y 10;

você pode até ter o ponto do qual seu vetor está apontando para ser um ponto no espaço de qualquer lugar, por exemplo, vamos usar um ponto e um vetor para mover nosso objeto, usaremos um Point2 para armazenar sua localização e um vector2 para movê-lo .

point2.x = 10;

point2.y = 15;

agora você pode usar um vetor para mover esse ponto, digamos que queremos mover esse ponto para cima do eixo x 10 unidades para que você tenha

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

Agora, o point mudou para onde sua seta de vetor disse.

ponto agora é

point2.x = 20;

point2.y = 15;

Uma última coisa a observar é que, às vezes, um vetor é usado como um ponto e vice-versa, apenas porque eles mantêm o mesmo tipo de dados.

EddieV223
fonte
Um ponto é um vetor. É um vetor a partir da origem até o ponto P.
A Comunista Duck
1
@Duck tecnicamente falando que não é correto, referindo-se coordenadas homogêneas que vector pode ser encontrado subtraindo o origin_point do position_point, mas isso não os torna iguais: v = pos - originassim v != posdesde origem é um ponto{0, 0, 0, 1}
Maik Semder
@ Duck: Um ponto não é um vetor, mas um ponto e a origem definir um vetor, que é tão bom quanto a maioria do tempo se sua origem é 0.
@ Duck, então por que você chamou seu ponto P? LOL
EddieV223