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

FurFur

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

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

Вот код:

PHP:
int TraceFailEye(int iEyeClient)
{
    float TRpos[3], TReye[3];
    GetClientEyeAngles(iEyeClient, TRpos);
    GetClientEyePosition(iEyeClient, TReye);
    TR_TraceRayFilter(TReye, TRpos, MASK_SOLID, RayType_Infinite, TraceEntityFilterPlayer, iEyeClient);
    if (TR_DidHit(null))
    {
        int iTrClient = TR_GetEntityIndex(null);
        if (iTrClient > 0 && iTrClient <= MaxClients) return iTrClient;
     
        float posn[3];
        GetClientAbsOrigin(iEyeClient, posn);
        TR_GetEndPosition(TReye, INVALID_HANDLE);
        float dist1 = GetVectorDistance(posn, TReye)
        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.0) posZ = 1;
            else if (posZ > 4.0) posZ = 4;
            float posz;
            switch (posZ)
            {
                case 1:
                {
                    if (dist2 > 1050.0) posz = 21.0;
                    else if (dist2 < 850.0) posz = 1.0;
                    else if (dist2 > 850.0 && dist2 < 1000.0) posz = 8.7;
                    else if (dist2 > 1000.0 && dist2 < 1050.0) posz = 11.0;
                }
                case 2:
                {
                    if (dist2 < 1420.0) posz = 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(posn, TReye, Sprite[0], 0, 0, 0, 0.8, 5.0, 5.0, 10, 0.0, {255, 255, 255, 255}, 0);
        TE_SendToAll(0.0);
    }
    return -1;
}
 
Последнее редактирование:

Reg1oxeN

Участник
Сообщения
403
Реакции
319
как-то так:

float forward[3];
float endpos[3];
GetAngleVectors(angles, forward, NULL_VECTOR, NULL_VECTOR);
ScaleVector(forward, 800.0);
AddVectors(startpos, forward, endpos);
 

tonline_kms65

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

FurFur

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

Да,короткий луч.

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