Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Получение GetForward (Решено)

  • Автор темы Автор темы qweme
  • Дата начала Дата начала
https://qweme.dev
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
166
Реакции
87
C++:
Expand Collapse Copy
float Length = 400;
float Angle = GameData.LocalHero->AbsRotation();
Vector AbsOrigin = GameData.LocalHero->AbsOrigin();
Vector Forward = { 0 ,0 , AbsOrigin.z };

Vector2D AbsPos2D;
Vector2D ForwardPos2D;
        
Forward.x = AbsOrigin.x + X;
Forward.y = AbsOrigin.y + X;

Draw.WorldToScreen(AbsOrigin, &AbsPos2D);
Draw.WorldToScreen(Forward, &ForwardPos2D);

Hooks.DXData.DrawList->AddText(16, ImVec2{ AbsPos2D.x, AbsPos2D.y+30 }, ImColor{0,0,0,255}, std::to_string(Angle).c_str());
Hooks.DXData.DrawList->AddLine(ImVec2{ AbsPos2D.x, AbsPos2D.y }, ImVec2{ ForwardPos2D.x, ForwardPos2D.y }, ImColor{ 0,0,0,255 }, 3);

1657153855572.png


Я НЕ ДРУЖУ С ГЕОМЕТРИЕЙ АААААА
Length это длинна лении которая мне нужна
Angle это QAngle


C++:
Expand Collapse Copy
class CGameSceneNode {
public:
    Vector AbsOrigin() {
        uintptr_t Addr = ((uintptr_t)this + Netvars::Offsets.m_vecAbsOrigin);
        return *(Vector*)Addr;
    };
    float AbsRotation() {
        uintptr_t Addr = ((uintptr_t)this + Netvars::Offsets.m_angAbsRotation);
        Vector Rotation = *(Vector*)Addr;
        return Rotation.y;
    }
};

По сути хочу просто рисовать койлы ипрочие приколы
 
В плюсах сильно не шарю, поэтому напишу, как это реализуется на питоне.

Как я понял, если поворот в твоем случае равен -2, то скорее всего - это радианы, если ошибаюсь, то прошу прощения.
В случае радиан, считается все довольно просто и банально:
Python:
Expand Collapse Copy
import math

length = 100 #радиус - длина линии
rad = 0.0 #угол поворота(радианы)

x = length * math.sin(rad)
y = length * math.sin(90*(math.pi/180) - rad)

Если это градусы, то считается чуть по другому:
Python:
Expand Collapse Copy
import math

length = 100 #радиус - длина линии
rad = 0 #угол поворота(градусы)

x = length * math.sin(math.radians(rad))
y = length * math.sin(math.radians(90 - rad))

Дальше не подскажу, т.к как трансформировать радианы в положение относительно экрана, я понятия не имею, поэтому смотри гайды по преобразованию матриц.

Вообще я бы посоветовал запрашивать угол поворота со скелета энтити у него значения от -180 до 180, т.е 360 и сразу идет относительно экрана - Skeleton - 0x310, Rotation - 0x110 (Float) (Смещение угла будет 90° прибавляй их к углу поворота)
 
Последнее редактирование:
если я правильно понял, то ты хочешь нарисовать линию длиной например 400 в направлении куда смотрит герой.
берешь форвард вектор(косинус ява, синус ява, 0), скейлишь(умножаешь все коорды) на 400 и прибавляешь к ориджину.
это л4д2, в доте может быть по-другому, но суть одна и та же. (это серверсайд скрипт нетвары другие немножко, тебе наверно абс ротейшн нужен будет на клиенте)
code_language.lua:
Expand Collapse Copy
local rotation = ent.GetNetPropVector("m_angRotation");
if(!rotation || typeof rotation != "Vector") return;

local pitch = ::Rework.Utility.DegreesToRadians(rotation.x);
local yaw = ::Rework.Utility.DegreesToRadians(rotation.y);
local roll = ::Rework.Utility.DegreesToRadians(rotation.z);

local movement_direction = Vector(cos(yaw), sin(yaw), 0);
ent.SetLocation(ent_loc + movement_direction.Scale(move));
вектор2 это просто угол умноженный на длину. угол из вектора достаётся путём нормализации(деление каждой координаты на длину вектора(длина это корень из суммы квадратов всех координат)). получается вектор длиной 1. такой вектор называется unit vector. его координаты это в идеале косинус и синус угла(ну в разных играх везде все разное в плане системы координат осей и прочей хуиты поэтому сам смотри конкретные детали). unit vector'ы потом можно использовать для кучи всякой весёлой хуйни(считать углы между векторами и тд и тп)
(с вектор3 там чуть чуть сложнее но дота практически вся 2д игра так что поебать на него)
на рисунке ось x(горизонтальная) это cos, ось y(вертикальная) это sin.
Unit-circle-768x714.png

еще есть такие понятия как питч яв ролл(это углы поворота по осям x y z ). QAngle именно их и хранит
Пожалуйста, авторизуйтесь для просмотра ссылки.
0rLuf.png

тебе нужен юнит вектор из ява твоего героя, потом ты просто умножаешь его на длину, а потом просто прибавляешь к ориджину и вот тебе точка.
ent.GetPosition() + ent.GetForward().Scale(400);
 
В плюсах сильно не шарю, поэтому напишу, как это реализуется на питоне.

Если это градусы, то считается чуть по другому:
Python:
Expand Collapse Copy
import math

length = 100 #радиус - длина линии
rad = 0 #угол поворота(градусы)

x = length * math.sin(math.radians(rad))
y = length * math.sin(math.radians(90 - rad))

Огромное спасибо
Впервые вижу умного питониста, похвально !

Пожалуйста, авторизуйтесь для просмотра ссылки.

Для тех кто хочет повторить мой успех
BaseEntity:
Expand Collapse Copy
class CBaseEntity {
public:
    Vector GetForward(int Length) {
        float Angle = this->AbsRotation();
        Vector AbsOrigin = this->AbsOrigin();
        Vector Forward = { 0 ,0 , AbsOrigin.z };

        float pi = static_cast<float>(3.14159265359);

        Forward.x = Length * sin(((90 - Angle) * (pi / 180)));
        Forward.y = Length * sin(((180 - Angle) * (pi / 180)));

        return AbsOrigin + Forward;
    }
    ...
};


Example:
Expand Collapse Copy
Vector2D AbsPos2D;
Vector2D ForwardPos2D;
Vector AbsOrigin = GameData.LocalHero->AbsOrigin();
Vector Forward = GameData.LocalHero->GetForward(450);

Draw.WorldToScreen(AbsOrigin, &AbsPos2D);
Draw.WorldToScreen(Forward, &ForwardPos2D);

Hooks.DXData.DrawList->AddLine(ImVec2{ AbsPos2D.x, AbsPos2D.y }, ImVec2{ ForwardPos2D.x, ForwardPos2D.y }, ImColor{ 0,0,0,255 }, 3);

Дальше не подскажу, т.к как трансформировать радианы в положение относительно экрана, я понятия не имею, поэтому смотри гайды по преобразованию матриц.

Могу тебе дать гайд как сделать W2S ->
Пожалуйста, авторизуйтесь для просмотра ссылки.
тебе только нужно найти оффсет для матрицы и все
 
Последнее редактирование:
Огромное спасибо
Впервые вижу умного питониста, похвально !

Пожалуйста, авторизуйтесь для просмотра ссылки.

Для тех кто хочет повторить мой успех
BaseEntity:
Expand Collapse Copy
class CBaseEntity {
public:
    Vector GetForward(int Length) {
        float Angle = this->AbsRotation();
        Vector AbsOrigin = this->AbsOrigin();
        Vector Forward = { 0 ,0 , AbsOrigin.z };

        float pi = static_cast<float>(3.14159265359);

        Forward.x = Length * sin(((90 - Angle) * (pi / 180)));
        Forward.y = Length * sin(((180 - Angle) * (pi / 180)));

        return AbsOrigin + Forward;
    }
    ...
};


Example:
Expand Collapse Copy
Vector2D AbsPos2D;
Vector2D ForwardPos2D;
Vector AbsOrigin = GameData.LocalHero->AbsOrigin();
Vector Forward = GameData.LocalHero->GetForward(450);

Draw.WorldToScreen(AbsOrigin, &AbsPos2D);
Draw.WorldToScreen(Forward, &ForwardPos2D);

Hooks.DXData.DrawList->AddLine(ImVec2{ AbsPos2D.x, AbsPos2D.y }, ImVec2{ ForwardPos2D.x, ForwardPos2D.y }, ImColor{ 0,0,0,255 }, 3);



Могу тебе дать гайд как сделать W2S ->
Пожалуйста, авторизуйтесь для просмотра ссылки.
тебе только нужно найти оффсет для матрицы и все
бля убери это пока ты окончательно не запутался
Пожалуйста, авторизуйтесь для просмотра ссылки.
sin(90 - α) = cos α
sin(180 - α) = sin α
Forward.x = Length * sin(((90 - Angle) * (pi / 180)));//не надо так делать
Forward.y = Length * sin(((180 - Angle) * (pi / 180)));//не надо так делать
превращается в ->
Forward.x = Length * cos(Angle * (pi / 180));
Forward.y = Length * sin(Angle * (pi / 180));
можно также сразу сделать класс QAngle потому что он тебе в любом случае потом еще понадобится.
и AbsRotation это не float. это QAngle. это ТРИ УГЛА.
также на будущее, если вдруг тебе нужен именно 3д вектор а не 2д(cos yaw sin yaw это 2д вектор), то нужно будет еще и питч(вертикальный поворот) учитывать
Пожалуйста, авторизуйтесь для просмотра ссылки.
C++:
Expand Collapse Copy
export
class QAngle
{
    float pitch_deg{};
    float yaw_deg{};
    float roll_deg{};
public:
    float GetPitch() const noexcept
    {
        return deg2rad(pitch_deg);
    }

    float GetYaw() const noexcept
    {
        return deg2rad(yaw_deg);
    }

    float GetRoll() const noexcept
    {
        return deg2rad(roll_deg);
    }
public:
    Vector3 GetForward() const noexcept
    {
        Vector3 result{};
        const auto pitch = GetPitch();
        const auto yaw = GetYaw();
        const auto cp = std::cosf(pitch);
        const auto sp = std::sinf(pitch);
        const auto cy = std::cosf(yaw);
        const auto sy = std::sinf(yaw);
        return { cp * cy, cp * sy, -sp };
    }
};
ngEMCVj.gif

C++:
Expand Collapse Copy
drawlist.AddLine(origin, origin + local_hero.GetRotation().GetForward().Scale(400), DxColors::Aqua);
drawlist.AddLine(origin, origin + local_hero.GetRotation().GetForward().XYProjection().Normalize().Scale(400), DxColors::HotPink);
также, зачем ты высоту умножаешь на два?
Vector Forward = { 0 ,0 , AbsOrigin.z };
...
return AbsOrigin + Forward;
это эквивалентно
AbsOrigin.x + Forward.x,
AbsOrigin.y + Forward.y,
AbsOrigin.z + Forward.z
а Forward.z то у тебя как раз равен AbsOrigin.z, в итоге получается AbsOrigin.z + AbsOrigin.z. иди фикси
 
бля убери это пока ты окончательно не запутался
Пожалуйста, авторизуйтесь для просмотра ссылки.
sin(90 - α) = cos α
sin(180 - α) = sin α
Forward.x = Length * sin(((90 - Angle) * (pi / 180)));//не надо так делать
Forward.y = Length * sin(((180 - Angle) * (pi / 180)));//не надо так делать
превращается в ->
Forward.x = Length * cos(Angle * (pi / 180));
Forward.y = Length * sin(Angle * (pi / 180));
можно также сразу сделать класс QAngle потому что он тебе в любом случае потом еще понадобится.
и AbsRotation это не float. это QAngle. это ТРИ УГЛА.
также на будущее, если вдруг тебе нужен именно 3д вектор а не 2д(cos yaw sin yaw это 2д вектор), то нужно будет еще и питч(вертикальный поворот) учитывать
Пожалуйста, авторизуйтесь для просмотра ссылки.
C++:
Expand Collapse Copy
export
class QAngle
{
    float pitch_deg{};
    float yaw_deg{};
    float roll_deg{};
public:
    float GetPitch() const noexcept
    {
        return deg2rad(pitch_deg);
    }

    float GetYaw() const noexcept
    {
        return deg2rad(yaw_deg);
    }

    float GetRoll() const noexcept
    {
        return deg2rad(roll_deg);
    }
public:
    Vector3 GetForward() const noexcept
    {
        Vector3 result{};
        const auto pitch = GetPitch();
        const auto yaw = GetYaw();
        const auto cp = std::cosf(pitch);
        const auto sp = std::sinf(pitch);
        const auto cy = std::cosf(yaw);
        const auto sy = std::sinf(yaw);
        return { cp * cy, cp * sy, -sp };
    }
};
ngEMCVj.gif

C++:
Expand Collapse Copy
drawlist.AddLine(origin, origin + local_hero.GetRotation().GetForward().Scale(400), DxColors::Aqua);
drawlist.AddLine(origin, origin + local_hero.GetRotation().GetForward().XYProjection().Normalize().Scale(400), DxColors::HotPink);
также, зачем ты высоту умножаешь на два?
Vector Forward = { 0 ,0 , AbsOrigin.z };
...
return AbsOrigin + Forward;
это эквивалентно
AbsOrigin.x + Forward.x,
AbsOrigin.y + Forward.y,
AbsOrigin.z + Forward.z
а Forward.z то у тебя как раз равен AbsOrigin.z, в итоге получается AbsOrigin.z + AbsOrigin.z. иди фикси
Про то что два раза прибавил z только потом понял
1657286641790.png


AbsRotation() у меня флоат потому что я читал тока y в нем
1657286791360.png


А так годно, да
 
Назад
Сверху Снизу