Вопрос Freestanding

Пользователь
Статус
Оффлайн
Регистрация
22 Июн 2020
Сообщения
188
Реакции[?]
72
Поинты[?]
44K
делаю фристенд (детект стен)
через цикл градусов от -180 до 180 (шаг 10) пускаю лучи в эти направления, ищу самый коротки луч > там и стена
но работает это только для некоторых стен (линии для визуализации сделал):

Снимок экрана 2021-06-25 171537.png
1624630562753.png
уже все маски для TraceRay перепробовал
C++:
float antiaim::Freestand() {
    float best_yaw = 361, min_distance = 101.f;
    Vector origin = g_LocalPlayer->GetOrigin() + g_LocalPlayer->GetViewOffset();
    for (int i = -180; i < 180; i += 10) {
        QAngle trace_angle = { 0, i, 0 };
        Vector direction;
        Utils::AngleVectors(trace_angle, direction);
        direction.NormalizeInPlace();
        Vector wall = origin + direction * 100;

        CGameTrace trace;
        CTraceFilter filter;
        Ray_t ray;
        filter.pSkip = (void*)g_LocalPlayer;

        ray.Init(origin, wall);

        I::Trace->TraceRay(ray, MASK_SHOT, &filter, &trace);

        if ((trace.endpos - trace.startpos).LengthSqr() < min_distance) {
            min_distance = (trace.endpos - trace.startpos).LengthSqr();
            best_yaw = i;
        }
        Vector2 start;
        Vector2 end;
        start = render::WorldToScreen(trace.startpos);
        end = render::WorldToScreen(trace.endpos);
        render::Line(start.x, start.y, end.x, end.y, 255, 255, 255, 255);
    }
    return best_yaw;
}
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
(trace.endpos - trace.startpos)
Сразу говорю я не эксперт, но trace.endpos указывает же в конечную точку, т.е. trace.startpos * (direction * 100).
Код:
Vector3 startpos; // 0000 начальная координата
Vector3 endpos; // 000C конечная координата
cplane_t plane; // 0018 нормаль поверхности при столкновении
float fraction; // 002C на сколько выполнено, 1.0f = не задели ничего
Поэтому похоже все лучи у тебя получаются одинаковой длины в (trace.endpos - trace.startpos).LengthSqr() и выбирается первый из них (+- погрешность float), если нужно узнать именно точку остановки трассировки то можно попробовать trace.startpos + ((trace.endpos - trace.startpos) * trace.fraction);
 
Пользователь
Статус
Оффлайн
Регистрация
22 Июн 2020
Сообщения
188
Реакции[?]
72
Поинты[?]
44K
Сразу говорю я не эксперт, но trace.endpos указывает же в конечную точку, т.е. trace.startpos * (direction * 100).
Код:
Vector3 startpos; // 0000 начальная координата
Vector3 endpos; // 000C конечная координата
cplane_t plane; // 0018 нормаль поверхности при столкновении
float fraction; // 002C на сколько выполнено, 1.0f = не задели ничего
Поэтому похоже все лучи у тебя получаются одинаковой длины в (trace.endpos - trace.startpos).LengthSqr() и выбирается первый из них (+- погрешность float), если нужно узнать именно точку остановки трассировки то можно попробовать trace.startpos + ((trace.endpos - trace.startpos) * trace.fraction);
но я же показал, на каких то поверхностях endpos работает корректно, а на каких то нет
 
Сверху Снизу