Vectores en desarrollo de juegos

19

Soy nuevo en programación y programación de juegos. He leído algo sobre vectores y matemáticas, pero tengo una pregunta: ¿dónde uso vectores en la programación de juegos? ¿Quizás alguien puede dar un ejemplo simple en el que está utilizando vectores (en 2D)?

He encontrado ejemplos, pero en su mayoría están en la consola donde generan números, y grandes ejemplos que no entiendo.

vqwer
fuente
TL básico; los vectores DR son parte del tema de Álgebra lineal y conducen a matrículas. Con Matricies and Linear Algebra puedes escribir cualquier cosa, desde un solucionador de Buscaminas hasta una proyección mundial en 3D para ver qué objeto está debajo de tu cursor. Linear Algebra es la rama individual más útil y necesaria de Mathematics para cualquier desarrollador de juegos. Aprendelo ahora; no te arrepentirás.
Robert Massaioli
¡Gracias a todos por todas las respuestas de awesome! Pero, ¿por qué algo como no usar vectores en este tutorial ?: zetcode.com/tutorials/javagamestutorial ¿ O un desarrollador usa otro no?
vqwer
Difícil de decir, probablemente el autor quería mantenerlo simple y básico para principiantes.
Maik Semder
En realidad, el autor los usa, mira la matriz de puntos class Star aquí
Maik Semder
También aquí se Point2Dutiliza enclass ResizeRectangle
Maik Semder

Respuestas:

31

¿Qué son los vectores?

Los vectores son conjuntos de coordenadas de dimensión variable. Cada coordenada en un vector representa una posición absoluta en esa dirección del espacio en el que se encuentra el vector.

  • Un vector 1-D sería {1} . Esto podría ser, por ejemplo, una posición en X = 1. O un tiempo t = 1.
  • Un vector 2-D sería {-4,3} . Esto podría ser, por ejemplo, una posición en -4 en el eje X y 3 en el eje Y. También podría ser la temperatura (3 grados) en una posición (-4 metros) en el eje X.
  • Un vector tridimensional sería {1,2,3} . Esta podría ser una posición en el espacio 1 a lo largo del eje X, 2 hacia atrás en el eje Y y 3 hacia arriba en el eje Z. O podría ser 1 rojo, 2 verdes y 3 azules en un color. O podría ser una posición XY ( {1,2} ) en algún momento T ( {3} ).

Tenga en cuenta que en todos los casos, hemos asignado significado a los vectores para nuestro problema. Si bien comúnmente encontrarás vectores que se usan para la geometría en los juegos, no hay razón para que no puedas hacer otra cosa con ellos.

¿Por qué uso vectores?

Primero, nunca tienes que usar vectores. Siempre que realice un seguimiento de x e y, o de las coordenadas que le interesen, de alguna manera estará bien.

Sin embargo, la ventaja de usar vectores es que representan claramente cosas como la dirección y la posición, y también tienen varias operaciones matemáticas definidas en ellos que hacen su vida más fácil.

Para un ejemplo simple de estos, considere el producto punto .

Supongamos que tiene un sistema de radar en un juego de estilo de arriba hacia abajo. Cada enemigo que aparece en el sector del radar (una cuña en forma de pastel en 2D) debería tener un pequeño punto rojo en la pantalla. Entonces, debes descubrir qué enemigos hay en tu sección de radar.

Podrías probar si los enemigos están dentro de un triángulo. También podría probar si los enemigos están contenidos en la intersección de los dos medios espacios de los planos / líneas que definen los dos lados del sector del radar.

O bien, puede usar un producto de puntos para hacer la verificación. Así es cómo:

  1. Cree un vector que vaya desde el centro del radar hacia el "frente del radar". Normalizarlo
  2. Cree un vector que vaya desde el centro del radar hacia el objeto del que queremos verificar la visibilidad del radar. Normalizarlo
  3. Tome el producto escalar de los dos vectores normalizados.
  4. Tome el arcocoseno de ese producto y verifique si tiene menos de la mitad del ángulo del ancho del radar. Si es así, dibuja un blip.

Esto es muy útil, y ahora también le permite tener fácilmente radares que apuntan en diferentes direcciones (solo cambie el vector de avance) y tengan diferentes anchos (solo cambie el ángulo de ancho del radar), y también puede reutilizar el mismo código para esos casos !

¿Por qué si no uso vectores?

Si está en 2D, quizás la mejor manera de lograr efectos y movimientos complejos (girar, escalar, etc.) es usar un gráfico de escena. Un planeta tiene una nave en órbita, la nave tiene un avión no tripulado en órbita. El cálculo para esto sin usar matemáticas vectoriales es realmente feo.

Con las matemáticas vectoriales, representamos que cada uno tiene un punto y una matriz de transformación 3x3. El planeta usa su transformación, la nave usa su transformación y la transformación del planeta, y el dron usa su transformación y la transformación de la nave y la transformación del planeta.

Cuando el planeta se mueve, cambias su transformación, y la nave y el dron se posicionan automáticamente "gratis". Mucho código más limpio.

Todavía no está convencido. Los vectores también son la representación nativa de la posición, la geometría y el movimiento que utilizan casi todas las bibliotecas de gráficos, y ciertamente OpenGL y DirectX. No es probable que salgas sin tener que usarlos.

Conclusión Los vectores son una herramienta poderosa para escribir código claro que resuelve problemas geométricos de manera limpia y elegante.

ChrisE
fuente
14

Un ejemplo 2D son las coordenadas de la pantalla, identifica un píxel en la pantalla y tiene un componente xy y [x, y], es decir, la posición superior izquierda de la pantalla [0, 0]

Otro ejemplo: imagine un texto desplazándose desde el borde derecho de la pantalla al borde izquierdo de la pantalla. Ahora debe definir la velocidad del texto de desplazamiento en píxeles por segundo, es decir, [-20, 0], lo que significa que el texto se desplaza 20 píxeles a la izquierda por segundo y nunca cambia la altura.

Otro ejemplo más avanzado: imagina un juego 2D que se supone que se ejecuta en diferentes resoluciones de pantalla 800x600, 1024x768, etc. Esto se puede hacer fácilmente usando internamente un ancho de pantalla de 0.0 a 1.0 y una altura de 0.0 a 1.0 para desacoplar la lógica del juego de la resolución de pantalla real. Ahora, cuando dibujas en la pantalla, simplemente multiplicas el vector interno con el vector de resolución:

screen_pos = internal_pos * screen_ressolution

tenga en cuenta que las 3 variables son vectores 2D aquí, tienen un componente xy y, es decir, para este internal_pos [0.5, 0.25]:

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

Entonces la posición interna [0.5, 0.25] se transforma a la posición real de la pantalla [400, 150]

Esto fue lo básico. La verdadera ventaja de los vectores es la aplicación en Álgebra Lineal donde puedes usar matrices para transformar tus vértices (rotar, escalar, espejo, etc.), es decir, rotar fácilmente toda tu posición interna en 90 grados, o tienes que cambiar la pantalla y posición 0 de arriba a abajo de la pantalla, porque es decir, una biblioteca de terceros que utiliza, utiliza esta convención.

Maik Semder
fuente
¿No es un vector una matriz de una sola dimensión, como una lista de algún tipo? Cuando hablamos de resolución de pantalla, ¿no estamos hablando de una matriz multidimensional (una coordenada para cada eje X e Y)? Solo para asegurarse de que 'vector' no esté mezclado con una matriz aquí. =)
Will Marcouiller
@Los datos completos de píxeles para la pantalla se pueden tratar como una matriz multidimensional, básicamente un mapa de bits, pero los valores de ancho y alto, en otras palabras, la resolución, no se pueden
Maik Semder
2
Tenga en cuenta que un vector a menudo se trata de manera bastante diferente en matemáticas y en programación. Matemáticamente hablando, un vector no es una matriz multidimensional, aunque sus componentes con respecto a alguna base juntos definen dicha matriz. El vector en sí mismo es una coordenada invariante. La operación noscreen_pos = internal_pos * screen_resolution es una coordenada invariante de la forma en que la ha escrito, podría escribirse más apropiadamente screen_pos = map_to_screen * internal_pos, donde map_to_screenhay un mapeo lineal (que puede escribirse como una matriz, en este caso una diagonal).
Leftaroundabout
6

Aquí hay una gran explicación de los vectores en el desarrollo de juegos en el blog de Wolfire Games:

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

jhocking
fuente
Esta es actualmente una respuesta de solo enlace. Considere incluir un resumen aproximado de los puntos principales que espera que un lector pueda obtener de este enlace, de modo que la respuesta pueda mantenerse por sí misma incluso si el enlace cambia, se rompe o deja de estar disponible en el futuro.
DMGregory
1

Un vector es una entidad que tiene tanto un valor como una dirección. Los ejemplos de vectores en el mundo real y los juegos basados ​​en la física incluyen la velocidad y el impulso. Las propiedades que solo tienen valores pero no tienen dirección se denominan escalares e incluyen ubicación, masa, densidad, etc.

Los vectores son necesarios para los juegos que emulan propiedades físicas similares a los vectores (como se mencionó: velocidad, aceleración, etc.). Las matemáticas que se usan para los cálculos vectoriales se denominan álgebra lineal .

Eran Galperin
fuente
La velocidad es escalar, es la longitud del vector de velocidad
Maik Semder
Correcto - arreglado
Eran Galperin
1
y la ubicación generalmente se considera como vector, su distancia es escalar.
Ali1S232
La posición puede considerarse un escalar (o una colección de escalares) o un vector que apunta desde el punto de inicio del eje.
Eran Galperin
1

En cualquier lugar donde tenga un número para cada dimensión que represente algo, la colección de estos números puede considerarse un vector. Posición, velocidad y aceleración son los principales ejemplos de vectores. En algunos casos, también puede ser práctico representar la dirección de la orientación como un vector.

Para cosas básicas, en realidad no importa si consideras o no estos números como vectores, pero si quieres hacer algún tipo de física, deberías considerar las matemáticas vectoriales.

aaaaaaaaaaaa
fuente
La posición no es un vector
Eran Galperin
Tampoco es la velocidad, es un escalar, la velocidad es un vector
Maik Semder
2
@Eran Galperin Sé que es una visión bastante extendida entre los matemáticos. Sin embargo, la distinción entre un punto y su vector de posición correspondiente es bastante académica. No hay ninguna razón práctica para hacer un escándalo por la distinción.
aaaaaaaaaaaa
1
Hay razones prácticas, una vez que se trabaja con coordenadas 4D homogenious y matrices, que tiene que hacer esa distinción. Aunque no es relevante para el alcance de esta pregunta.
Maik Semder
@eBusiness no es una "vista", es un hecho. Y soy físico por educación, no matemático.
Eran Galperin
0

Muy simple, cualquier cosa con una posición o una dirección, que está en todas partes en un juego, usan vectores. Un vector es como un punto

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

Sin embargo, la diferencia realmente se reduce a esto. Un punto es solo un punto, mientras que un vector es una Flecha.

si usted tiene

Point2.x = 5;

Point2.y = 10;

Dices que quiero decir en este lugar x 5 y y 10.

sin embargo cuando declaras un vector ...

Vector2.x = 5;

Vector2.y = 10; 

Estás diciendo que estoy declarando una flecha de 0,0 a x 5, y 10;

incluso puede hacer que el punto desde el que apunta su vector sea un punto en el espacio desde cualquier lugar, por ejemplo, usemos un punto y un vector para mover nuestro objeto, usaremos un Punto2 para almacenar su ubicación y un vector2 para moverlo .

point2.x = 10;

point2.y = 15;

ahora puede usar un vector para mover este punto, digamos que queremos mover este punto hacia arriba del eje x 10 unidades para que tenga

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

ahora el punto se ha movido donde su flecha vectorial lo indicó.

punto ahora es

point2.x = 20;

point2.y = 15;

Una última cosa a tener en cuenta es que a veces un vector se usa como un punto y viceversa solo porque contienen el mismo tipo de datos.

EddieV223
fuente
Un punto es un vector. Es un vector desde el origen hasta el punto P.
El pato comunista
1
@Duck técnicamente hablando eso no es correcto, refiriéndose a las coordenadas homogéneas de que el vector se puede encontrar restando el punto de origen del punto de posición, pero eso no los hace iguales: v = pos - originpor lo tanto, v != posdado que el origen es un punto{0, 0, 0, 1}
Maik Semder
@Duck: punto A no es un vector sino un punto y el origen definen un vector, que es tan buena como la mayor parte del tiempo si su origen es 0.
@Duck entonces ¿por qué lo llamaste tu punto P? LOL
EddieV223