Página 1 de 1

3D: como posso detectar a colisão?

Enviado: Qui Jul 20, 2017 2:49 pm
por Cambalinho
eu ainda estou aprender cada vez mais sobre o Game Maker Studio 1.4, mas ainda estou muito limitado em 3D.
como posso testar a colisão em 3D?

Re: 3D: como posso detectar a colisão?

Enviado: Qui Jul 20, 2017 5:06 pm
por lucaslima
Olá! Como você está iniciando no game maker, acho útil que você veja estes canais no youtube:
https://www.youtube.com/user/uheartbeast/feed
https://www.youtube.com/channel/UCAumdO1yv-di4fI6IZQIy3Q
https://www.youtube.com/channel/UCOs7Q7IeuzgRyARaEqif75A
https://www.youtube.com/channel/UCJvrLzbg4VPRxzf2vhW7G4A
https://www.youtube.com/channel/UCn7FE3Tx391g1tWPv-1tv7Q
https://www.youtube.com/channel/UCEHvTxm7M3EhrvFB5-_-veQ

São canais muito bons que foi onde eu aprendi muita coisa, mas nunca me interessei em 3D, por isso te passo estes vídeos para tentar te ajudar.

Abraço.

Re: 3D: como posso detectar a colisão?

Enviado: Qui Jul 20, 2017 6:30 pm
por Cambalinho
eu ja consegui e esta muito fixe ;)
mas ainda tenho problemas devido a variavies :(
posso criar variaveis, num objecto, como o 'x'?
depois eu fazia nomedoobjecto.z ou outra.

Código: Selecionar todos

///Collision3D(PosX1, PosY1, PosZ1, W1, H1, P1, PosX2, PosY2, PosZ2, W2, H2, P2, CollisionDiference);

PosX1=argument0;
PosY1=argument1;
PosZ1=argument2;
W1=argument3;
H1=argument4;
P1=argument5;

PosX2=argument6;
PosY2=argument7;
PosZ2=argument8;
W2=argument9;
H2=argument10;
P2=argument11;
CollisionDiference=argument12;

if ((PosX1 < (PosX2 + W2)) && (PosX2 < (PosX1 + W1)))
{
    if ((PosY1 < (PosY2 + H2)) && (PosY2 < (PosY1 + H1)))
    {
        if ( (PosZ1<(PosZ2+P2)) && (PosZ2<(PosZ1+P1)))
        {            
            return true;
        }
    }    
}
return false;
se conseguir-se, eu melhorava a função a 100% e com menos argumento.
as variavies globais podem ser alteradas em qualquer lado. mas eu preciso de variavies com valores diferentes entre instancias de objectos

EDIT 1:

eu ao criar variaveis num objecto, eu tenho acesso a elas num script. e isso foi muito bom.
continuando com a colisão, eu fiz outra função:

Código: Selecionar todos

///Collision3D(PosX1, PosY1, PosZ1, W1, H1, P1, PosX2, PosY2, PosZ2, W2, H2, P2, CollisionDiference);

PosX1=argument0;
PosY1=argument1;
PosZ1=argument2;
W1=argument3;
H1=argument4;
P1=argument5;

PosX2=argument6-argument12;
PosY2=argument7-argument12;
PosZ2=argument8-argument12;
W2=argument9+(argument12*2);
H2=argument10+(argument12*2);
P2=argument11+(argument12*2);

if ((PosX1 < (PosX2 + W2)) && (PosX2 < (PosX1 + W1)))
{
    if ((PosY1 < (PosY2 + H2)) && (PosY2 < (PosY1 + H1)))
    {
        if ( (PosZ1<(PosZ2+P2)) && (PosZ2<(PosZ1+P1)))
        {            
            return true;
        }
    }    
}
return false;
e

Código: Selecionar todos

///Collision3DObjectName(Object1, Object2, CollisionDiference);

PosX1=argument0.x;
PosY1=argument0.y;
PosZ1=argument0.z;
W1=argument0.w;
H1=argument0.h;
P1=argument0.p;

PosX2=argument1.x-argument2;
PosY2=argument1.y-argument2;
PosZ2=argument1.z-argument2;
W2=argument1.w+(argument2*2);
H2=argument1.h+(argument2*2);
P2=argument1.p+(argument2*2);

if ((PosX1 < (PosX2 + W2)) && (PosX2 < (PosX1 + W1)))
{
    if ((PosY1 < (PosY2 + H2)) && (PosY2 < (PosY1 + H1)))
    {
        if ( (PosZ1<(PosZ2+P2)) && (PosZ2<(PosZ1+P1)))
        {
            var dir=direction*pi/180;
            argument0.x += (sin(dir)*4);
            argument0.y += (cos(dir)*4);
            speed=-10;
            return true;
        }
    }    
}
return false;
ambas funcionam a 100%.
o 'p' é a expessura do objecto em z.
mas eu tenho 1 problema que não sei controlar. ao andar para a frente e para trás eu altero o 'speed', mas como posso testar o movimento antes de o fazer?
o object tem x,y e z, mas com o 'speed' e direction eu nao sei o que vou somar :(
alguem pode me dar dicas?

EDIT 2:

agora fiz 1 actualização na função:

Código: Selecionar todos

///Collision3DAllObjects(PosX1, PosY1, PosZ1, W1, H1, P1);

PosX1=argument0;
PosY1=argument1;
PosZ1=argument2;
W1=argument3;
H1=argument4;
P1=argument5;

for (i=0;i<(instance_count-1);i++)
{
    PosX2=instance_id[i].x;
    PosY2=instance_id[i].y;
    PosZ2=instance_id[i].z;
    W2=instance_id[i].w;
    H2=instance_id[i].h;
    P2=instance_id[i].p;
    
    if ((PosX1 < (PosX2 + W2)) && (PosX2 < (PosX1 + W1)))
    {
        if ((PosY1 < (PosY2 + H2)) && (PosY2 < (PosY1 + H1)))
        {
            if ( (PosZ1<(PosZ2+P2)) && (PosZ2<(PosZ1+P1)))
            {            
                return true;
            }
        }    
    }
}
return false;
mas tenho 1 erro:
"___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of Keyboard Event for <Up> Key
for object objCamera:

Push :: Execution Error - Variable Get 100000.z(100013, -2147483648)
 at gml_Script_Collision3DAllObjects (line 14) -     PosZ2=instance_id.z;
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Script_Collision3DAllObjects (line 14)
called from - gml_Object_objCamera_Key_UP_1 (line 3) - if Collision3DAllObjects(x+cos(direction*pi/180)*diference,y-sin(direction*pi/180)*diference,z+diference,w,h,p)"

"Push :: Execution Error - Variable Get 100000.z(100013, -2147483648)

 at gml_Script_Collision3DAllObjects (line 14) -     PosZ2=instance_id.z;"
line 14:

Código: Selecionar todos

PosZ2=instance_id[i].z;
mas eu criei o 'z' no objecto... mas que erro eu fiz?