Jump to content
  • 0

Ajutor vehicul de coliziune - obiecte


Question

Posted

Bună ziua tuturor! Întâmpin dificultăți în a găsi o soluție pentru a detecta coliziunile pentru un script de lansare de rachete din mașini. Inițial, am ales să verific dacă există coliziuni folosind IsPlayerInRangeOfPoint, dar este foarte imprecis. În prezent, caut o soluție pentru a determina dacă obiectul rachetă poate fi interceptat ca o coliziune cu un vehicul. Mă gândeam la o cutie de coliziune invizibilă în jurul vehiculului. Aveți vreun sfat cu privire la detectarea coliziunilor între un obiect și un vehicul? Mulțumesc.

10 answers to this question

Recommended Posts

  • 0
Posted
17 hours ago, illiker58 said:

Bună ziua tuturor! Întâmpin dificultăți în a găsi o soluție pentru a detecta coliziunile pentru un script de lansare de rachete din mașini. Inițial, am ales să verific dacă există coliziuni folosind IsPlayerInRangeOfPoint, dar este foarte imprecis. În prezent, caut o soluție pentru a determina dacă obiectul rachetă poate fi interceptat ca o coliziune cu un vehicul. Mă gândeam la o cutie de coliziune invizibilă în jurul vehiculului. Aveți vreun sfat cu privire la detectarea coliziunilor între un obiect și un vehicul? Mulțumesc.

te-ai gândit să folosești https://github.com/Pottus/ColAndreas ? în teorie trebuie să ai o poziție curentă, o direcție și o viteză, iar la fiecare tick să actualizezi noua poziție, iar la finalul actualizării să verifici dacă este în coliziune cu un obiect. dacă e în coliziune, explodează, dacă nu, se rulează tick după 16-32ms.

  • 0
Posted
2 hours ago, segmentationfault said:

ti aiuterò a seguire  https://github.com/Pottus/ColAndreas  ? in teoria dobbiamo avere una posizione attuale, una direzione e una velocità, e ogni volta attualizzare una nuova posizione, e alla fine attualizzare verificare se è in collisione con un oggetto. se è nella coliziune, esplode, se ora, la regola spunta dopo 16-32ms.

Da, am încercat să verific și cu ColAndreas. Dar aceasta nu interfață doar cu obiectele hărții? Mi se pare că vehiculele nu sunt detectate de el. De asemenea, am încercat să verific distanța 3D, dar nu este exactă cu metoda GetDistance3D a math.inc include. Ceea ce spun este că pornind de la ciocnirea cu acesta, punctul vehiculului de exemplu „Elegy” va fi în centru.

  • 0
Posted
47 minutes ago, illiker58 said:

Da, am încercat să verific și cu ColAndreas. Dar aceasta nu interfață doar cu obiectele hărții? Mi se pare că vehiculele nu sunt detectate de el. De asemenea, am încercat să verific distanța 3D, dar nu este exactă cu metoda GetDistance3D a math.inc include. Ceea ce spun este că pornind de la ciocnirea cu acesta, punctul vehiculului de exemplu „Elegy” va fi în centru.

M-am uitat peste API-ul de la ColAndreas, într-adevăr este doar cu harta, însă poți crea obiecte doar ca coliziuni în plugin. Problema este că obiectul nu se atașează de vehicul sau player și ar trebuii să actualizezi tu constant poziția acelor obiecte și să pui cumva niște cercuri/pătrate mai multe ca sa formeze un fel de hitbox.

Sincer să-ți zic, ce vrei tu să faci este oleacă cam dificil și trebuie să te joci cu matematica, ai aici un video despre algoritmul pe care trebuie să-l folosești:

 

  • 0
Posted (edited)

Va multumesc pentru raspunsurile pe care mi le-ati oferit. Chestia este mai complexă decât mi-aș fi putut imagina... În acest moment, scuzați-mă dacă vă întreb din nou, în opinia dumneavoastră, „atașarea” unui obiect la un vehicul care are o dimensiune adecvată dimensiunilor vehiculului ar putea fi o solutie interesanta? De exemplu, acum încercam să fac un test simplu cu ColAndreas folosind funcția ContactTest cu două obiecte intersectate unul cu celălalt. Rechemarea comenzii blochează întregul server și în jurnal am eroarea: Exception At Address: 0x62D6AAC2 Module: (ColAndreas.dll)
În loc să fac calcule matematice complexe (ceea ce este destul de complex pentru mine), aceasta, după părerea mea, ar putea fi o idee destul de adecvată. Mai există încă o îndoială, deoarece nu am cunoștințe directe cu privire la acest plugin și există o documentație slabă, probabil că obiectul atașat unui vehicul nu va avea o coliziune? Nu știu, cred că e ceva de aruncat. Nu mai am idei „fezabile”. Iată exemplul pe care încercam să-l dau:

 

#include <a_samp>
#include <colandreas>

new obj1, obj2;
public OnFilterScriptInit()
{
    CA_Init();

    obj1 = CreateObject(710, 2045.71887, 1351.40881, 24.95637,   0.00000, 0.00000, 0.00000);
    obj2 = CreateObject(3437, 2045.76587, 1351.48413, 15.64844,   356.85840, 0.00000, -3.00958);

    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!strcmp(cmdtext, "/col", true))
    {
        new
        Float:x,
        Float:y,
        Float:z,
        Float:rx,
        Float:ry,
        Float:rz;

        GetObjectPos(obj2, x, y, z);
        GetObjectRot(obj2, rx, ry, rz);

        if (CA_ContactTest(obj1, x, y, z, rx, ry, rz)) {
            SendClientMessage(playerid, -1, "ok!");
        }
        return 1;
    }
    return 0;
}

Edited by illiker58
  • 0
Posted (edited)

ce ai putea sa faci este o arie imaginara pentru masina, ii poti lua lungime/latime cu o functie nativa si tre sa faci niste calcule, nu e asa acurabil dar poate mg, e greu sa calculezi obiectele si sa le pui in forma masinii

Edited by Sancky
  • 0
Posted
6 minutes ago, illiker58 said:

Va multumesc pentru raspunsurile pe care mi le-ati oferit. Chestia este mai complexă decât mi-aș fi putut imagina... În acest moment, scuzați-mă dacă vă întreb din nou, în opinia dumneavoastră, „atașarea” unui obiect la un vehicul care are o dimensiune adecvată dimensiunilor vehiculului ar putea fi o solutie interesanta? De exemplu, acum încercam să fac un test simplu cu ColAndreas folosind funcția ContactTest cu două obiecte intersectate unul cu celălalt. Rechemarea comenzii blochează întregul server și în jurnal am eroarea: Exception At Address: 0x62D6AAC2 Module: (ColAndreas.dll)
În loc să fac calcule matematice complexe (ceea ce este destul de complex pentru mine), aceasta, după părerea mea, ar putea fi o idee destul de adecvată. Mai există încă o îndoială, deoarece nu am cunoștințe directe cu privire la acest plugin și există o documentație slabă, probabil că obiectul atașat unui vehicul nu va avea o coliziune? Nu știu, cred că e ceva de aruncat. Nu mai am idei „fezabile”. Iată exemplul pe care încercam să-l dau:

 

#include <a_samp>
#include <colandreas>

new obj1, obj2;
public OnFilterScriptInit()
{
    CA_Init();

    obj1 = CreateObject(710, 2045.71887, 1351.40881, 24.95637,   0.00000, 0.00000, 0.00000);
    obj2 = CreateObject(3437, 2045.76587, 1351.48413, 15.64844,   356.85840, 0.00000, -3.00958);

    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!strcmp(cmdtext, "/col", true))
    {
        new
        Float:x,
        Float:y,
        Float:z,
        Float:rx,
        Float:ry,
        Float:rz;

        GetObjectPos(obj2, x, y, z);
        GetObjectRot(obj2, rx, ry, rz);

        if (CA_ContactTest(obj1, x, y, z, rx, ry, rz)) {
            SendClientMessage(playerid, -1, "ok!");
        }
        return 1;
    }
    return 0;
}

Tu nu trebuie să creezi un obiect propriu-zis (care să existe în joc). ColAndreas de fapt este o bază de date pentru fiecare obiect din joc, plugin-ul are o listă de vectori care constituie hitbox-ul fiecărui obiect existent.

Pe lângă asta, harta este construită pe baza unor obiecte amplasate by default, iar plugin-ul pur și simplu "oglindește" harta default, dar prin vectori de coliziune.

Dacă te uiți pe https://github.com/Pottus/ColAndreas/wiki/Functions#ca_createobject o să vezi că la final are o remarcă ONLY CREATES THE COLLISION, NOT THE IN-GAME OBJECT; 

deci din intuiția mea, citind wiki-ul, un obiect trebuie creat cu CA_CreateObject, iar unul nu este neapărat să existe, poți doar să-i oferi modelId-ul, că el calculeaza la nivel matematic hitbox-ul, însă pentru simplitate poți să folosești un obiect real.

#include <a_samp>
#include <colandreas>

new obj1, obj2;
public OnFilterScriptInit()
{
    CA_Init();

    obj1 = CA_CreateObject(710, 2045.71887, 1351.40881, 24.95637, 0, 0, 0);
    obj2 = CreateObject(3437, 2045.76587, 1351.48413, 15.64844,   356.85840, 0.00000, -3.00958);

    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!strcmp(cmdtext, "/col", true))
    {
        new
        Float:x,
        Float:y,
        Float:z,
        Float:rx,
        Float:ry,
        Float:rz;

        GetObjectPos(obj2, x, y, z);
        GetObjectRot(obj2, rx, ry, rz);

        if (CA_ContactTest(3437, x, y, z, rx, ry, rz)) {
            SendClientMessage(playerid, -1, "ok!");
        }
        return 1;
    }
    return 0;
}

Iar tu, ca să poți simula hitbox-ul pentru o mașină, trebuie să cauți obiecte sferice/pătrate și să le creezi folosind CA_CreateObject prin mașină ca să formeze un hitbox, uite un exemplu vizual

main-qimg-dd428e98c2dfcc164d16562078ec4f

problema este că nu ai conceptul de attach to vehicle/player în plugin-ul ăsta, și trebuie să actualizezi manual pozițiile acestor obiecte folosind https://github.com/Pottus/ColAndreas/wiki/Functions#ca_setobjectpos si https://github.com/Pottus/ColAndreas/wiki/Functions#ca_setobjectrot

nu am suficient timp să-ți explic cum să reproduci un attach, după revelion o să-ți explic în amănunt.

 

  • 0
Posted (edited)

Buna seara si un an nou fericit tuturor. Făceam câteva teste așa cum ați descris anterior și observ câteva probleme la nivelul coliziunii. Am introdus și un obiect fizic pentru a înțelege dacă poziția/rotația în funcție de vehicul este corectă. Ceea ce observ, de exemplu, este că funcția CA_ContactTest trebuie să aibă toate valorile de poziție/rotație perfect egale cu obiectul de testat pentru a returna că condiția a apărut. O sa atasez cateva fotografii si scenariul atasat! Cu toate acestea, la obținerea poziției unui obiect CA_CreateObject, valorile float sunt întotdeauna 0.0. Nu există o metodă pentru a obține poziția ca CA_GetObjectPos? De asemenea, am rulat un test suplimentar între un CA_CreateObject și CreateObject cu aceeași poziție (unde apare condiția), deplasând obiectul de coliziune cu CA_SetObjectPos, coliziunea are loc în continuare. Mulțumesc pentru răbdarea dvs.

 

#include <a_samp>
#include <colandreas>

new obj1, obj2;
new objView;

new objTest1, objTest2;
public OnFilterScriptInit()
{
    CA_Init();
    
    //obj1 = CA_CreateObject(710, 2045.71887, 1351.40881, 24.95637, 0, 0, 0);
    obj2 = CreateObject(3437, 2045.76587, 1351.48413, 15.64844, 356.85840, 0.00000, -3.00958);
    
    //Object test
    objTest1 = CA_CreateObject(19791, 2002.51270, 1259.76611, 9.96172,   0.00000, 0.00000, 0.00000);
    objTest2 = CreateObject(19790, 2002.51270, 1259.76611, 9.96172,   0.00000, 0.00000, 0.00000);

    CreateVehicle(411, 2048.3931, 1320.5370, 10.5648, 0.0000, -1, -1, 100);
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!strcmp(cmdtext, "/col", true))
    {
	    new
        Float:x,
        Float:y,
        Float:z,
        Float:rx,
        Float:ry,
        Float:rz;

        GetObjectPos(obj2, x, y, z);
        GetObjectRot(obj2, rx, ry, rz);
        
        if (CA_ContactTest(18763, x, y, z, rx, ry, rz)) {
            SendClientMessage(playerid, -1, "ok!");
        }
        else
        {
        	SendClientMessage(playerid, -1, "no!");
        }
        return 1;
    }
    
    if (!strcmp(cmdtext, "/cbj", true))
    {
        new vehicleId = GetPlayerVehicleID(playerid);
    	new
     	Float:x,
        Float:y,
        Float:z,
        Float:r;

	    GetVehiclePos(vehicleId, x, y, z);
	    GetVehicleZAngle(vehicleId, r);
	    obj1 = CA_CreateObject(18763, x, y, z, 0, 0, r);
	    objView = CreateObject(18763, x, y, z, 0, 0, r);
	    SendClientMessage(playerid, -1, "Object created!");
        return 1;
    }
    
    if (!strcmp(cmdtext, "/dview", true))
    {
        DestroyObject(objView);
        return 1;
    }
    
    ///Checks for collision with the same position
    if (!strcmp(cmdtext, "/coltest", true))
    {
        new
        Float:x,
        Float:y,
        Float:z,
        Float:rx,
        Float:ry,
        Float:rz;

        GetObjectPos(objTest2, x, y, z);
        GetObjectRot(objTest2, rx, ry, rz);
        
        if (CA_ContactTest(19791, x, y, z, rx, ry, rz)) {
            SendClientMessage(playerid, -1, "ok!");
        }
        else
        {
        	SendClientMessage(playerid, -1, "no!");
        }
        return 1;
    }
    
    if (!strcmp(cmdtext, "/setpos", true))
    {
        new
        Float:x,
        Float:y,
        Float:z;
        
        GetPlayerPos(playerid, x, y, z);
        CA_SetObjectPos(objTest1, x, y, z);
        return 1;
    }
    return 0;
}

public OnPlayerUpdate(playerid)
{
	new vehicleId = GetPlayerVehicleID(playerid);
    new playerState = GetPlayerState(playerid);

	if (playerState == PLAYER_STATE_DRIVER)
	{
	    new
	     	Float:x,
	        Float:y,
	        Float:z,
	        Float:r;

	    GetVehiclePos(vehicleId, x, y, z);
	    GetVehicleZAngle(vehicleId, r);

        if (CA_IsValidObject(obj1))
		{
		    CA_SetObjectPos(obj1, x, y, z);
		    CA_SetObjectRot(obj1, 0.0, 0.0, r);
		}

		if (IsValidObject(objView))
		{
		    SetObjectPos(objView, x, y, z);
		    SetObjectRot(objView, 0.0, 0.0, r);
		}
	}
	return 1;
}

 

screenshot.png

Edited by illiker58
  • 0
Posted
22 hours ago, Sancky said:

Trebuie sa ti generezi fisierul cu coliziuni .cadb, folosind wizard-ul ala dp github si sa l bagi in scriptfiles

Este prezent! L-am generat cu vrăjitorul pe GitHub și se încarcă ușor când pornește serverul!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.