[РЕШЕНО] Луч на определенное расстояние

Тема в разделе "Программирование / Скриптинг", создана пользователем Крабос, 15 окт 2016.

  1. Крабос

    Крабос

    Сообщения:
    45
    Симпатии:
    21
    Как можно нарисовать луч (TE_SetupBeamPoints) между двумя точками с определенной длинной? (например 800.0 - требуемая длинна луча),если первая точка это позиция игрока,а вторая точка это координаты его прицела?

    Если делать вектор,то определенным способом это получается делать,но конечная точка поднимается слишком высоко,либо опускается(зависит от конечного расстояния второй точки). Это фиксилось определенными расчетами,но все равно как то не то. Можно ли это все сделать как то проще?

    Вот код:

    PHP:
    int TraceFailEye(int iEyeClient)
    {
        
    float TRpos[3], TReye[3];
        
    GetClientEyeAngles(iEyeClientTRpos);
        
    GetClientEyePosition(iEyeClientTReye);
        
    TR_TraceRayFilter(TReyeTRposMASK_SOLIDRayType_InfiniteTraceEntityFilterPlayeriEyeClient);
        if (
    TR_DidHit(null))
        {
            
    int iTrClient TR_GetEntityIndex(null);
            if (
    iTrClient && iTrClient <= MaxClients) return iTrClient;
         
            
    float posn[3];
            
    GetClientAbsOrigin(iEyeClientposn);
            
    TR_GetEndPosition(TReyeINVALID_HANDLE);
            
    float dist1 GetVectorDistance(posnTReye)
            if (
    dist1 800.0)
            {
                
    float dist2 SquareRoot(Pow(TReye[0] - posn[0], 2.0) + Pow(TReye[1] - posn[1], 2.0));
                
    TReye[0] = posn[0] + Cosine(DegToRad(TRpos[1])) * 800.0;
                
    TReye[1] = posn[1] + Sine(DegToRad(TRpos[1])) * 800.0;
                
    float posZ RoundFloat((dist2 800.0) / 350.0);
                if (
    posZ 1.0posZ 1;
                else if (
    posZ 4.0posZ 4;
                
    float posz;
                switch (
    posZ)
                {
                    case 
    1:
                    {
                        if (
    dist2 1050.0posz 21.0;
                        else if (
    dist2 850.0posz 1.0;
                        else if (
    dist2 850.0 && dist2 1000.0posz 8.7;
                        else if (
    dist2 1000.0 && dist2 1050.0posz 11.0;
                    }
                    case 
    2:
                    {
                        if (
    dist2 1420.0posz 13.0;
                        else 
    posz 15.0;
                    }
                    case 
    4:
                        
    posz 10.0;
                    default:
                        
    posz 11.3;
                }
                
    TReye[2] = posn[2] + (800.0 * (TReye[2] - posn[2]) / dist2) + posz posZ;
            }
            
    posn[2] += 43.0;
            
    TE_SetupBeamPoints(posnTReyeSprite[0], 0000.85.05.0100.0, {255255255255}, 0);
            
    TE_SendToAll(0.0);
        }
        return -
    1;
    }
     
    Последнее редактирование: 15 окт 2016
    666FoX666 нравится это.
  2. Reg1oxeN

    Reg1oxeN

    Сообщения:
    84
    Симпатии:
    26
    как-то так:

    float forward[3];
    float endpos[3];
    GetAngleVectors(angles, forward, NULL_VECTOR, NULL_VECTOR);
    ScaleVector(forward, 800.0);
    AddVectors(startpos, forward, endpos);
     
    Крабос нравится это.
  3. Крабос

    Крабос

    Сообщения:
    45
    Симпатии:
    21
    Работает,спасибо
     
  4. tonline_kms65

    tonline_kms65 Read Only

    Сообщения:
    77
    Симпатии:
    10
    @Крабос,
    Я даже обомлел. Ты как такой код накатать умудрился?
    Я понял так - определил ты конечную точку. Но для чего такая куча вычислений?
    Просто интересно. Ты хотел сделать луч, который заканчивается не на стене а в воздухе (не доходя до стены)?
    Что то типа короткого лазерного луча?
     
  5. Крабос

    Крабос

    Сообщения:
    45
    Симпатии:
    21
    Да,короткий луч.

    Без этих вычислений конечная обрезанная точка всегда была либо слишком высоко,либо слишком низко.
    Но главное все работало так как нужно :smoke: