23/05/2021, 08:23 PM
(Última modificación: 19/06/2021, 03:36 PM por Mía. Edited 23 times in total.
Razón: Added: RGB vectors
)
Vectores de Half-Life en AMXX
Temas a tratar:
- Parte 1: Introducción
- Magnitudes escalares y vectoriales.
- Los vectores.
- Tipos de vectores en Half-Life.
- Operaciones básicas con vectores.
- Movimiento de una entidad.
- La librería <xs>.
- Magnitudes escalares y vectoriales.
- Parte 2: Vectores cartesianos y traslación
- El sistema de coordenadas cartesianas.
- La posición de una entidad.
- La velocidad de una entidad.
- Traslación de una entidad.
- El tamaño de una entidad.
- El sistema de coordenadas cartesianas.
- Parte 3: Vectores angulares y rotación
- Vectores de representación angular.
- La orientación de una entidad.
- La velocidad angular de una entidad.
- Rotación de una entidad.
- Vectores de representación angular.
- Parte 4: Movimiento de traslación y rotación
- Obtención de vectores angulares a partir de vectores cartesianos.
- Obtención de vectores cartesianos a partir de vectores angulares.
- Movimiento general de una entidad.
- Obtención de vectores angulares a partir de vectores cartesianos.
Parte 1 - Introducción
Magnitudes escalares y vectoriales
- Escalares
Son los "números" que conocemos, comunes y corrientes.
Ejemplo:
Código PHP:1
2
3
500
12612487
-2.71828182 - Vectoriales
Las magnitudes vectoriales se componen de tres escalares, que sirven para representar una dirección y una longitud en el espacio.
Hay muchas formas de representar una magnitud vectorial; pero ahora sólo nos interesa la forma que usaremos en Pawn.
Código PHP:{ 2.0, 3.0, 5.0 }
Cada número indica la magnitud de las componentes en los ejes X, Y, Z respectivamente.
Gráficamente:
Dadas las 3 componentes de una magnitud vectorial, obtenemos una "flecha" desde el punto de origen hasta un punto final. La longitud de la misma (el módulo) se calcula mediante el teorema de Pitágoras:
M = raiz(X² + Y² + Z²)
M = raiz(4 + 9 + 25)
M = raiz(40) = 6.32
- Qué son los vectores
Los vectores son entes matemáticos que se usan para representar las magnitudes vectoriales.
Consideremos un vector A. Este vector sólo puede tomar valores vectoriales. (No podemos decir que A es igual a 1, o a -0.5; porque estos valores son magnitudes escalares). Ejemplos de valores que puede tomar A:
Código PHP:{ 0.0, 0.0, 1.0 } , {3.0, 4.0, 5.0 }
- Representación de vectores en Pawn
Viendo los vectores desde el punto de vista de la programación en Pawn; disponemos de dos tipos de vectores, los de componentes enteros (new ) y componentes con decimales (new Float: ). Ya que los vectores en 3 dimensiones, tienen 3 componentes: utilizamos arreglos de 3 elementos para almacenarlos.
Código PHP:new A[3] = { 4, 10, 3 };
new Float:origin[3] = { -50.0, 8192.0, 0.0 };
Para evitar confusiones con los vectores en programación, a estos últimos los llamaré "arreglos"; y sólo denominaré como "vector" a los arreglos de 3 componentes.
- Vectores cartesianos
Estos vectores sirven para representar una magnitud en coordenadas cartesianas. Ejemplos:
Código PHP:new Float: A[3] = { 0.0, 5.0, 7.0 };
new Float:B[3] = { 5.0, -3.88, 900.5 };
Existe infinidad de magnitudes vectoriales que se trabajan en coordenadas cartesianas, pero aquí sólo trataré con los que tienen relevancia en el entendimiento de los vectores y Half-Life:- Vector de posición (EV_VEC_origin o pev_origin)
- Vector de velocidad (EV_VEC_velocity o pev_velocity)
- Vector de dimensiones (EV_VEC_size/mins/maxs o pev_size/mins/maxs)
Trataré este tipo de vectores con más detalle en la segunda parte del tutorial.
Nota: Algunos de estos vectores pueden ser accesados sin Engine ni Fakemeta, como el origin en get_user_origin. Sin embargo, Engine y Fakemeta aceptan los vectores con el tag Float:, por lo que trabajan con decimales; a diferencia de get_user_origin del core AMXX.
- Vector de posición (EV_VEC_origin o pev_origin)
- Vectores angulares
Estos vectores sirven para representar una magnitud en coordenadas angulares espaciales. Ejemplos:
Código PHP:new Float:A[3] = { 0.0, 5.0, 7.0 }; // ( 0.0° vertical, 5.0° horizontal, 7.0° axial)
new Float:B[3] = { 5.0, -3.88, 179.9 };
Trataré este tipo de vectores con más detalle en la tercera parte del tutorial.
- Vectores RGB
Estos vectores representan colores.
Cada componente representa la cantidad de un color primario, en un número entre 0 y 255. Estos colores son (en orden): Rojo, verde y azul (Red, Green, Blue : R G B). Como todo vector en Half-Life, este lleva componentes con coma decimal (float); pero para el renderizado los valores se convierten en enteros (int).
Código PHP:// Azul
new cBlue[3] = { 0, 0, 255 }; // 0 Rojo, 0 Verde, 255 Azul
// Blanco
new cWhite[3] = { 255, 255, 255 };
// Rojo
new cRed[3] = { 255, 0, 0 };
// Negro
new cBlack[3] = { 0, 0, 0 };
// Uso: Glow de color verde para un jugador
entity_set_vector(iId, EV_VEC_rendercolor, Float:{ 0.0, 255.0, 0.0 });
Se utilizan en EV_VEC_rendercolor o pev_rendercolor.
- Suma
La suma de 2 vectores nos representa un vector donde las componentes son la suma de las componentes de los 2 vectores.
Consideremos 2 vectores:
Código PHP:new Float:A[3] = { 3.0, 4.0, 5.0 };
new Float:B[3] = { 1.0, 2.0, 5.0 };
La suma de ellos será:
Código PHP:new Float:C[3] = { /*1.0+3.0*/ 4.0, /*4.0+2.0*/ 6.0, /*5.0+5.0*/ 10.0 };
Para sumar 2 vectores -cualesquiera- en Pawn, tenemos que sumar las celdas, para cada componente:
Código PHP:new Float:C[3];
C[0] = A[0] + B[0];
C[1] = A[1] + B[1];
C[2] = A[2] + B[2];
// O recurrir a nuestra vieja amiga, la librería <xs>
xs_vec_add(A, B, C);
Gráficamente:
La adición de vectores nos permite obtener un vector que empieza al inicio de un vector, y termina al final del otro. ¡Con esto podemos obtener el origen de una entidad que está encima de un jugador, como un hat! Mostraré más aplicaciones en la segunda parte del tutorial.
- Resta
La diferiencia de 2 vectores nos representa un vector donde las componentes son la resta de las componentes de los 2 vectores, ¡EN ORDEN! Es decir, si D = A-B, entonces cada componente de D es la resta del componente de A menos el componente de B.
Consideremos 2 vectores:
Código PHP:new Float:A[3] = { 3.0, 4.0, 5.0 };
new Float:B[3] = { 1.0, 2.0, 5.0 };
La diferencia de ellos será:
Código PHP:new Float:D[3] = { /*3.0-1.0*/ 2.0, /*4.0-2.0*/ 2.0, /*5.0-5.0*/ 0.0 };
Para restar 2 vectores -cualesquiera- en Pawn, tenemos que restar las celdas, para cada componente:
Código PHP:new Float:D[3];
D[0] = A[0] - B[0];
D[1] = A[1] - B[1];
D[2] = A[2] - B[2];
// O recurrir a nuestra vieja amiga, la librería <xs>
xs_vec_sub(A, B, D);
Gráficamente:
Con esta operación, tenemos un vector que empieza al final de B, y termina al final de A. ¡Este vector puede servir para dirigir alguna entidad hacia otra! En la segunda parte del tutorial explicaré más sobre esto.
- Multiplicación por un escalar
Si multiplicamos a un vector por 2, cada componente del vector se duplica. Obtendremos un vector cuya longitud es el doble que la del vector original. Podemos utilizar cualquier escalar para multiplicar al vector.
Considermos un vector y un escalar cualquiera:
Código PHP:new Float:F = { 2.0, 5.0, 3.0 };
new a = 15;
// El resultado de la multiplicación F por el escalar 'a' será:
new Float:G[3];
G[0] = F[0]*a;
G[1] = F[1]*a;
G[2] = F[2]*a;
// O podemos recurrir a nuestra vieja amiga, la librería <xs>
xs_vec_mul_scalar(F, a, G);
Gráficamente:
Con esta operación, podemos cambiar la longitud del vector, ¡sin modificar la dirección! Es la operación a tomar en cuenta para modificar velocidades. Explicaré más en la segunda parte del tutorial.
Utilizando un número negativo en la multiplicación, ¡invertimos el sentido del vector!
- Obtención de la longitud del vector
Esto se hace mediante el teorema de pitágoras.
Código PHP:new Float:H[3] = { -45.99, 15.3, 0.0 };
new b = floatsqroot(H[0]*H[0] + H[1]*H[1] + H[2]*H[2]);
// O podemos recurrir a nuestra vieja amiga, la librería <xs>
b = xs_vec_len(H); - Normalización de un vector
Significa reducir las componentes de un vector, manteniendo la proporción, pero con la condición de que la longitud de este nuevo vector sea igual a 1. Esto se hace con la intención de, al multiplicarlo por un escalar, la nueva longitud sea igual al escalar.
Para obtener esto, necesitamos "dividir" el vector entre su longitud.
Código PHP:new Float:I[3] = { 11.0, -22.3, 0.01 };
new d = xs_vec_len(I);
I[0] = I[0] / d; // I[0] /= d;
I[1] = I[1] / d;
I[2] = I[2] / d;
// O recurrimos a nuestra vieja amiga, la librería <xs>
xs_vec_normalize(I);
Gráficamente:
- Movimiento de traslación
Es el movimiento donde una entidad solo se traslada, pero no gira.
Existen diversos tipos de traslación. Explicaré más de esto en la parte 2 del tutorial.
- Movimiento de rotación
Es el movimiento donde una entidad solo gira, pero no se traslada.
La rotación nos permite orientar a una entidad. En conjunto con la traslación, nos otorga el movimiento general de una entidad. Explicaré más sobre rotación en la parte 3 del tutorial, y el movimiento general en la parte 4.
- ¿Para qué sirve?
Es una colección de funciones muy útiles para el cálculo con vectores en Pawn. Sugiero leerla mientras se sigue el tutorial. A menudo haré ejemplos utilizando las funciones de la librería. Además de las funciones vectoriales, <xs> también cuenta con funciones matriciales, de espacios vectoriales, y otras operaciones de álgebra lineal. Es una auténtica creación matemática. No cubriré la libreria en su totalidad en esta serie de tutoriales.
- Operaciones vectoriales básicas con <xs>
Creación de un vector:
Código PHP:new Float:fVec1[3];
// El primer parámetro es el vector que se va a crear. Parámetros 2, 3 y 4: componentes X, Y, Z.
new Float:X = 1.0
new Float:Y = 2.0
new Float:Z = 3.0
xs_vec_set(fVec1, X, Y, Z);
Suma:
Código PHP:new Float:fVec1[3], Float:fVec2[3];
new Float:fAdd[3];
// Los dos primeros parámetros son los vectores a sumar, y el tercero almacenará el resultado
xs_vec_add(fVec1, fVec2, fAdd);
Resta:
Código PHP:new Float:fVec1[3], Float:fVec2[3];
new Float:fSub[3];
// El segundo parámetro es el vector que se restará al vector del primer parámetro
// El resultado se almacena en el vector del tercer parámetro
xs_vec_sub(fVec1, fVec2, fSub);
Multiplicación por un escalar:
Código PHP:new Float:fVec1[3]
// El primer parámetro es el vector que se va a multiplicar. El segundo parámetro es el escalar (número) por el que se va a multiplicar el vector. El resultado va al vector del tercer parámetro, puede ser el mismo vector de entrada.
xs_vec_mul_scalar(fVec1, 500.0, fVec1);
Obtención de la longitud del vector:
Código PHP:new Float:fVec1[3]
// El primer parámetro es el vector del cual se obtendrá la longitud.
new Float:fLenght = xs_vec_len(fVec1);
Normalización:
Código PHP:new Float:fVec1[3]
// El primer parámetro es el vector que se va a normalizar. El segundo parámetro es el vector donde se almacenará el resultado. Puede ser el mismo vector de entrada.
xs_vec_normalize(fVec1, fVec1);
Nos vemos en la parte 2
Créditos a totopizza por las imágenes .png
- Retirada -
Mis Plugins
Directorio de Aportes
Mi tutorial de vectores hecho con ♥
My sister ♥
¿Quieres aprender sobre sexualidad?
Mis Plugins
Directorio de Aportes
Mi tutorial de vectores hecho con ♥
My sister ♥
¿Quieres aprender sobre sexualidad?