Получение экранных координат из 3d мира.

Gafask

Участник
Автор темы
137
13
Добрый день/вечер/ночь. 💤
Подскажите функцию или формулы.
Пишу External софт esp.
Задача получить экранные координаты обьекта из 3д мира не разу подобное не делал с 3д, только радар.
Не как не пойму, есть позиция x, y, z врага, позиция игрока x, y, z и угол поворота камеры x, z и можно fov найти. В планах рисовать к примеру квадрат на враге.
Подскажите пожалуйста. 🤔
 

teresen

Участник
29
18
Код:
Screen_X = (World_X - Player_X) / (angle_X * FOV) + (screen_width/2)

Screen_Y = (World_Y - Player_Y) / (angle_Z * FOV) + (screen_height/2)

Здесь World_X, World_Y - это координаты объекта в 3D-мире, Player_X, Player_Y - координаты игрока в 3D-мире, angle_X, angle_Z - угол поворота камеры, FOV - угол обзора, screen_width, screen_height - ширина и высота экрана.
P.S.
Если нужно подробнее, пишите. Не знаю ваш уровень :)
 
  • Нравится
  • Bug
Реакции: Gafask, kin4stat и Mintha

Gafask

Участник
Автор темы
137
13
Код:
Screen_X = (World_X - Player_X) / (angle_X * FOV) + (screen_width/2)

Screen_Y = (World_Y - Player_Y) / (angle_Z * FOV) + (screen_height/2)

Здесь World_X, World_Y - это координаты объекта в 3D-мире, Player_X, Player_Y - координаты игрока в 3D-мире, angle_X, angle_Z - угол поворота камеры, FOV - угол обзора, screen_width, screen_height - ширина и высота экрана.
P.S.
Если нужно подробнее, пишите. Не знаю ваш уровень :)
Cпасибо , позже проверю . Если что отпишу .
 

F0RQU1N and

Известный
1,307
497
Добрый день/вечер/ночь. 💤
Подскажите функцию или формулы.
Пишу External софт esp.

Задача получить экранные координаты обьекта из 3д мира не разу подобное не делал с 3д, только радар.
Не как не пойму, есть позиция x, y, z врага, позиция игрока x, y, z и угол поворота камеры x, z и можно fov найти. В планах рисовать к примеру квадрат на враге.
Подскажите пожалуйста. 🤔
ток тебе нужно матрицу игры найти
 

Gafask

Участник
Автор темы
137
13

horacy

Известный
102
92
Добрый день/вечер/ночь. 💤
Подскажите функцию или формулы.
Пишу External софт esp.

Задача получить экранные координаты обьекта из 3д мира не разу подобное не делал с 3д, только радар.
Не как не пойму, есть позиция x, y, z врага, позиция игрока x, y, z и угол поворота камеры x, z и можно fov найти. В планах рисовать к примеру квадрат на враге.
Подскажите пожалуйста. 🤔

Функция от s0beit, добавляем ее в прокси IDirect3DDevice9.cpp

C++:
    if (gta_menu_active())
        return;

    if (cheat_state->_generic.cheat_panic_enabled)
        return;
    
    if (!g_dwSAMP_Addr || !g_SAMP || !g_Players)
        return;

    if (!pGameInterface)
        return;

    if (isBadPtr_GTA_pPed(pPedSelf))
        return;           
            
            actor_info* player = getGTAPedFromSAMPPlayerID(id);
            actor_info* me = actor_info_get(ACTOR_SELF, NULL);

            if (!player)
                return;

            CPed* pPed = pGameInterface->GetPools()->GetPed((DWORD*)player);

            if (!pPed)
                return;

            float
                max_up_val = 0,
                max_down_val = 0,
                max_left_val = 0,
                max_right_val = 0;

            bool invalid = false;

            for (int bone_id = BONE_PELVIS1; bone_id <= BONE_RIGHTFOOT; ++bone_id)
            {
                if (bone_id >= BONE_PELVIS1 && bone_id <= BONE_HEAD ||
                    bone_id >= BONE_RIGHTUPPERTORSO && bone_id <= BONE_RIGHTTHUMB ||
                    bone_id >= BONE_LEFTUPPERTORSO && bone_id <= BONE_LEFTTHUMB ||
                    bone_id >= BONE_LEFTHIP && bone_id <= BONE_LEFTFOOT ||
                    bone_id >= BONE_RIGHTHIP && bone_id <= BONE_RIGHTFOOT)
                {
                    CVector bone;
                    pPed->GetBonePosition((eBone)bone_id, &bone);

                    D3DXVECTOR3 bone_pos;

                    bone_pos.x = bone.fX;
                    bone_pos.y = bone.fY;
                    bone_pos.z = bone.fZ;
                    D3DXVECTOR3 bone_screen_pos;
                    CalcScreenCoors(&bone_pos, &bone_screen_pos);

                    if (bone_screen_pos.z < 1.f)
                    {
                        invalid = true;
                        break;
                    }

                    if (!max_up_val && !max_down_val &&
                        !max_left_val && !max_right_val)
                    {
                        max_up_val = bone_screen_pos.y;
                        max_down_val = bone_screen_pos.y;
                        max_right_val = bone_screen_pos.x;
                        max_left_val = bone_screen_pos.x;
                    }

                    if (bone_screen_pos.y > max_up_val)
                        max_up_val = bone_screen_pos.y;

                    if (bone_screen_pos.y < max_down_val)
                        max_down_val = bone_screen_pos.y;

                    if (bone_screen_pos.x > max_right_val)
                        max_right_val = bone_screen_pos.x;

                    if (bone_screen_pos.x < max_left_val)
                        max_left_val = bone_screen_pos.x;
                }
            }

            if (!invalid)
            {
                float height_box = max_up_val - max_down_val;
                float widht_box = max_right_val - max_left_val;

                if (render)
                {
                    render->D3DBoxBorder(max_left_val, max_down_val, widht_box, height_box, D3DCOLOR_RGBA(0, 255, 0, 255), 0);
                }

            }
 
  • Bug
  • Нравится
Реакции: kin4stat и Gafask

Gafask

Участник
Автор темы
137
13
Код:
Screen_X = (World_X - Player_X) / (angle_X * FOV) + (screen_width/2)

Screen_Y = (World_Y - Player_Y) / (angle_Z * FOV) + (screen_height/2)

Здесь World_X, World_Y - это координаты объекта в 3D-мире, Player_X, Player_Y - координаты игрока в 3D-мире, angle_X, angle_Z - угол поворота камеры, FOV - угол обзора, screen_width, screen_height - ширина и высота экрана.
P.S.
Если нужно подробнее, пишите. Не знаю ваш уровень :)
Привет👋 , появилось несколько вопросов . angle_X = значение должно быть от 0.0f до 360.0f ? angle_Z(Y) = значение тут должно быть от 0 до 90 или от -90 до 90,центр 0 . По поводу FOV , FOV я так понял по стандарту в играх 90 , если не ошибаюсь FOV это угол обзора игрока он обычно о 0 до 360 🙄 ?
screen_width, screen_height - ширина и высота экрана, если окно в маленьком размере то я по логике могу же записывать в нее размер окна вместо размера экрана ? Где-то я читал что для еще нужно указывать позицию камеры в игровом мире , ну грубо говоря ее координаты .