Portal SAMP
[Ajuda] Trailer - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Trailer (/showthread.php?tid=3922)



Trailer - Biggy - 22/08/2023

Olá gente, gostaria de solicitar ajuda na resolução de um problema que estou tendo.

Estou usando o código abaixo para detectar o porta-malas do veículo. 
Está funcionando perfeitamente em um veículo normal, porém quando uso em um caminhão com trailer somente funciona perfeito se estiverem os dois em linha reta, quando está em ângulo não fica bem ajustado na traseira do trailer.

Estou rodando e não consigo solucionar, agradeço pela ajuda. 

Código:
GetVehicleTrunkPosition(vehicleid, &Float:x, &Float:y, &Float:z)
{
    new
        Float:vehsize,
        Float:vehangle,
        Float:n;

    GetVehiclePos(vehicleid, x, y, z);
    GetVehicleZAngle(vehicleid, vehangle);

    GetVehicleModelInfo(GetVehicleModel(vehicleid), VEHICLE_MODEL_INFO_SIZE, n, vehsize, n);

    x -= ((vehsize / 1.6) * floatsin(-vehangle, degrees)); -- Valor de 2.6 no Trailer
    y -= ((vehsize / 1.6) * floatcos(-vehangle, degrees)); --  Valor de 2.6 no Trailer
}

Código:
new Float:x, Float:y, Float:z;
GetVehicleTrunkPosition(TrailerID[playerid], x, y, z);



RE: Trailer - Aranha - 22/08/2023

tem um sistema aqui ve se isso ajuda

https://portalsamp.com/showthread.php?tid=2683


RE: Trailer - xbruno1000x - 23/08/2023

Cara, penso que dificilmente você vai encontrar a coordenada do porta malas do trailer. Vai ter que mexer nesses cálculos que a função que você mandou realiza. Se eu fosse você, colocaria um comando /desengatar, pegando o id do veículo na OnPlayerExitVehicle e desengatando o trailer. Imagino que dessa maneira o porta malas do trailer poderá ser encontrado facilmente.


RE: Trailer - White_Blue - 23/08/2023

Fazer isso não é algo simples, pois envolve cálculos complexos de geometria..

O código abaixo pode te dar uma luz(Não testei se está funcionando):



Código PHP:
stock GetTrailerTrunkPosition(playeridFloat:XFloat:YFloat:Z) {
    new GetPlayerVehicleID(playerid);
    
    
if(!= INVALID_VEHICLE_ID) {
        new trailer GetVehicleTrailer(v);
        
        
if(trailer != INVALID_VEHICLE_ID) {
            new Float:tPos[3], Float:tR[3], Float:tractorPos[3], 
            Float:tractorRot[3], Float:distanceFloat:angle;
            
            GetVehiclePos
(trailertrailerPos[0], trailerPos[1], trailerPos[2]), GetVehiclePos(vehicletractorPos[0], tractorPos[1], tractorPos[2]);
            GetVehicleZAngle(trailertRot[0], tRot[1], tRot[2]), GetVehicleZAngle(vehicletractorRot[0], tractorRot[1], tractorRot[2]);
           
            distance 
3.0angle 180.0;
            X trailerPos[0] - (distance floatsin(-trailerRot[2]));
            Y trailerPos[1] - (distance floatcos(-trailerRot[2]));
            Z trailerPos[2];
            return 1;
        }
    }
    return 0;




RE: Trailer - Biggy - 23/08/2023

(23/08/2023 01:27)White_Blue Escreveu: Fazer isso não é algo simples, pois envolve cálculos complexos de geometria..

O código abaixo pode te dar uma luz(Não testei se está funcionando):



Código PHP:
stock GetTrailerTrunkPosition(playeridFloat:XFloat:YFloat:Z) {
    new GetPlayerVehicleID(playerid);
    
    
if(!= INVALID_VEHICLE_ID) {
        new trailer GetVehicleTrailer(v);
        
        
if(trailer != INVALID_VEHICLE_ID) {
            new Float:tPos[3], Float:tR[3], Float:tractorPos[3], 
            Float:tractorRot[3], Float:distanceFloat:angle;
            
            GetVehiclePos
(trailertrailerPos[0], trailerPos[1], trailerPos[2]), GetVehiclePos(vehicletractorPos[0], tractorPos[1], tractorPos[2]);
            GetVehicleZAngle(trailertRot[0], tRot[1], tRot[2]), GetVehicleZAngle(vehicletractorRot[0], tractorRot[1], tractorRot[2]);
           
            distance 
3.0angle 180.0;
            X trailerPos[0] - (distance floatsin(-trailerRot[2]));
            Y trailerPos[1] - (distance floatcos(-trailerRot[2]));
            Z trailerPos[2];
            return 1;
        }
    }
    return 0;


Não funcionou infelizmente, mas agradeço pelo vosso tempo e sugestões. Vou tentar bolar alguma coisa


RE: Trailer - strelo - 26/08/2023

Pelo que entendi do seu problema, você está enfrentando dificuldades ao ajustar a detecção do porta-malas em um caminhão com trailer quando eles não estão alinhados em uma linha reta. Parece que o cálculo que você está usando não está produzindo os resultados desejados nessas situações.

O código que você compartilhou envolve cálculos de posição e ângulo para determinar a posição do porta-malas do veículo. No entanto, para lidar com situações em que o caminhão e o trailer estão em um ângulo, você precisará ajustar a lógica para calcular a posição corretamente.

Aqui estão algumas sugestões para abordar esse problema:

Considerar o ângulo do trailer: Além de calcular a posição do caminhão, você também precisa levar em consideração o ângulo do trailer. Isso pode envolver algum cálculo trigonométrico para determinar a posição correta do porta-malas em relação ao caminhão e ao ângulo do trailer.

Ponto de referência no trailer: Em vez de ajustar diretamente a posição do porta-malas com base no tamanho do veículo, você pode definir um ponto de referência no trailer que corresponda à posição do porta-malas. Isso poderia envolver definir coordenadas relativas dentro do trailer onde o porta-malas estaria.

Teste e ajuste: Pode ser necessário experimentar diferentes fórmulas de cálculo e ajustar os valores de multiplicação e adição para encontrar a lógica correta que funcione em todas as situações. Testar em diferentes cenários (ângulos, distâncias, etc.) ajudará a determinar o ajuste ideal.

Aqui está uma possível abordagem usando a segunda sugestão:
Código:
GetTrailerTrunkPosition(trailerid, &Float:x, &Float:y, &Float:z)
{
    // Defina as coordenadas relativas dentro do trailer onde o porta-malas estaria.
    new Float:trunkOffsetX = 0.0, Float:trunkOffsetY = -2.6, Float:trunkOffsetZ = 0.0;

    new Float:trailerPosX, Float:trailerPosY, Float:trailerPosZ;
    new Float:trailerAngle;

    GetVehiclePos(trailerid, trailerPosX, trailerPosY, trailerPosZ);
    GetVehicleZAngle(trailerid, trailerAngle);

    // Converta o ângulo do trailer para radianos.
    new Float:trailerAngleRad = trailerAngle * (pi / 180);

    // Calcule a posição do porta-malas com base no ponto de referência do trailer.
    x = trailerPosX + (trunkOffsetX * floatcos(trailerAngleRad)) - (trunkOffsetY * floatsin(trailerAngleRad));
    y = trailerPosY + (trunkOffsetX * floatsin(trailerAngleRad)) + (trunkOffsetY * floatcos(trailerAngleRad));
    z = trailerPosZ + trunkOffsetZ;
}


Lembre-se de que essa é apenas uma abordagem e pode ser necessário ajustar os valores e a lógica de acordo com as características específicas do jogo e das coordenadas que você está usando. 

Certifique-se de testar essa solução em várias situações para garantir que ela funcione corretamente em diferentes ângulos e cenários.