Marzo 16, 2019, 06:13:12 PM Ultima modificación: Marzo 18, 2019, 02:42:05 PM por Goganpis
Hello!

Tengo rato intentando lidiar con una colision 3D en linea recta que recorre una bala pero no encuentro la forma en que el algoritmo que uso encuentre la colision con el otro objeto, no uso nada de mascaras ya que no me llevo muy bien ese tema y la coordenada "Z" y me consumiria demasiado tiempo, entonces quiero saber como funciona la colision lineal 2D o me podrian ayudar a hacer la colision lineal 3D  ;)

igual dejo el script por si algo  :-[

// Bullet_Collision_box(x1,y1,z1,x2,y2,z2,obj)

var _x1,_y1,_z1,_x2,_y2,_z2,_obj, _vx,_vy,_vz,_d;
_x1 = argument0;
_y1 = argument1;
_z1 = argument2;
_x2 = argument3;
_y2 = argument4;
_z2 = argument5;
_obj = argument6;

_d = max(abs(_x2-_x1), abs(_y2-_y1), abs(_z2-_z1), 1); // distancia mayor
_vx = (_x2-_x1)/_d; // Velocidad
_vy = (_y2-_y1)/_d;
_vz = (_z2-_z1)/_d;

with (_obj)
    {
     var _xx1,_yy1;
     var i; // Recorrido
     for (i=0;i<=_d;i+=1)
        {
         // Normalizado de las posiciones en el angulo correspondiente del objeto
         _xx1 = (x- (_x1+_vx*i) )*cos(degtorad(-rotz))-(y- (_y1+_vy*i) )*-sin(degtorad(-rotz)) + _x1;
         _yy1 = (y- (_y1+_vy*i) )*cos(degtorad(-rotz))+(x- (_x1+_vx*i) )*-sin(degtorad(-rotz)) + _y1;
         
         
         // Colision
         if (_x1+_vx*i >= _xx1+x1)// Desde aqui el problemita
         and (_y1+_vy*i >= _yy1+y1)// Es igual si lo comparan con una caja sin rotacion
         and (_x1+_vx*i <= _xx1+x2)// No se si funciona bien
         and (_y1+_vy*i <= _yy1+y2)
            {
             if (_z1+_vz*i >= z+z1)
             and (_z1+_vz*i <= z+z2)
                {
                 return(id);
                }
            }
          /*
         x1; y1; x2;y2; z1;z2
         son solo variables que uso como si usara Width|Height
         */
        }
     
    }
   
return (false);



Edit: Bueno ya encontre la solucion la ultima suma en las posiciones habian que sumarlas desde el principio de esta forma ya que calculaba el angulo que tenia cada punto para transformar esas colisiones  :-[

Citar// Normalizado de las posiciones en el angulo correspondiente del objeto
         _xx1 = (x- (_x1+_vx*i) )*cos(degtorad(-rotz))-(y- (_y1+_vy*i) )*-sin(degtorad(-rotz)) + _x1;
         _yy1 = (y- (_y1+_vy*i) )*cos(degtorad(-rotz))+(x- (_x1+_vx*i) )*-sin(degtorad(-rotz)) + _y1;

Y sumarlo asi

// Normalizado de las posiciones en el angulo correspondiente del objeto
         _xx1 = (x- (_x1+_vx*i) )*cos(degtorad(-rotz))-(y- (_y1+_vy*i) )*-sin(degtorad(-rotz)) + _x1+vx*i;
         _yy1 = (y- (_y1+_vy*i) )*cos(degtorad(-rotz))+(x- (_x1+_vx*i) )*-sin(degtorad(-rotz)) + _y1+vy*i;


Cualquiera que quiera que le enseñe como se transforman las rotaciones hasta en 3D pidanlo para hacer un tutorial  ;)