Más allá de los proyectos de juegos "novatos"


22

Estaba leyendo esta respuesta sobre el tipo de matemáticas que un desarrollador de juegos debería saber y esta parte realmente me llamó la atención:

How do I move my game object? The novice might say:

"I know! I'll just do:" object.position.x++.

Así es como pensaría hacerlo, así que supongo que eso muestra mi nivel de habilidad. Al menos para los tipos de juegos de arcade de desplazamiento lateral en 2D que hice en el pasado, eso es todo lo que necesitaba. Eso y un poco de trigonometría.

De hecho, no he usado mucho álgebra lineal ni he oído hablar de cuaterniones antes de leer esa publicación. Es porque estas matemáticas no aparecen hasta que trabajas con 3D o porque mis juegos en 2D son bastante simples por lo que me salí con implementaciones ingenuas.

Pregunta de seguimiento: si quiero familiarizarme con ese tipo de matemáticas, ¿qué tipo de proyectos debo emprender? IE: escribir un motor de juego, trabajar en un juego en 3D, etc.


1
khanacademy.org es ideal para aprender matemáticas principiantes y avanzadas. Además hay logros! Nada como la teoría de juegos para animar a una academia aburrida.
desaceleratedcaviar

Respuestas:


16

El verdadero truco con esto es la ciencia de nivel secundario; que deberías haber hecho. En caso de que no haya realizado una búsqueda rápida en Google, comenzará . Para explicar cómo evitar la mentalidad de "novato", tome el ejemplo del módulo de aterrizaje lunar .

Una vez que haya leído que [change in position] = [velocity] * [time passed]queda claro que necesitaría realizar un seguimiento de esas variables:

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

Después de eso, simplemente aplicaría la velocidad a la posición de cada cuadro:

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

Ahora nos gustaría alterar la velocidad de cada cuadro para poder agregar gravedad. Según la misma fuente exacta [change in velocity] = [acceleration] * [time passed]. Por lo tanto, podemos aplicar exactamente el mismo principio:

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;

Ahora necesitas una forma para que el jugador controle su nave espacial. Al leer más sobre física básica, aprenderá que el movimiento es el resultado de la fuerza; no puedo encontrar una fuente, pero [change in acceleration] = ([force] / [mass]) * time(por lo que recuerdo). Entonces, cuando el jugador presiona una tecla, simplemente establecería las variables fxy fyen algo y aplicaría la ecuación durante su actualización.

En última instancia, debes pensar en la física alrededor de los objetos en tu juego, y en lugar de tratar de hacer que se muevan de la manera que pensarías, en lugar de buscar la ecuación .

Nota futura: recuerde que esta definitivamente no es la mejor manera de hacer física (esto se llama Integración de Euler y puede conducir a algunos escenarios extraños a bajas tasas de cuadros): debe buscar otras formas de hacer las cosas (ese artículo tiene bastante buen artículo sobre lo básico también). Sin embargo, quédese con Euler Integration por ahora, ya que significa que está tratando de aprender una cosa menos.

¿Qué juegos te enseñarán a pensar con la mentalidad correcta?

¿Cómo probarías que has hecho las cosas correctamente y con la mentalidad correcta? Inserte un Sleep(10 milliseconds)en su bucle de juego y todo debería moverse y reaccionar de la misma manera que la velocidad de fotogramas completa.

Finalmente, manténgase alejado de 3D (y aplique Quaternions y Matrices) hasta que tenga una buena experiencia en hacer que los juegos 2D funcionen. Me aventuraría a decir que muchos desarrolladores de juegos en realidad no saben cómo funcionan Quaternions o Matrices, pero simplemente saben cómo usarlos, se acercan a ellos mucho más tarde (o nunca, los juegos 2D son muy divertidos y pueden ser bastante exitoso). Realmente no necesitas saber álgebra lineal y demás para hacer esto en el nivel básico (pero realmente ayuda, así que ve a algunas clases nocturnas si puedes).

Bonificación final: una cosa que mi maestro de arte siempre me dijo es "no dibujes lo que crees que ves, dibuja lo que ves". Lo mismo se aplica aquí "no modeles lo que crees que sucede ( object.position++), modela lo que sucede (` object.position + = velocity * time) "- al menos a límites razonables (no estás modelando un sistema perfectamente preciso, pero haz algo que es una buena imitación).


Me gusta tu idea de insertar un retraso artificial para las pruebas. Además, la gravedad de la Tierra es 9.8, no 9.1
Steve

Tenga cuidado con "no modele lo que cree que sucede, modele lo que sucede" a menos que esté escribiendo una simulación real. Escale según sea necesario para su proyecto. A veces "lo que crees que sucede" es una buena respuesta para tu diseño.
chaosTechnician

@chaosTechnician en este nivel "lo que crees que sucede" es object.position++. Aclararé la respuesta.
Jonathan Dickinson el

-1 para instead of trying to make them move in the way you would think, rather look up the equation. Se trata de comprender las ecuaciones, no buscarlas. Lo más importante es hacer que el juego sea divertido, y quién sabe, tal vez encuentres que una aceleración variable hace que la gravedad sea más divertida. Pero va a ser muy difícil razonar cómo hacerlo si no comprende las ecuaciones.
BlueRaja - Danny Pflughoeft

3
@ BlueRaja-DannyPflughoeft eso es exactamente lo que le expliqué: no conocer la ecuación en primer lugar significa que nunca puedes entenderla, y la única forma de entenderlas es usarlas en una situación real.
Jonathan Dickinson el

3

Creo que partes de la respuesta a la que se vinculó son un poco elitistas en su presentación. Explotar las virtudes de las matemáticas vectoriales y luego decir que un objeto necesita una posición, dirección y aceleración es inconsistentemente específico porque realmente se reducirá a algo como lo object.position.x += (object.velocity.x + object.acceleration.x) * deltaTimeque, fundamentalmente, no es tan diferente object.position.x++. Los cuaterniones son una de las muchas formas de representar rotaciones; Me gustan, pero no son esenciales para comprender las rotaciones 3D. A pesar de lo que implicarán muchos usuarios de Quaternion, no son el Santo Grial de las matemáticas rotacionales.

Los principios del álgebra lineal están presentes en el movimiento 2D simple, rotación, etc., pero las matemáticas son más simples porque solo hay dos dimensiones. Aquí hay un ejemplo .

Hay muchas maneras de aprender / mejorar su conocimiento de álgebra lineal:

  1. He considerado tomar un curso de álgebra lineal, pero mi carga de cursos ya es bastante pesada, así que no he podido justificar el trabajo extra.
  2. Mi comprensión del álgebra lineal ha crecido mucho más significativamente a medida que tomé una serie de clases de programación de motores de juegos. Para mí, el uso de vectores, matrices, etc. ha sido (generalmente hablando) más frecuente en el lado del motor de las cosas que en el lado del juego. Por supuesto, eso no quiere decir que no haya usado matrices en el código del juego, simplemente no las uso con tanta frecuencia como en la codificación del motor. ymmv
  3. También hay muchos libros que también pueden ayudarlo a comprender las matemáticas que necesitaría saber. Me gusta este libro que tiene un capítulo titulado "Matemáticas 3D para juegos".

Por último, si el diseño de tus juegos no requiere las matemáticas complejas, no lo uses. :) Pero, por supuesto, no dejes que eso te impida profundizar en el diseño de un juego que sí lo haga.


0

Quaternions para 2D sería una exageración total, sin mencionar que computacionalmente es demasiado costoso. La rotación de mapas de bits (2D) es manejada por una gran cantidad de plataformas / bibliotecas implícitamente, porque es muy fundamental para escribir cualquier aplicación, e incluso donde no está, la rotación de mapas de bits 2D no es más que un simple trigonometraje. En 3D, las cosas se vuelven considerablemente menos intuitivas para el ser humano promedio, a menos que, por supuesto, dicho ser humano crezca escribiendo código 3D cuando debería haber estado montando bicicleta.

El álgebra lineal es aplicable a 2D como lo es a 3D y debería ser algo con lo que esté familiarizado, incluso si solo hizo matemáticas de secundaria. Si alguna vez ha hecho intersecciones de líneas o trazados periódicos en una línea (integración), entonces ha usado álgebra lineal.

El aprendizaje de las matemáticas en 3D generalmente comienza colocando un objeto simple (como un cubo) en el espacio 3D e implementando una cámara móvil que puede ver ese objeto desde diferentes perspectivas, y esa perspectiva puede comenzar ortogonalmente para simplificar aún más las cosas. Se trata de proyectar puntos en un plano 3D que representa tu pantalla (fórmula aquí , extenderías esto a los ejes xyz además de y). Realmente, ese es el comienzo de escribir cualquier motor 3D, independientemente de su nivel de experiencia. Flash y Processing.js son dos excelentes formas de crear prototipos de algo así fácilmente.


0

Estás en el buen camino de que el álgebra lineal y las matemáticas más complejas generalmente involucran gráficos en 3D y espacio en 3D. Pero todavía hay más matemáticas que se pueden hacer dentro de los juegos 2D. Las matemáticas de física pueden volverse bastante difíciles, y se vuelven más complejas si consideras la física del cuerpo blando y la dinámica de B-spline (y aún en 2D, ten en cuenta)

Intente construir o diseccionar una biblioteca de física que cubra el manejo de colisiones y la respuesta para formas 2D comunes. El álgebra lineal es bastante útil para calcular vectores de trayectoria para colisiones. El producto puntual está bastante relacionado con el círculo unitario utilizado en trigonometría. Sin embargo, la complejidad de la física del cuerpo rígido aumenta exponencialmente cuando se aplica en 3D.

Los gráficos en 3D le brindan una mayor comprensión de los cálculos matriciales, los cuaterniones, el álgebra lineal y algunos cálculos aplicados. Lo primero que probablemente aprenderá es usar matrices para mover y manipular objetos en el espacio 3D.


0

Si estás escribiendo juegos en 2D, probablemente ya estés usando álgebra lineal ... ¡simplemente no lo sabes! Aprender formalmente al menos los conceptos básicos sobre los vectores es bastante fácil, pero es muy útil para simplificar el pensamiento sobre el movimiento complejo.

Por ejemplo, aquí tenemos muchas preguntas sobre qué ecuaciones usar para simular el movimiento curvo, como por ejemplo para un disparo de bala de cañón desde un cañón o un misil de referencia. Pero si comprende los vectores, la única "ecuación" que necesita es la de sumar dos vectores. No solo eso, sino que agregar cosas como el arrastre de aire o la fricción se vuelve increíblemente simple: simplemente calcule el vector de arrastre y agréguelo a la velocidad. ¡Presto!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.