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

https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
C++:
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++:
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;
    }
};
По сути хочу просто рисовать койлы ипрочие приколы
 
Начинающий
Статус
Оффлайн
Регистрация
22 Янв 2019
Сообщения
8
Реакции[?]
2
Поинты[?]
0
В плюсах сильно не шарю, поэтому напишу, как это реализуется на питоне.

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

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

x = length * math.sin(rad)
y = length * math.sin(90*(math.pi/180) - rad)
Если это градусы, то считается чуть по другому:
Python:
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° прибавляй их к углу поворота)
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
если я правильно понял, то ты хочешь нарисовать линию длиной например 400 в направлении куда смотрит герой.
берешь форвард вектор(косинус ява, синус ява, 0), скейлишь(умножаешь все коорды) на 400 и прибавляешь к ориджину.
это л4д2, в доте может быть по-другому, но суть одна и та же. (это серверсайд скрипт нетвары другие немножко, тебе наверно абс ротейшн нужен будет на клиенте)
code_language.lua:
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);
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
В плюсах сильно не шарю, поэтому напишу, как это реализуется на питоне.

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

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

x = length * math.sin(math.radians(rad))
y = length * math.sin(math.radians(90 - rad))
Огромное спасибо
Впервые вижу умного питониста, похвально !

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

Для тех кто хочет повторить мой успех
BaseEntity:
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:
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 ->
Пожалуйста, авторизуйтесь для просмотра ссылки.
тебе только нужно найти оффсет для матрицы и все
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Огромное спасибо
Впервые вижу умного питониста, похвально !

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

Для тех кто хочет повторить мой успех
BaseEntity:
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:
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++:
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 };
    }
};

C++:
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. иди фикси
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
бля убери это пока ты окончательно не запутался
Пожалуйста, авторизуйтесь для просмотра ссылки.
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++:
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 };
    }
};

C++:
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

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