Vectores de Half-Life en AMXX - Parte 1: Introduccion
#1
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>.
  • 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.
  • 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.
  • 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.

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.03.05.0 

    Cada número indica la magnitud de las componentes en los ejes X, Y, Z respectivamente.
    Gráficamente:

    [Imagen: attachment.php?aid=7643]

    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
Los vectores
  • 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.00.01.0 } , {3.04.05.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] = { 410};
    new 
    Float:origin[3] = { -50.08192.00.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.
Tipos de vectores en Half-Life
  • Vectores cartesianos
    Estos vectores sirven para representar una magnitud en coordenadas cartesianas. Ejemplos:

    Código PHP:
    new FloatA[3] = { 0.05.07.0 };
    new 
    Float:B[3] = { 5.0, -3.88900.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.
  • Vectores angulares
    Estos vectores sirven para representar una magnitud en coordenadas angulares espaciales. Ejemplos:

    Código PHP:
    new Float:A[3] = { 0.05.07.0 }; // ( 0.0° vertical, 5.0° horizontal, 7.0° axial)
    new Float:B[3] = { 5.0, -3.88179.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] = { 00255 }; // 0 Rojo, 0 Verde, 255 Azul

    // Blanco
    new cWhite[3] = { 255255255 };

    // Rojo
    new cRed[3] = { 2550};

    // Negro
    new cBlack[3] = { 00};

    // Uso: Glow de color verde para un jugador
    entity_set_vector(iIdEV_VEC_rendercolorFloat:{ 0.0255.00.0 }); 

    Se utilizan en EV_VEC_rendercolor o pev_rendercolor.
Operaciones básicas con vectores
  • 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.04.05.0 };
    new 
    Float:B[3] = { 1.02.05.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(ABC); 

    Gráficamente:

    [Imagen: attachment.php?aid=7593]
    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.04.05.0 };
    new 
    Float:B[3] = { 1.02.05.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(ABD); 

    Gráficamente:

    [Imagen: attachment.php?aid=7596]

    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:= { 2.05.03.0 };
    new 
    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(FaG); 

    Gráficamente:

    [Imagen: attachment.php?aid=7594]

    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.9915.30.0 };
    new 
    floatsqroot(H[0]*H[0] + H[1]*H[1] + H[2]*H[2]);

    // O podemos recurrir a nuestra vieja amiga, la librería <xs>
    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.30.01 };
    new 
    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:

    [Imagen: attachment.php?aid=7595]
Movimiento de una entidad
  • Movimiento de traslación
    Es el movimiento donde una entidad solo se traslada, pero no gira.

    [Imagen: attachment.php?aid=7621]

    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.

    [Imagen: attachment.php?aid=7622]

    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.
La librería <xs>
  • ¿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:1.0
    new Float:2.0
    new Float:3.0
    xs_vec_set
    (fVec1XYZ); 

    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(fVec1fVec2fAdd); 

    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(fVec1fVec2fSub); 

    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(fVec1500.0fVec1); 

    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(fVec1fVec1); 

Nos vemos en la parte 2 Proud

Créditos a totopizza por las imágenes .png


Archivos adjuntos Miniatura(s)
                           
Responder
#2
No entendí un ping0, pero tremendo aporte Mía <3
Responder
#3
Buenísima info Mía, me aclaraste muchas cosas que quedaban a medias en mi cabeza. Más que nada con las imágenes xD Excitedeyes
[Imagen: giphy.webp]

Panda Nuestro
Sistema de Cuentas MySQL/SQLite
Discord: FluffyDeveloper#4753

meTaLiCroSS escribió: Pero sin picarse po, todavía te molesta que te haya mandado a la mierda porque querias plugins de mi server? Mírate, seguí programando weas mulas después de años, tení que ser harto penca para esta wea, das pura pena Corazón

(22/01/2021, 02:55 PM)Skylar escribió: dios como me enferma que digas plugins cuando hablas de un solo plugin pendejo re pelotudo
Responder
#4
parte 1? espero que la parte 2 se publique en menos de 6 años... buen aporte e.e
Hi Milashkasiya CrabCrab

Soy un #Panda.. Soy solo un tipo que parece #común pero soy todo lo contrario; alguien #atípico en esta sociedad actual

[Imagen: xl0jvd-5.png]
Link
Responder
#5
Excelente me aclaraste el vector RGB!
Responder
#6
nice.
[Imagen: zcsztw-4.png] [Imagen: 6u5fj2-4.png]
[Imagen: linkedin_thumb_image.png][Imagen: 76561198283253977.png][Imagen: linkedin_thumb_image.png]
Responder
#7
Gracias por los comentarios tan positivos Excitedeyes

(24/05/2021, 10:07 AM)[R]ak escribió: parte 1? espero que la parte 2 se publique en menos de 6 años... buen aporte e.e

Tardé 15 días en terminar la parte 2 Proud
A este paso tendremos las partes 3 y 4 en julio Yao ming
Responder
#8
hermoso aporte

espero la parte 15 Corazón

Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)