Гайд Расчет дистанции до противника | Distance to enemy calc

Начинающий
Статус
Оффлайн
Регистрация
27 Дек 2022
Сообщения
24
Реакции[?]
13
Поинты[?]
13K
Продолжаем, пока-что пройдёмся по лайту. Сегодня расчет дистанции до противника
Для этого нам нужно:

Ну ёмаё, во первых - класс 3д вектора с функцией расчета дистанции в 3д пространстве:
C++:
struct vec3 {
    float x, y, z;

    vec3()                                : x(0), y(0), z(0) {};
    vec3(float _x, float _y, float _z)    : x(_x), y(_y), z(_z) {};

    float distance(vec3 Pos) {
        return sqrtf(powf(Pos.x - x, 2) + powf(Pos.y - y, 2) + powf(Pos.z - z, 2));
    }
};

Далее - актуальные позиции локального игрока и вашего енеми, надеюсь вы успели спастить getboneposition с асфиксии:
Кстати индекс костей можете найти тут
C++:
vec3 local_pos = local.pawn.get_bone_position(BONE_HEAD);
vec3 player_pos = player.pawn.get_bone_position(BONE_HEAD);

Подготовьте ваши извилины, потому что далее будут махинации, но не пугайтесь, это не на долго:
C++:
float distance = local_pos.distance(player_pos); //Расчитываем расстояние в 3д пространстве
distance = distance / 100.f; //А тут вы можете ахуеть, но еденицы измерения
//                            что делают ваши вот эти каэсы не совпадает с тем чем вы меряете свой член
Кстати, я Русский :ru:
 
Участник
Статус
Оффлайн
Регистрация
16 Июн 2017
Сообщения
825
Реакции[?]
179
Поинты[?]
2K
ты уж совсем для долбоебов если делаешь, то и добавь это:
Код:
char buf[256];
sprintf_s(buf, "%d", distance);
ImGui::GetBackgroundDrawList()->AddText(pos, IM_COL32(255, 255, 255, 255), "%d FT", buf);
 
Пользователь
Статус
Оффлайн
Регистрация
22 Июн 2020
Сообщения
183
Реакции[?]
69
Поинты[?]
37K
Ну и зачем эта кринжа на форуме с использованием powf чтоб ФПС побольше дропался. Ну если так хочешь полезное написать, ну хоть бы функцию быстрого квадратного корня дал
 
Начинающий
Статус
Оффлайн
Регистрация
27 Дек 2022
Сообщения
24
Реакции[?]
13
Поинты[?]
13K
ты уж совсем для долбоебов если делаешь, то и добавь это:
Код:
char buf[256];
sprintf_s(buf, "%d", distance);
ImGui::GetBackgroundDrawList()->AddText(pos, IM_COL32(255, 255, 255, 255), "%d FT", buf);
:whyRly:
Ну и зачем эта кринжа на форуме с использованием powf чтоб ФПС побольше бросался. Ну если так хочешь полезное написать, ну хоть бы функцию быстрого квадратного корня дал
О великий повелитель оптимизации допотопных высокоуровневых вычислений, извольте приклонить перед вами мою тупую бошку и извиниться
Ты думал я так напишу? За критику и обоснование оной спасибо, я переработаю кодик. А вот с уважением в твоей ситуации я бы ещё поработал
 
Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,417
Реакции[?]
656
Поинты[?]
15K
Следующий гайд о GetDistanceFromCenter.
Можешь так-то слить целиком сдк, а уже в следующем гайде целиком ентити класс
 
Начинающий
Статус
Оффлайн
Регистрация
31 Мар 2024
Сообщения
52
Реакции[?]
12
Поинты[?]
13K
ты уж совсем для долбоебов если делаешь, то и добавь это:
Код:
char buf[256];
sprintf_s(buf, "%d", distance);
ImGui::GetBackgroundDrawList()->AddText(pos, IM_COL32(255, 255, 255, 255), "%d FT", buf);
Ты же ну в курсе что твой код не отработает

Во первых:
C++:
char buf[256];
sprintf_s(buf, "%d FT", distance);
ImGui::GetBackgroundDrawList()->AddText(pos, IM_COL32(255, 255, 255, 255), buf);
Но мы живем во время, когда уже придумали 20 плюсы:
C++:
auto const distance = std::format("{} FT", distance);

ImGui::GetBackgroundDrawList()->AddText(pos, IM_COL32(255, 255, 255, 255), buf.c_str());
 
Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,417
Реакции[?]
656
Поинты[?]
15K
C++:
vec3 local_pos = local.pawn.get_bone_position(BONE_HEAD);
vec3 player_pos = player.pawn.get_bone_position(BONE_HEAD);
К тому же зачем использовать позицию костей (хз как она в в вашем асфикси реализована) если можно заюзать так
C++:
Vector3 getOriginPoistion() {
            return Memory::Read<Vector3>(Entity + NetVar::m_vOldOrigin);
        }
Или расчет идет на то что какому-то еблану понадобиться рассчитать расстояния от левого пальца руки игрока до левого мизинца правой ноги ентити?
 
Начинающий
Статус
Оффлайн
Регистрация
27 Дек 2022
Сообщения
24
Реакции[?]
13
Поинты[?]
13K
C++:
vec3 local_pos = local.pawn.get_bone_position(BONE_HEAD);
vec3 player_pos = player.pawn.get_bone_position(BONE_HEAD);
К тому же зачем использовать позицию костей (хз как она в в вашем асфикси реализована) если можно заюзать так
C++:
Vector3 getOriginPoistion() {
            return Memory::Read<Vector3>(Entity + NetVar::m_vOldOrigin);
        }
Или расчет идет на то что какому-то еблану понадобиться рассчитать расстояния от левого пальца руки игрока до левого мизинца правой ноги ентити?
Нет, погрешность между любой частью тела и origin не превышает 1 метра так что можно использовать любой способ получения позиции
 
Пользователь
Статус
Оффлайн
Регистрация
25 Мар 2021
Сообщения
149
Реакции[?]
68
Поинты[?]
25K
:whyRly:

О великий повелитель оптимизации допотопных высокоуровневых вычислений, извольте приклонить перед вами мою тупую бошку и извиниться
Ты думал я так напишу? За критику и обоснование оной спасибо, я переработаю кодик. А вот с уважением в твоей ситуации я бы ещё поработал
какое уважение парень, ты выкладываешь какую то хуетень, в которой сам разобраться не можешь
C++:
double fastSqrt(double number, double tolerance = 1e-7) {    double x = number;    double root;        while (true) {        root = 0.5 * (x + number / x);        if (std::abs(root - x) < tolerance)            break;        x = root;    }        return root; }
можешь использовать это вместо sqrt если точность не так важна
 
Начинающий
Статус
Оффлайн
Регистрация
27 Дек 2022
Сообщения
24
Реакции[?]
13
Поинты[?]
13K
какое уважение парень, ты выкладываешь какую то хуетень, в которой сам разобраться не можешь
C++:
double fastSqrt(double number, double tolerance = 1e-7) {    double x = number;    double root;        while (true) {        root = 0.5 * (x + number / x);        if (std::abs(root - x) < tolerance)            break;        x = root;    }        return root; }
можешь использовать это вместо sqrt если точность не так важна
можешь использовать это вместо
:roflanEbalo:


акое уважение парень
спасибо за уважение, парень
 
Участник
Статус
Оффлайн
Регистрация
16 Июн 2017
Сообщения
825
Реакции[?]
179
Поинты[?]
2K
Ты же ну в курсе что твой код не отработает

Во первых:
C++:
char buf[256];
sprintf_s(buf, "%d FT", distance);
ImGui::GetBackgroundDrawList()->AddText(pos, IM_COL32(255, 255, 255, 255), buf);
Но мы живем во время, когда уже придумали 20 плюсы:
C++:
auto const distance = std::format("{} FT", distance);

ImGui::GetBackgroundDrawList()->AddText(pos, IM_COL32(255, 255, 255, 255), buf.c_str());
в курсе, при дефолтном имгуи рендере, я просто как пример написал
 
Пользователь
Статус
Оффлайн
Регистрация
22 Июн 2020
Сообщения
183
Реакции[?]
69
Поинты[?]
37K
C++:
double fastSqrt(double number, double tolerance = 1e-7) { double x = number; double root; while (true) { root = 0.5 * (x + number / x); if (std::abs(root - x) < tolerance) break; x = root; } return root; }
можешь использовать это вместо sqrt если точность не так важна
Можно ещё быстрее сделать
 
Разработчик
Статус
Оффлайн
Регистрация
1 Сен 2018
Сообщения
1,595
Реакции[?]
875
Поинты[?]
114K
Ну и зачем эта кринжа на форуме с использованием powf чтоб ФПС побольше дропался. Ну если так хочешь полезное написать, ну хоть бы функцию быстрого квадратного корня дал
какое уважение парень, ты выкладываешь какую то хуетень, в которой сам разобраться не можешь
C++:
double fastSqrt(double number, double tolerance = 1e-7) {    double x = number;    double root;        while (true) {        root = 0.5 * (x + number / x);        if (std::abs(root - x) < tolerance)            break;        x = root;    }        return root; }
можешь использовать это вместо sqrt если точность не так важна
Ну надо же, какие люди! Два математических гения обсуждают оптимизацию.

х64 инструкция sqrt (и её аналоги для разных типов данных) выполняется собственно на аппаратном уровне. CPU имеют dedicated hardware units ( специально спроектированные для быстрого вычисления квадратного корня ), поэтому никакие программные реализации, будь то метод Ньютона, квейковский трюк или что-то ещё никогда не обгонят по скорости встроенную sqrt.

А насчёт powf проблема явно преувеличена, вряд ли вызов powf для возведения в квадрат дропает фпс. Современные компиляторы достаточно умны, чтобы заменить powf(x, 2) на x * x, но даже, если компилятор этого не сделает разница в производительности вряд ли будет заметна на фоне других вещей
Но имхо использовать powf(x, 2) вместо x * x - плохая практика, так как это сложнее, менее читабельно, и в редких случаях медленнее


В данном случае лучшая оптимизация – это отсутствие "оптимизации".
По моему можно вообще на видяхе такое вычеслять но не уверен, cuda math api
CUDA ядра это круто, модно все дела, но они про другое. Задержка на передачу данных туда-сюда сожрет весь профит. GPU – для больших массивов данных, а тут CPU быстрее справится ( намного, в сотни раз, может и больше )
 
Начинающий
Статус
Оффлайн
Регистрация
27 Дек 2022
Сообщения
24
Реакции[?]
13
Поинты[?]
13K
Ну надо же, какие люди! Два математических гения обсуждают оптимизацию.

х64 инструкция sqrt (и её аналоги для разных типов данных) выполняется собственно на аппаратном уровне. CPU имеют dedicated hardware units ( специально спроектированные для быстрого вычисления квадратного корня ), поэтому никакие программные реализации, будь то метод Ньютона, квейковский трюк или что-то ещё никогда не обгонят по скорости встроенную sqrt.

А насчёт powf проблема явно преувеличена, вряд ли вызов powf для возведения в квадрат дропает фпс. Современные компиляторы достаточно умны, чтобы заменить powf(x, 2) на x * x, но даже, если компилятор этого не сделает разница в производительности вряд ли будет заметна на фоне других вещей
Но имхо использовать powf(x, 2) вместо x * x - плохая практика, так как это сложнее, менее читабельно, и в редких случаях медленнее


В данном случае лучшая оптимизация – это отсутствие "оптимизации".

CUDA ядра это круто, модно все дела, но они про другое. Задержка на передачу данных туда-сюда сожрет весь профит. GPU – для больших массивов данных, а тут CPU быстрее справится ( намного, в сотни раз, может и больше )
Конструктивно, практично, без агрессии.

Я уже на две трети тебя люблю, лайк👍
 
Пользователь
Статус
Оффлайн
Регистрация
22 Июн 2020
Сообщения
183
Реакции[?]
69
Поинты[?]
37K
Современные компиляторы достаточно умны, чтобы заменить powf(x, 2) на x * x
Надеюсь. А вот насчёт корня не согласен. Проводил замеры, быстрый квадратный корень оказался примерно в 2 раза быстрее чем std::sqrtf (x64 msvc release build). Проведу ещё раз, проверю, может я ошибся
 
              ru p2cs > all                      
Разработчик
Статус
Оффлайн
Регистрация
19 Авг 2016
Сообщения
1,578
Реакции[?]
1,961
Поинты[?]
131K
бля вы бы еще оптимизацию sqrtf с квейка 3 взяли гении...
у вас процы давно развитились так, что оптимизации такого уровня тупо не нужны нахрен...

но вы продолжайте, за этим весело наблюдать
 
Тьомчик
Пользователь
Статус
Оффлайн
Регистрация
30 Июн 2020
Сообщения
698
Реакции[?]
148
Поинты[?]
56K
бля вы бы еще оптимизацию sqrtf с квейка 3 взяли гении...
у вас процы давно развитились так, что оптимизации такого уровня тупо не нужны нахрен...

но вы продолжайте, за этим весело наблюдать
время идёт, а они так и остались в 90-х :roflanPominki:
 
Сверху Снизу