Вопрос Вид от 3-его лица

Начинающий
Статус
Оффлайн
Регистрация
25 Фев 2023
Сообщения
6
Реакции[?]
0
Поинты[?]
0
У меня есть такой код для 3-его лица, но в нем есть проблема. Когда персонаж подходит к стене и поворачивает камеру в направлении от стены, то камера захватывает затикстурье. Собственно сам вопрос: как это можно исправить не получив рывков камеры и багов с руками?
C++:
#include "Hooks.h"
#include "../../utils/system/entities.h"
#include "../../utils/math/Math.h"

#define distance_ 100

void* __fastcall hooks::OverrideView::OverrideView(CViewRender* pViewRender, CViewSetup* pViewSetup, void* a3, void* a4, void* a5, void* a6)
{
    if (IsUninitialized)
        return Original(pViewRender, pViewSetup, a3, a4, a5, a6);

    pViewSetup->fov = 115;
    pViewSetup->viewmodelFov = 115;

    auto localPlayer = gEntities->GetLocalPlayerPawn();
    if (!localPlayer)
        return nullptr;

    auto CalculateCameraPosition = [](Vector anchorPos, float distance, Vector viewAngles) -> Vector {
        float yaw = DirectX::XMConvertToRadians(viewAngles.y);
        float pitch = DirectX::XMConvertToRadians(viewAngles.x);

        float x = anchorPos.x + distance * cosf(yaw) * cosf(pitch);
        float y = anchorPos.y + distance * sinf(yaw) * cosf(pitch);
        float z = anchorPos.z + distance * sinf(pitch);

        return Vector{ x, y, z };
        };

    Vector adjustedCamViewAngle = reinterpret_cast<CCSGOInput*>(gInterfaces->input)->vecViewAngle;
    adjustedCamViewAngle.x = -adjustedCamViewAngle.x;
    pViewSetup->origin = CalculateCameraPosition(localPlayer->GetEyePosition(), -distance_, adjustedCamViewAngle);

    Ray_t ray{};
    GameTrace_t trace{};
    TraceFilter_t filter{ 0x1C3003, localPlayer, NULL, 4 };

    if (gInterfaces->engineTrace->TraceShape(&ray, localPlayer->GetEyePosition(), pViewSetup->origin, &filter, &trace)) {
        if (trace.m_pHitEntity != nullptr) {
            pViewSetup->origin = trace.m_vecEndPos - trace.m_vecNormal * (- 7.0f);
        }
    }

    Vector p = Math::NormalizeAngles(Math::CalcAngle(pViewSetup->origin, localPlayer->GetEyePosition()));
    Math::Interpolate(p, p, 100);
    pViewSetup->angles = Vector{ p.x, p.y };

    return Original(pViewRender, pViewSetup, a3, a4, a5, a6);
}
 
Начинающий
Статус
Оффлайн
Регистрация
23 Авг 2023
Сообщения
45
Реакции[?]
6
Поинты[?]
6K
У меня есть такой код для 3-его лица, но в нем есть проблема. Когда персонаж подходит к стене и поворачивает камеру в направлении от стены, то камера захватывает затикстурье. Собственно сам вопрос: как это можно исправить не получив рывков камеры и багов с руками?
C++:
#include "Hooks.h"
#include "../../utils/system/entities.h"
#include "../../utils/math/Math.h"

#define distance_ 100

void* __fastcall hooks::OverrideView::OverrideView(CViewRender* pViewRender, CViewSetup* pViewSetup, void* a3, void* a4, void* a5, void* a6)
{
    if (IsUninitialized)
        return Original(pViewRender, pViewSetup, a3, a4, a5, a6);

    pViewSetup->fov = 115;
    pViewSetup->viewmodelFov = 115;

    auto localPlayer = gEntities->GetLocalPlayerPawn();
    if (!localPlayer)
        return nullptr;

    auto CalculateCameraPosition = [](Vector anchorPos, float distance, Vector viewAngles) -> Vector {
        float yaw = DirectX::XMConvertToRadians(viewAngles.y);
        float pitch = DirectX::XMConvertToRadians(viewAngles.x);

        float x = anchorPos.x + distance * cosf(yaw) * cosf(pitch);
        float y = anchorPos.y + distance * sinf(yaw) * cosf(pitch);
        float z = anchorPos.z + distance * sinf(pitch);

        return Vector{ x, y, z };
        };

    Vector adjustedCamViewAngle = reinterpret_cast<CCSGOInput*>(gInterfaces->input)->vecViewAngle;
    adjustedCamViewAngle.x = -adjustedCamViewAngle.x;
    pViewSetup->origin = CalculateCameraPosition(localPlayer->GetEyePosition(), -distance_, adjustedCamViewAngle);

    Ray_t ray{};
    GameTrace_t trace{};
    TraceFilter_t filter{ 0x1C3003, localPlayer, NULL, 4 };

    if (gInterfaces->engineTrace->TraceShape(&ray, localPlayer->GetEyePosition(), pViewSetup->origin, &filter, &trace)) {
        if (trace.m_pHitEntity != nullptr) {
            pViewSetup->origin = trace.m_vecEndPos - trace.m_vecNormal * (- 7.0f);
        }
    }

    Vector p = Math::NormalizeAngles(Math::CalcAngle(pViewSetup->origin, localPlayer->GetEyePosition()));
    Math::Interpolate(p, p, 100);
    pViewSetup->angles = Vector{ p.x, p.y };

    return Original(pViewRender, pViewSetup, a3, a4, a5, a6);
}
Как ты исправил эту проблему?

1733479307524.png
Игрок движется а камера нет
 
Начинающий
Статус
Оффлайн
Регистрация
25 Фев 2023
Сообщения
6
Реакции[?]
0
Поинты[?]
0
В каком плане не движется? Статична на карте или вокруг игрока ?
 
Начинающий
Статус
Оффлайн
Регистрация
23 Авг 2023
Сообщения
45
Реакции[?]
6
Поинты[?]
6K
В каком плане не движется? Статична на карте или вокруг игрока ?
вокруг игрока тоесть сам игрок движется а камера вокруг него нет все время в одном положении
Буду благодарен за ответ.

Я вероятно знаю решение твой проблемы
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
25 Фев 2023
Сообщения
6
Реакции[?]
0
Поинты[?]
0
вокруг игрока тоесть сам игрок движется а камера вокруг него нет все время в одном положении
Буду благодарен за ответ.

Я вероятно знаю решение твой проблемы
Все дело в строчке кода на позиции 46. Она отвечает за вращение камеры по новым векторам, грубо говоря это новые направления по которым движется камера вокруг игрока.
 
Начинающий
Статус
Оффлайн
Регистрация
23 Авг 2023
Сообщения
45
Реакции[?]
6
Поинты[?]
6K
Все дело в строчке кода на позиции 46. Она отвечает за вращение камеры по новым векторам, грубо говоря это новые направления по которым движется камера вокруг игрока.
а что является angles можешь скинуть свой ViewSetup и какой Interpolate

class CViewSetup
{
public:
unsigned char pad0[0x490];
float flOrthoLeft; // 0x0494
float flOrthoTop; // 0x0498
float flOrthoRight; // 0x049C
float flOrthoBottom; // 0x04A0
unsigned char pad1[0x38];
float flFov; // 0x04D8
float flFovViewmodel; // 0x04DC
Vector_t vecOrigin; // 0x04E0
unsigned char pad2[0xC]; // 0x04EC
Vector_t angView; // 0x04F8
unsigned char pad3[0x14]; // 0x0504
float flAspectRatio; // 0x0518
unsigned char pad4[0x71];
BYTE nSomeFlags;
};

Вот мой но почемуто камера не вертится
а что является angles можешь скинуть свой ViewSetup и какой Interpolate

class CViewSetup
{
public:
unsigned char pad0[0x490];
float flOrthoLeft; // 0x0494
float flOrthoTop; // 0x0498
float flOrthoRight; // 0x049C
float flOrthoBottom; // 0x04A0
unsigned char pad1[0x38];
float flFov; // 0x04D8
float flFovViewmodel; // 0x04DC
Vector_t vecOrigin; // 0x04E0
unsigned char pad2[0xC]; // 0x04EC
Vector_t angView; // 0x04F8
unsigned char pad3[0x14]; // 0x0504
float flAspectRatio; // 0x0518
unsigned char pad4[0x71];
BYTE nSomeFlags;
};

Вот мой но почемуто камера не вертится
не знаешь ли ты в чем у меня проблема и почему камера не двигается
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
25 Мар 2021
Сообщения
186
Реакции[?]
73
Поинты[?]
31K
У меня есть такой код для 3-его лица, но в нем есть проблема. Когда персонаж подходит к стене и поворачивает камеру в направлении от стены, то камера захватывает затикстурье. Собственно сам вопрос: как это можно исправить не получив рывков камеры и багов с руками?
C++:
#include "Hooks.h"
#include "../../utils/system/entities.h"
#include "../../utils/math/Math.h"

#define distance_ 100

void* __fastcall hooks::OverrideView::OverrideView(CViewRender* pViewRender, CViewSetup* pViewSetup, void* a3, void* a4, void* a5, void* a6)
{
    if (IsUninitialized)
        return Original(pViewRender, pViewSetup, a3, a4, a5, a6);

    pViewSetup->fov = 115;
    pViewSetup->viewmodelFov = 115;

    auto localPlayer = gEntities->GetLocalPlayerPawn();
    if (!localPlayer)
        return nullptr;

    auto CalculateCameraPosition = [](Vector anchorPos, float distance, Vector viewAngles) -> Vector {
        float yaw = DirectX::XMConvertToRadians(viewAngles.y);
        float pitch = DirectX::XMConvertToRadians(viewAngles.x);

        float x = anchorPos.x + distance * cosf(yaw) * cosf(pitch);
        float y = anchorPos.y + distance * sinf(yaw) * cosf(pitch);
        float z = anchorPos.z + distance * sinf(pitch);

        return Vector{ x, y, z };
        };

    Vector adjustedCamViewAngle = reinterpret_cast<CCSGOInput*>(gInterfaces->input)->vecViewAngle;
    adjustedCamViewAngle.x = -adjustedCamViewAngle.x;
    pViewSetup->origin = CalculateCameraPosition(localPlayer->GetEyePosition(), -distance_, adjustedCamViewAngle);

    Ray_t ray{};
    GameTrace_t trace{};
    TraceFilter_t filter{ 0x1C3003, localPlayer, NULL, 4 };

    if (gInterfaces->engineTrace->TraceShape(&ray, localPlayer->GetEyePosition(), pViewSetup->origin, &filter, &trace)) {
        if (trace.m_pHitEntity != nullptr) {
            pViewSetup->origin = trace.m_vecEndPos - trace.m_vecNormal * (- 7.0f);
        }
    }

    Vector p = Math::NormalizeAngles(Math::CalcAngle(pViewSetup->origin, localPlayer->GetEyePosition()));
    Math::Interpolate(p, p, 100);
    pViewSetup->angles = Vector{ p.x, p.y };

    return Original(pViewRender, pViewSetup, a3, a4, a5, a6);
}
тут дебажить надо, смотреть чё да как, мб вьюангл говно
 
Начинающий
Статус
Оффлайн
Регистрация
25 Фев 2023
Сообщения
6
Реакции[?]
0
Поинты[?]
0
Начинающий
Статус
Оффлайн
Регистрация
23 Авг 2023
Сообщения
45
Реакции[?]
6
Поинты[?]
6K
Окей, а есть каких-либо общие советы к этой проблеме если именно решения нет?
Да есть вероятность решения получения нормально положения глаз и уже написать отдельную функцию GetEyePosThirdPerson в которой при получение ты добавляешь уже к самому x расстояние камеры точно также чтобы она двигалась нормальна либо же чисто обновить xyz на регуляре и смотреть от поворотов мышки данная проблема похоже на thirdpersonMaymode когда тупо не можешь двигать камерой можно покопатся в коде dll и посмотреть ее работу и понять что мы так делаем неправильно с камерой НО ОТВЕТ ЛЕГКИЙ ЛЕНИВО!
 
Сверху Снизу